「webサーバとアプリケーションサーバって何が違うんだろう?」、ふと思ったのでまとめた。
#サーバとは
まずサーバって何?という話。サーバは英語でserver、つまり供給する・提供するってこと。IT用語辞典 によるとサーバとは、コンピュータネットワークにおいて、他のコンピュータに対し、自身の持っている機能やサービス、データなどを提供するコンピュータのこと。私たちがwebページを閲覧するとき、自分のPCから「このページ見たい!」とサーバにお願いする。すると、サーバが「はい、これ!」とページを返してくれる。これで、めでたくwebページが見れる。通常、個々のサーバ機やサーバソフトは、外部に提供する機能やサービス、対応しているデータ形式やプロトコル(通信規約)が決まっている。そして、「DBサーバ」「webサーバ」「アプリケーションサーバ」のように、提供する機能などの種類を冠して「○○サーバ」と呼ぶ。
#webサーバ
webサーバはブラウザからのコンテンツのリクエストを受け取り、ブラウザにレスポンスを返すのが役割。このときのリクエストが静的なwebコンテンツだった場合(HTML、CSS、画像ファイルのような更新しない限り同じ表示コンテンツを表示するコンテンツ)、webサーバが処理してレスポンスを返す。また、クライアントごとに表示内容を変化させる処理が必要な動的なwebコンテンツの場合、webサーバはアプリケーションサーバへとリクエストを送る。そして、アプリケーションサーバから返ってきた結果をレスポンスとして返します。webサーバとして有名なのは Nginx、Apache など。
#アプリケーションサーバ
アプリケーションサーバは私たちが作ったアプリケーションを動かしてくれるもの。webサーバから送られてきたリクエストをアプリケーションサーバからアプリケーションに伝え、アプリが処理した結果をwebサーバに返す。ローカル環境下での開発の場合はアプリケーションサーバのみを立てるが、本番環境ではwebサーバをアプリケーションの手前に置くことで、静的なコンテンツの処理を負担させることが多い。
##例えばRailsだったら
Railsのアプリケーションサーバとして代表的なのはUnicorn、Thin、Rainbows、Pumaなど。webサーバから送られてきたリクエストをアプリケーションサーバからRailsアプリケーションに伝え、Railsアプリが処理した結果をwebサーバに返す。ローカル環境下での開発の場合はPumaのようなRails用のアプリケーションサーバのみを立てる(普段development環境でやってるやつ)。一方、本番環境(production環境)ではwebサーバをRailsアプリケーションの手前に置き、静的なコンテンツの処理を負担させることが多い。こうすることで、Webサーバが複数のアプリケーション一度に処理したり、アセットを素早くレンダリングしたりして、リクエストごとに発生する多くの処理をさばいてくれる。
##Rack
ここでRackに触れておく。RackとはRuby製のフレームワークとアプリケーションサーバの間に入り、互いをつなぐ役割をしてくれる。サーバはRackを使用することで、送られてきたHTTPのリクエストがアプリにも理解できる形に変換される。逆にアプリからのレスポンスはRackを通じてHTTPに変換されてサーバに返る。Rackを使用することでサーバとフレームワークの組み合わせが自由になる。
#まとめ
ここまでの内容をまとめる。ブラウザから送られてきたリクエストをwebサーバが受け取り、静的なwebコンテンツだった場合レスポンスをブラウザに返す。しかし、リクエストが動的なwebコンテンツの場合、webサーバでは処理せず、アプリケーションサーバに送る。そして、アプリケーションサーバがミドルウェアを通してアプリに伝える。処理が終わったら、先ほどとは逆の順番で結果をブラウザに返す。
#参考
webサーバーとアプリケーションサーバーの違い
IT用語辞典
Rails開発におけるwebサーバーとアプリケーションサーバーの違い(翻訳)