Webサーバとは何か、というお話
今回はWebサーバとは何なのか、という疑問に対して記事を書かせていただきます。
前回の記事では「そもそもサーバって何なの?」とかいう、抽象的な解説をしました。
再掲しますが、
「ネット使って通信して、データを受け取って処理して返すもの。そのほとんどはWebサーバと言われるものではあるが、サーバの種類は曖昧だからそれほど意識しなくて良い」
ということを僕なりの結論として出しました。
今見るとなかなか雑でひどいな...w
では「じゃあWebサーバはどういうことをするの?」という素朴な疑問が湧いてきますね。ものすごく簡単に説明すると、
・http通信を用いて、クライアントが指定したアドレスに対応するデータ(html文書や画像ファイル、オブジェクト型データなど)を返す
ことをしています。
以下詳細。
Webサーバの仕組み
例えば、ここのブログのURL(http://konkea.hatenablog.com)をWebブラウザと呼ばれているもの(IEやChromeやSafari, Firefoxなどなど)で開くと、Webサイトという形で画面に表示されます。
また、画像ファイルのURLを指定してやれば画面に画像が表示されるはずです。
ここで、http://~~~~... と入力し、画面を表示させようとするときにクライアントとWebサーバ同士で通信が行われています。これが何を意味するかというと
・httpという通信の規約を用いて、指定したサーバに要求(request)を送る
ことを意味しています。Webサイトをただ見ているだけでは意識することはありませんが、どのサイトを見るときも"http://"という文字列が使われているはずです。
その要求(request)を受け取ったWebサーバは、それに対し
・対応するデータをクライアントに返す
ことをしています。そして最後にクライアントは、
・受け取ったデータの型から表示形式を判断し、画面に表示させる
ことをします。まとめると、
①クライアントがhttp通信を用いてサーバを検索し、要求(request)を送る
②それを受け取ったサーバが、要求(request)に対応する返答(response)を返す
③responseが返ってくれば、クライアントはそのデータ型に沿った形式(htmlや画像形式など)で画面に表示を行う
ってな感じになります。超簡単ですね!
しかしながら実際には、requestを送るときに追加パラメータ(header)を付けてブラウザ情報なども一緒に送ったり、responceにもパラメータ(header)を付けてサーバの情報を付与させる、なんてこともしてたりします。
また、受け取ったURLに対して完全に同じデータを返すなんてことも普通はせずに、要求(request)を受け取った後サーバ内でプログラムを実行し、データを処理した後にクライアントに返す、なんてことをしていたりします。
その仕組みを簡単に作るためにWebアプリケーションフレームワーク(Ruby on RailsとかNode.jsとか)が使われるわけです。この話に深入りしてもいいのですが、タイトルと若干ずれてしまうためまた別の記事で紹介させていただきます。
webサーバの用途はWebサイトだけじゃない
webサーバを用いてアプリを作成ときに、実際に僕が勘違いしていたことを取り上げてみます。
「webサーバとは」で検索を通してみると、だいたいのサイトで
- Webサイト(ホームページ)を表示・閲覧するための仕組み
であると述べられています。そこで僕は、Webサーバのことを「ホームページ表示の用途でしか使われない」ものなんだと勘違いしていました。
つまり、「Webブラウザ表示用のページを作ることが必須」なのだと思っていました。
例えば通信をするスマホアプリでは、「あらかじめ開発されたGUIを利用しつつ、可変パラメータのみをサーバから取ってきて、それに応じて画面を構成していく」という作りが多いかと思います。そこに「Webページを開く」なんて動作はありません。
僕はこの微妙な相違に苦しみました。
Webページを扱わないアプリ開発では、Webサーバを用いない
なんて勘違いをしていたわけです。実際にアプリケーションサーバなんてものもありますし、そっちを使うものなのかとばかり思っていました。
しかしながら検索しても、アプリケーションサーバの情報がなさすぎるし、大半がWebサーバも絡んでくるしで訳分からず...
そして何よりこの勘違いを払拭してくれるサイトが無かった。
結論から言います。だいたいの事は全部Webサーバでできるし、Webページが必須なんてこともありません。Webサーバは大変万能です。別にhtmlみたいなページ形式で返さなくてもいいんです。
例えば、とあるWebサーバの内部にユーザ情報があるときに、http通信を用いて1ユーザの情報が単純な"文字列"で欲しいとします。ページレイアウトとかは気にしません。
実はWebサーバを運用する時、どのようなデータ形式でクライアントにデータを返すかということを指定することができます。知ってる人には当たり前ですが、このことを知らない情報学生も多くいることでしょう。
例えばRailsでは
(クラス定義)
def showUser (指定したURLに対してこの関数が実行される)
user = {"name"=>"konkea", "old" => 21}
render : json => user
end
なんて書くだけで、ユーザ情報が含まれたJSON文字列のみを返してくれます。
Railsのルーティング等々のお話は今回は省きますが、
- http://(とあるサーバ)/user/001
という要求を出した時に、上記のプログラムが処理されるようなルーティングを設定すれば、そのURLを開いた時に
{"name" : konkea, "old" : 21}
というJSON文字列のみを取得することができます。
こんな感じで、アプリ開発をする際にWebページではなく、欲しいデータのみをWebサーバから取得することができるわけですね!
以上のことが理解できていれば、このネット世界の上層の大半がWebサーバで占められていることにも納得がいくでしょう。
まとめ
Webサーバについての基礎知識を長々と書かせていただきました。
結局のところ、Webサーバは
「とっても万能な通信媒体」
であるとまとめさせていただきます。雑すぎるw
だいたいの事はWebサーバでできる、というお話でした。
※何か突っ込みたい所等々ありましたらコメント下さい♪
余談
本来はhttp通信とは何か?という話題も一緒の記事にしようとしたのですが、Webサーバについて長々と書いているうちに2000文字を軽くオーバーしてしまったので、また別の機会に取り上げることにしますw
ブログ始めてから抽象的な話題ばっかりだし、そろそろ具体的な技術の記事を書きたいなぁ。