107:リバースプロキシ¶
プログラミング迷子: Webアプリケーション開発は覚えることが多い
後輩W:Djangoを Gunicorn で起動してるんですが、ページの表示が重い気がするんです。アクセスがちょっと増えただけでサーバーの負荷もけっこう高くなってしまうし……。サーバースペック上げたほうが良いんでしょうか?
先輩T:どれどれ……あれ、Gunicornを直接ネットに公開してるの? これだと静的ファイルも全部Djangoで処理するから、CPUとメモリにかなり負荷がかかるね。Webサーバーを立てて リバースプロキシ するべきだよ。
後輩W:リバースプロキシ……?って何ですか?
先輩T:Webサーバーで受け取ったリクエストをバックエンドのGunicornに渡すやつがリバースプロキシだよ。セキュリティーの観点からも、フロントのWebサーバーを立てよう。
Webアプリケーションサーバー(Gunicorn+Django)を直接ネットに公開した場合、すべてのHTTPリクエストをGunicorn+Djangoで処理して返すことになります。 この構成の場合、Djangoはリクエストされた画面だけでなく、その画面を表示するのに必要なCSSやJavaScript、画像など、動的に処理する必要がない静的ファイルについてもファイル1つ毎にリクエストを受けて、返します。 リクエストを受けたページで、CSSファイルを5個、JavaScriptファイルを5個、画像を5個、利用している場合、ブラウザからはページ本体以外に15回のリクエストが送られます。 こういった静的ファイルのリクエストをすべてPython等のプログラムで処理すると、どうしても時間がかかってしまいます。
また、インターネットではWebサイトに対してロングポーリング 1 や巨大なリクエストを送りつける 2 といった多種多様な攻撃が日々繰り返されています。 こういった攻撃に対抗する仕組みはGunicornやDjangoでは提供されていません。
- 1
リクエストデータを1秒に1文字といった低速でサーバーに送信するリクエストを複数同時に行い、サーバー側の同時接続数を溢れさせ、他の利用者がサービスを利用できなくする攻撃。
- 2
数百MB、数GBといった巨大なリクエストをサーバーに送信することで、サーバーのメモリを溢れさせる攻撃
ベストプラクティス¶
Webサーバー として Apache や Nginx などを設置し、 Webアプリケーションサーバー にリバースプロキシで接続しまししょう。

図 4.6 リバースプロキシ¶
(中略)詳細は書籍 自走プログラマー をご参照ください