4章サーバー用アプリの世界
サーバー用のアプリ(プログラム)はどうやって作るの?
サーバー用のアプリとは?
サーバーにもアプリ開発があるんだけど、どうやって作ると思う?
サーバー用のアプリ? 想像もつかないなー。クライアントアプリと同じじゃないの?
プログラミング言語を使うという点だけは同じだけど、違うところがたくさんあるんだよ
そもそもサーバー用アプリって意味がわからない。クライアントじゃないアプリってあるの?
アプリという言葉はOS以外のプログラムを指すため、サーバー側にもアプリはあります。Twitterなら「Twitterのサービスを提供するアプリ」、YouTubeなら「YouTubeのサービスを提供するアプリ」という具合です。クライアントアプリとの最大の違いは、人間を直接相手にするのではなく、人間が操作するクライアントアプリを相手にするという点です。サーバー側のアプリとクライアント側のアプリが連携して、1つのサービスを提供します。
サーバー用アプリを開発することを、「サーバー側のプログラムを作る」という意味で、サーバーサイドプログラミングと呼びます。
サーバーサイドプログラミングの特徴の1つに、プログラミング言語の選択の幅が広いという点があります。クライアントアプリはAPIが複雑なので、それらをサポートするプログラミング言語しか使えません。サーバサイドの場合はクライアントに応答できればいいので制約が少なく、理屈の上では何を使ってもいいのです。
サーバーサイドで使われる言語には、Java(ジャバ)、Ruby(ルビー)、PHP(ピーエッチピー)、Perl(パール)、Python(パイソン)、Go(ゴー)、Rust(ラスト)、C(シー)、Scala(スカーラ)などがあります。
こんなに覚えられないってば!
だから全部覚えなくてもいいんだってば! 1つで十分だよ。いろいろ挙げたけど、実際の現場ではJava、Ruby、PHPの需要が多いようだよ
ミドルウェアも使う
また、OSとアプリ以外に、その間に位置づけされるミドルウェアというプログラムを使用します。ミドルウェアの代表的なものは、Webサーバープログラムとデータベースサーバープログラムです。どちらもほとんどのサービスで必要な機能なので、既存のプログラムがあり、それをインストールして使用します。
WebサーバーではApache(アパッチ)やnginx(エンジンエックス)、データベースサーバーではMySQL(マイエスキューエル)やPostgreSQL(ポストグレスキューエル)が有名です。これらについては、以降で詳しく説明します。
ミドルウェアはOSじゃないんだからアプリじゃないの?
厳密にいえばミドルウェアもアプリだよ。だけど、その上に独自のアプリを構築するから、OSとアプリの間(ミドル)という意味でミドルウェアと呼ぶんだ
静的サイトと動的サイト
ミドルウェアの説明に入る前に、それらがどう組み合わさって動くのかを説明しよう。通常のWebサイトの場合、Webサーバーは単体で動いている
通常のWebサイトの場合、クライアントつまりWebブラウザから「http://example.com/title.html
」のようなURLを受け取り、Webサーバーはストレージ(HDDなどの記憶装置)に保存されているWebページのデータを返します。単純に求められたデータを返すだけです。ですから、ストレージに保存されたデータが書き換えられない限り、Webページの内容が変わることはありません。これを静的(Static)サイトといいます。
Webアプリの場合、ここにアプリサーバーとデータベースサーバーが加わります。クライアントから届いた要求はWebサーバーからアプリサーバーに渡されます。アプリサーバーはデータベースサーバーとやり取りしながら返答のデータを作り出し、それをWebサーバーを介してクライアントに渡します。アプリサーバーが返す応答は、状況に応じて変化します。そのため動的(Dynamic)サイトといいます。
あれ? サーバー用アプリの話じゃなかったの? どこからサイトの話に変わったの?
Webベースのシステムの場合、アプリとサイトに明確な違いはないんだ。違うのは、返ってくるデータが固定されている(静的)か、状況によって変わる(動的)かという点だけだ
中は違うけど、外から見ると同じってことかしら?
そういうこと。では、次はWebサーバーとデータベースサーバーについて説明していこう
WebサーバーとHTTP
サーバーアプリがWebサーバーを必要とする理由
Webサーバーは、Webページを表示する仕組みを提供するミドルウェアだ
なんでWebサーバーがサーバーアプリの開発に必要なの? データベースならわかるけど
だよね。Webページ作りたいわけじゃないし
それはね、現在のサービスの多くが、HTTPというWeb用の通信方式を使っているからなんだ
WebサーバーはWebブラウザからの要求を受けて、Webページのデータを返すプログラムです。WebサーバーとWebブラウザの間で使われる通信方式を、HTTP(HyperText Transfer Protocol)といいます。WebページのデータはHTML(HyperText Markup Language)という言語で記述しますが、それを転送するための決まりごとがHTTPなのですね。
WebブラウザからWebサーバーに対して「このWebページのデータがほしい」と要求することをHTTPリクエスト、WebサーバーからWebブラウザへの返答データをHTTPレスポンスと呼びます。
これがなぜサーバーアプリの開発に必要なのかというと、サーバーアプリとクライアントアプリ間の通信にHTTPを使うことが多いからです。HTTPはHTMLだけでなくさまざまな形式のデータを送ることができます。また、他の通信方式に比べてシンプルなので、応用しやすいという特徴もあります。
そういう理由で、サーバーアプリはWebサーバーを使うことが多いのです。
ふーん、Webクライアントを作りたいからWebサーバーを使うってわけじゃないのね
もちろん、Webクライアントが作れることも理由の1つだよ。とにかくHTTPを使っておけば、通信周りをWebサーバーに任せられるから楽なんだよね
暗号化されたHTTPS
HTTPの通信を暗号化したものをHTTPSといいます。暗号化されているので、通信途中のデータを盗み見られることがありません。現在、Webサイトの大半はHTTPからHTTPSに切り替わっています。HTTPとHTTPSの違いは主に暗号化されていることだけで、やりとりの基本的な決まりは変わりありません。
HTMLとプログラムの違い
Webサーバーが必要なところがわかったところで、HTMLとプログラムは何が違うのかを見てみよう
HTMLはWebページのデータなのよね
そう。HTMLというデータ記述言語で書かれたテキストファイルで、それをWebブラウザで読み込むとWebページになるんだ
先ほども簡単に説明しましたが、HTMLはHyperText Markup Language(ハイパーテキストマークアップランゲージ)というデータ記述言語、もしくはHTMLで書いたデータのことを指します。HTMLは、テキストの中に< >で囲まれたタグという指示を埋め込んだものです。
簡単なHTMLの例を見てみましょう。<h1>
と</h1>
で囲まれた部分が見出し(Header)となり、大きく目立つ文字で表示されます。<p>
と</p>
で囲まれた部分は段落(Paragraph)となり、標準サイズの文字として表示されます。
<h1>ようこそ HTMLへ!</h1>
<p>このページを作成したのは、2020/09/08の13:52です。</p>
Webサーバーを立ち上げて、WebブラウザでHTMLファイルを読み込むとこうなる
ふーん。よくわからないけど、HTMLファイルに書いたことがWebページとして表示されているみたいだね
そうだね。それじゃ、このWebページをリロード(再読み込み)してみてくれるかな
リロードボタンを押して……。何も変わらないよ
それで正常。HTMLファイルの内容を書き換えない限り、表示されるWebページも変わらない。これが前に説明した静的サイトだ
変わらないから「静か~」ってことなのね
次はPHPというプログラミング言語で書いたサーバー向けプログラムを見てみよう
PHPはサーバー用のプログラミング言語の1つで、HTMLと混ぜて書けるという特徴を持ち、Webアプリ入門者にも人気があります。PHPで作られた有名なアプリにブログシステムのWordPressがあります。
次のサンプルプログラムでは、<?php
~?>
で囲まれた3行がPHPのプログラムです。
<h1>ようこそPHPへ!</h1>
<p>今の日時は、
<?php
date_default_timezone_set('Asia/Tokyo');
$date = new DateTime('now');
echo $date->format('Y/m/dのH:i:s');
?>
です。</p>
<h1>
とか<p>
のあたりはHTMLと同じね
このPHPファイルをWebブラウザで表示するとこうなる
ちょっと違うけど、HTMLとほとんど同じに見えるけどな~
そう見えるかもしれないけど、またリロードしてみてくれ
あ、リロードしたら時間が変わった
<?php
~?>
の間に書かれているのは、現在の日時を表示するプログラムだ。だから、表示するたびにその時の最新の日時を表示するんだ
PHPファイルを書き換えなくても内容が変わる(動く)から、こちらは動的サイトなのね
今回のサンプルは「現在の日時を表示する」だけなので、HTMLとの違いがあまり感じられないかもしれません。しかし、<?php
~?>
の間に書かれているのが「友だちの投稿を表示する」プログラムだったらSNSになります。基本的にはこんな仕組みでサーバー用プログラムは動いています。
データベース
データベースはデータの保管庫
データベースは、データを保管するためのミドルウェアだ。「ユーザー名」とか「投稿記事」とか、サービスのほとんどの情報はデータベースに保管される
そんなのファイルに保存すればいいんじゃない?
サーバーはたくさんのクライアントから送られてきたデータを扱わないといけないからね、ファイルじゃ困るんだ
パソコンでデータを保存するときはファイルを利用します。一方、サービスがデータを保管するときはデータベースを利用します。サービスの場合、多数のユーザーが同時に、「ユーザー名」「つぶやき」「注文情報」のような細かな情報を多数保存します。そのような細かくて大量のアクセスに耐えられるように作られているのが、データベースなのです。
データベースにもいくつか種類があり、MySQL(マイエスキューエル)、MariaDB(マリアディービー)、PostgreSQL(ポストグレスキューエル)、Oracle Database(オラクル データベース)、Microsoft SQL Server(マイクロソフト エスキューエル サーバー)などがあります。また、これらはデータベースを管理するプログラムなので、DBMS(Database Management System)とも呼びます。
まーた、いろんな種類があるんだ
サーバーの世界は自由度が高いんだ。といっても、データベースの使い方はどれも似ているから、そこまで心配しなくても大丈夫だよ
データベースにはSQLを使用するRDB(Relational Database)と、使用しないNoSQLというタイプがありますが、以降で紹介するのはRDBです。
データベースはどんなふうに働いている?
データベースの構造は、表計算ソフトのExcel(エクセル)に少し似ていて、データを記憶するための「表(テーブル)」がいくつもまとまった形式になっています。
例えば、SNSを例にデータベースの使われ方を見てみましょう。SNSにはたくさんのユーザーが集まっており、そのすべての投稿が「投稿メッセージテーブル」に記憶されているとします。クライアントアプリからのリクエストが届くと、サーバー側のプログラムがデータベースにリクエストを送り、データベースは「投稿メッセージテーブル」からユーザーの友だちの投稿だけを抽出して返します。
抽出結果はサーバー側プログラムに渡され、インターネットを通じてクライアントアプリに送られ、友だちの投稿が表示されます。
うーん、何だかややこしくてよくわからないわ!
要するに、データベースを使うと「大量のデータの中から特定の条件のデータをすばやく探せる」と覚えておけばいいかな
データベースに話しかけるときはSQLを使う
データベースを利用するときは、SQL(エスキューエル)という言語を使うんだ
前にいってたRubyとかPHPとかじゃないの?
うん。アプリ自体はRubyとかPHPで書くけど、アプリからデータベースにリクエストするときはSQLを使うんだ
SQL(Structured Query Language)は「問い合わせ言語」と呼ばれるものの一種です。サーバーアプリ開発に使うプログラミング言語が違っていても、データベースを利用するときはSQLを使います。
例えば、投稿メッセージテーブル(message_tbl)からユーザー名が「yoshida」というレコードをすべて取得したいときは、次のようなSQLを書きます。
何でアプリと別の言語使わないといけないのかなー
データベースを使うときはたいていSQLだから、プログラミング言語が違っていてもデータベースアクセスは同じで済む、という考え方もできるよ
なるほどー。いったん覚えたらつぶしが効くってことね
PHPからのデータベースアクセス
それじゃ、前に説明したPHPのプログラムでデータベースにアクセスする例を見てみよう。とあるSNS用のデータベースに、「投稿者名」「日付」「メッセージ」が記録されているとする
※上図はMAMPに付属するphpMyAdminというツールでデータベースを表示したものです。
「message」の欄に表示されているのが投稿メッセージね
「あけおめ」と「バ○ス」ばっかりだな……
ここからPHPのプログラムで特定のユーザーの投稿を取り出してみよう
次のPHPファイルは、「testapp_db」というデータベースの「message_tbl」というテーブルから、「yoshida」というユーザーの投稿を取り出して表示するものです。
<h1>ようこそSNSへ!</h1>
<p>yoshidaの投稿メッセージ</p>
<ul>
<?php
$mysqli = new mysqli('localhost', 'serverapp', 'password', 'testapp_db');
$sql = "SELECT * FROM `message_tbl` WHERE `sender` = 'yoshida'";
if ($result = $mysqli->query($sql)) {
while ($row = $result->fetch_assoc()) {
echo "<li>".$row["message"]."(". $row["datetime"].")</li>";
}
}
$mysqli->close();
?>
</ul>
すごく簡単に説明すると、5行目の「$mysqli」で始まる1文でデータベースに接続しています。6行目の「$sql」で始まる部分で、データベースに送るSQL文を作成します。そこから先はデータベースから抽出した結果を表示する処理です。
このPHPファイルをWebブラウザで表示するとこうなる
一人だけ抜き出しても「あけおめ」と「バ○ス」……
まぁ、内容は変えられないからね。とにかく、ここではPHPというプログラムがデータベースから抜き出した情報を表示するイメージをつかんでほしいんだ
NoSQL
SQLを用いる伝統的なRDBに対して、近年新しいタイプのデータベースが登場してきています。方式はソフトウェアごとに異なるのですが、「SQL以外」という意味を込めてNoSQLと呼ばれています。NoSQLはRDBが苦手とする状況(ビッグデータ処理など)で高いパフォーマンスを発揮するよう設計されており、RDBをオールラウンダーとするなら、NoSQLはスペシャリストです。有名なNoSQLに、Google Bigtable、Amazon DynamoDBなどがあります。
サーバー開発をやってみたい!
サーバーアプリ開発を体験するには
サーバーをちょっと体験してみたいなーと思ったらどうしたらいいの?
サーバーアプリの開発を体験するんだったら、MAMPやXAMPPなどをインストールするのが手っ取り早いかな。最近はDocker Desktopも人気だよ
MAMP(マンプ)とXAMPP(ザンプ)は、Webサーバー、データベースサーバー、PHPの実行環境などがセットになったWeb開発用ツールです。これをインストールするだけで、パソコンをWebサーバー兼データベースサーバーにすることができます。あとは実際にサーバーを動かしながら、PHPでアプリを作っていきます。
他の方法に比べて設定周りが簡単なので、コマンドラインが苦手な入門者におすすめだよ
Docker Desktop(ドッカー デスクトップ)は、コンテナ仮想化技術というものを利用して、パソコンの中に仮想サーバーを構築します。コマンドライン(文字のコマンドで操作するツール)で操作するので学習難易度は上がりますが、本番環境(データセンター内のサーバーなど)に近い環境で開発できるため、プロのサーバーアプリ開発者も使っています。
コンテナ仮想化技術では、他のプログラムから遮断されたコンテナというものの中にサーバーのプログラムを入れ、隔離した状態で動かします。考え方がちょっと難しいのでたとえ話をすると、独立した別オフィスを作る代わりに、オフィス内をパーティーションで区切って個室を作り、周囲とやりとりできない状態で仕事をさせるようなイメージです。実際には独立していないのですが「独立したような状態」にすることで、第3章で説明した仮想マシン上のサーバーと同じように、パソコン環境から独立したサーバーとして扱えます。
仮想マシンを使わないために動作が軽く、手軽にコンテナを増やしたり減らしたりしながらサーバーを建てられるため、開発者の中で人気が高まっています。
Docker Desktopはより本格的だけど、難易度も上がる。Linuxをいくらか体験してからのほうが挫折しにくいかな