Nginxをリバースプロキシとして設定するのが良い考えなのはなぜですか?


41

Nginxを介したリバースプロキシを使用して、GunicornでDjangoサイトを実行しています。Nginxは単なる余分なオーバーヘッドではありませんか?Gunicornの上にそれを追加するとどうなりますか?

回答:


53

遅いクライアントの動作と、それがあなたの設定でどのように処理されるかに焦点を当てますが、それが唯一の利点であると思わないでください。低速クライアントにメリットをもたらす同じ方法には、高速クライアント、SSL処理、トラフィックの急増への対処、およびインターネット上でHTTPを提供する他の側面にもメリットがあります。

Gunicornはプリフォークソフトウェアです。アプリケーションサーバーへのロードバランサーやサービス間の通信など、低遅延通信の場合、プリフォークシステムは非常に成功する可能性があります。要求を処理するプロセスをスピンアップするのにコストはかかりません。また、単一のプロセスを単一の要求の処理専用にすることができます。これらのことを排除することで、同時接続の数がそれらを処理するために利用可能なプロセスの数を超えるまで、全体的に高速で効率的なシステムにつながる可能性があります。

あなたの状況では、インターネット上で高遅延クライアントを扱っています。これらの低速クライアントは、それらの同じプロセスを拘束できます。QPSが重要な場合、アプリケーションコードは、できるだけ早くリクエストを受信、処理、および解決して、別のリクエストに移動できるようにする必要があります。遅いクライアントがシステムと直接通信するとき、彼らはそのプロセスを拘束し、それを遅くします。要求を可能な限り迅速に処理して破棄する代わりに、そのプロセスは低速なクライアントを待機する必要があります。有効なQPSが低下します。

非常に少ないCPUとメモリコストで多数の接続を処理することが、Nginxのような非同期サーバーの得意な機能です。多数のクライアントを同時に処理するのが得意であるため、低速クライアントによる同じ悪影響はありません。Nginxの場合、最新のハードウェアで実行すると、数万の接続を一度に処理できます。

事前分岐サーバーの前にあるNginxは素晴らしい組み合わせです。Nginxはクライアントとの通信を処理し、低速のクライアントを処理してもペナルティを受けません。バックエンドがリクエストを処理できる限り高速でリクエストをバックエンドに送信し、サーバーリソースでバックエンドが可能な限り効率的になるようにします。バックエンドは、計算するとすぐに結果を返し、Nginxはその応答をバッファリングして、遅いクライアントに自分のペースでフィードします。一方、バックエンドは、遅いクライアントがまだ結果を受信して​​いる場合でも、別のリクエストの処理に進むことができます。


3
nitpicking:gunicornはイベントベースのプリフォークサーバーです。各プロセスは複数の接続を非同期的に処理します。これにより、nginxの接続あたりのコストが大幅に下がり、説明の残りの部分が有効になるという事実は変わりません。
ハビエル

4
ボーナスとして、Nginxは「低速HTTP DoS攻撃」を非常に効果的に阻止します。私が追加する1つのポイントは、Nunicornを使用する場合、GunicornでX-Forwarded-Forヘッダーの表示をサポートしていない限り、Gunicornで実行しているIP関連の処理を台無しにする可能性があることです。私はGunicornに精通していないので、これがあなたにとってどれほど大きな問題になるかは言えません。
ニールドネガン

情報Javierに感謝します。私はgunicornにたまたま慣れているだけです。
ブルーベン

:あなたの答えは、この質問のために収まる必要がありstackoverflow.com/q/13182892/719276
arthur.sw

これは* _busy_buffer_sizeオプションと関係がありますか?
CMCDragonkai

2

@bluebenは正しい。リバースプロキシを使用しない場合に発生する可能性のある具体的で一般的な例は、プロキシが存在せず、トラフィックが急増する場合に、バックエンドデータベースがデータベース接続ハンドルを実行できることです。これは、@ bluebenが説明したように、接続の解放が遅いためです。

データベースハンドルがなくなるのを見る最初の本能は、より多くのデータベース接続をサポートすることです。しかし、アプリの前にリバースプロキシを追加すると、高負荷に必要なデータベース接続の数が大幅に低下し、安定することがわかります。トラフィックが急増した場合、データベース接続レベルはほとんど上昇しません。

Nginxは、静的コンテンツ、キャッシュ、その他のさまざまなHTTPタスクの提供にも優れており、アプリサーバーをアプリサーバーに集中させることができます。


0

@naill Doneganは上記のコメントでこれについて言及していますが、答えを保証するのに十分重要です。

Nginxは、gunicornが処理できないスローロリス攻撃を阻止します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.