回答:
遅いクライアントの動作と、それがあなたの設定でどのように処理されるかに焦点を当てますが、それが唯一の利点であると思わないでください。低速クライアントにメリットをもたらす同じ方法には、高速クライアント、SSL処理、トラフィックの急増への対処、およびインターネット上でHTTPを提供する他の側面にもメリットがあります。
Gunicornはプリフォークソフトウェアです。アプリケーションサーバーへのロードバランサーやサービス間の通信など、低遅延通信の場合、プリフォークシステムは非常に成功する可能性があります。要求を処理するプロセスをスピンアップするのにコストはかかりません。また、単一のプロセスを単一の要求の処理専用にすることができます。これらのことを排除することで、同時接続の数がそれらを処理するために利用可能なプロセスの数を超えるまで、全体的に高速で効率的なシステムにつながる可能性があります。
あなたの状況では、インターネット上で高遅延クライアントを扱っています。これらの低速クライアントは、それらの同じプロセスを拘束できます。QPSが重要な場合、アプリケーションコードは、できるだけ早くリクエストを受信、処理、および解決して、別のリクエストに移動できるようにする必要があります。遅いクライアントがシステムと直接通信するとき、彼らはそのプロセスを拘束し、それを遅くします。要求を可能な限り迅速に処理して破棄する代わりに、そのプロセスは低速なクライアントを待機する必要があります。有効なQPSが低下します。
非常に少ないCPUとメモリコストで多数の接続を処理することが、Nginxのような非同期サーバーの得意な機能です。多数のクライアントを同時に処理するのが得意であるため、低速クライアントによる同じ悪影響はありません。Nginxの場合、最新のハードウェアで実行すると、数万の接続を一度に処理できます。
事前分岐サーバーの前にあるNginxは素晴らしい組み合わせです。Nginxはクライアントとの通信を処理し、低速のクライアントを処理してもペナルティを受けません。バックエンドがリクエストを処理できる限り高速でリクエストをバックエンドに送信し、サーバーリソースでバックエンドが可能な限り効率的になるようにします。バックエンドは、計算するとすぐに結果を返し、Nginxはその応答をバッファリングして、遅いクライアントに自分のペースでフィードします。一方、バックエンドは、遅いクライアントがまだ結果を受信している場合でも、別のリクエストの処理に進むことができます。
@bluebenは正しい。リバースプロキシを使用しない場合に発生する可能性のある具体的で一般的な例は、プロキシが存在せず、トラフィックが急増する場合に、バックエンドデータベースがデータベース接続ハンドルを実行できることです。これは、@ bluebenが説明したように、接続の解放が遅いためです。
データベースハンドルがなくなるのを見る最初の本能は、より多くのデータベース接続をサポートすることです。しかし、アプリの前にリバースプロキシを追加すると、高負荷に必要なデータベース接続の数が大幅に低下し、安定することがわかります。トラフィックが急増した場合、データベース接続レベルはほとんど上昇しません。
Nginxは、静的コンテンツ、キャッシュ、その他のさまざまなHTTPタスクの提供にも優れており、アプリサーバーをアプリサーバーに集中させることができます。