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アプリケーションサーバー にリバースプロキシで接続しまししょう。

../_images/reverse-proxy.png

図 4.6 リバースプロキシ

cover

(中略)詳細は書籍 自走プログラマー をご参照ください