nginx × rails でのnginxの役割について理解を深めました
きっかけ
サーバーの構成として、railsの手前にnginxを置く構成をよくみますが、結局nginxは何で必要なんだろうという疑問が生まれました。nginxはwebサーバーです、railsサーバーもwebサーバーというような、、、どっちもwebサーバーなのか?なぜ手前にnginxを置くのか?? と頭が混乱したので、整理します。
(nginx × rails といっても、色々なパターンがあるので、一概には言えませんが、おそらく一般的であろう私がみたことのある構成について話します。)
一般的にwebサーバーとは
最も基本的な水準では、ブラウザーはウェブサーバーが保持しているファイルが必要になったらいつでも、 HTTP でファイルをリクエストします。リクエストが正しいウェブサーバー(ハードウェア)に届くと、HTTP サーバー(ソフトウェア)がリクエストを受け付け、リクエストされた文書を探し(ない場合は 404 レスポンスが返される)、ブラウザーに HTTP を通して送り返します。
引用元: MDN ウェブサーバーとは
つまりwebサーバー(ソフトウェア)とは、HTTPリクエストを受け付けて、HTTPレスポンスを返す(サーブする)ものと理解しました。
※ウェブサーバー(ハードウェア)はただのコンピュータのこと。今回は、ソフトウェアとしてのwebサーバーの理解をしたいので、以後のwebサーバー
という単語は、ソフトウェアとしてのwebサーバーを指します。
↓図
すると、nginxもrailsもHTTPリクエストを受け付けて、HTTPレスポンスを返すことができるのでどちらもwebサーバーと言えそうです。webサーバーが2重になっているのはなんでなんでしょうか?
なぜnginx × rails??
nginxとrailsを比べると、nginxは、シンプルなwebサーバーとして、単純に静的ファイルやコンテンツをレスポンスとして返す際に利用しやすいです。一方、railsはdbに接続してデータを取得して、加工したり、ユーザー認証をしたりして、処理した結果のレスポンスを返すことに長けています。そこで、nginx × railsを組み合わせて、それぞれ得意なことをさせているのだと思います。
つまり、nginxをrailsの手前に置くことで、railsで処理するまでもないような静的コンテンツへのリクエストなどをさばき、railsサーバーへの処理の負担を減らすことができるのです。
他にも、nginxでHTTPS認証したり、コンテンツをキャッシュしたり、アクセスログ出したりすることにも使えます。(すごい)
ただし、AWSのALBやWAFやCloudFrontでも代用できる部分も多いと思うので、必ずnginxが必要というわけではないのかなと思いました。それぞれの機能とプロダクトでの役割を理解して構成を決めていきたいですね。
理解したこと!
-
nginxもrailsもwebサーバー
-
nginx × railsでは、別々の役割を担っている
-
nginxがいることで、railsサーバーで捌くほどでもないリクエストを手前で返せたりしてよい!ほかにも色々やってくれる〜
-
イメージはこんな感じです。
自分の中では理解できているつもりですが、、今後より理解を深めていきたいなと思います。
Discussion