UUUM攻殻機動隊(エンジニアブログ)

UUUMのエンジニアによる技術ブログです

webサーバーとアプリケーションサーバーの関係を調べてみた

UUUMでエンジニアインターンをしている鷲見です。弊社では社内システムの一部をRailsを使って開発しています。なので今回はRailsで開発する上で必要な知識を一部書いてきます。

HTTP

私たちがwebページブラウザがwebサーバーに対してコンテンツを要求し、webサーバーは要求されたコンテンツをブラウザに対して返します。HTTPはこの一連のやりとりにおける通信のルール(プロトコル)です。この通信のルールが世界標準で決められているため、私たちはどの種類のブラウザであっても、世界中のどんなwebサーバーにもアクセスできるのです。

URI

URIとはwebに存在する情報を名前をつけて識別するためのルールのことです。URIを使うことでwebに存在する全ての情報は一意のもので表現することができるようになるます。HTTPはURIを使ってwebサーバーからほしいコンテンツを指定することができます。URIとURLの違いとしてはURIが情報の識別するルールに対し、URLがURIにのっとり情報の場所を示したものになります。

webサーバーとアプリケーションサーバー

webサーバー

webサーバーはブラウザからのコンテンツのリクエストを受け取り、ブラウザにレスポンスを返す役割のが役割です。このときのリクエストがHTML、CSS、画像ファイルのような更新しない限り同じ表示コンテンツを表示する静的なwebコンテンツだった場合、webサーバーが処理してレスポンスを返します。そしてクライアントごとで表示内容を変化させる処理が必要な動的なwebコンテンツの場合、webサーバーはアプリケーションサーバーへとリクエストを送ります。アプリケーションサーバーから返ってきた結果をレスポンスとして返します。webサーバーとして NginxとApacheなんかが有名です。

アプリケーションサーバー

アプリケーションサーバーは私たちが作ったRailsアプリケーションを動かしてくれるものです。webサーバーから送られてきたリクエストをアプリケーションサーバーからRailsアプリケーションに伝え、Railsアプリが処理した結果をwebサーバーに返します。ローカル環境下での開発の場合はPumaのようなRails用のアプリケーションサーバーのみを立てますが、本番環境ではwebサーバーをRailsアプリケーションの手前に置くことで、静的なコンテンツの処理を負担させることが多いです.RailsのアプリケーションサーバーとしてRainbows、Pumaなんかがあります。

Rack

RackはRuby製のフレームワークとアプリケーションサーバーの間に入り、互いをつなぐ役割をしてくれます。送られてきたHTTPのリクエストをサーバーはRackを使用しアプリにも理解できる形に変換して伝えてくれる。逆にアプリからのレスポンスはRackを通じてHTTPに変換されてサーバーに返ります。Rackを使用することでサーバーとフレームワークの組み合わせが自由になります。

全体の動き

ここまでのことをまとめるとブラウザから送られてきたリクエストをwebサーバーが受け取り、静的なwebコンテンツだった場合レスポンスをブラウザに返します。しかし、リクエストが動的なwebコンテンツの場合webサーバーでは処理せず、アプリケーションサーバーに送り、アプリケーションサーバーがRailsアプリにRackを通して伝えます。結果を先ほどとは逆の順番でブラウザに返します。

具体的に言うとブラウザからNginx、NginxからPuma、PumaからRackを通してRailsアプリに伝わります。レスポンスはこの逆の順序となります。

おわりに

プログラムは書いていけば理解が膨らみますが、知識関連はブログみたいに書かないと中々定着してくれないなーと常々思いましたー。

www.wantedly.com