Nginxを、何らかのサービスを提供する一連のサーバーのリバースプロキシとして使用し始めました。
サービスは時々かなり遅くなる場合があります(JavaとJVMでの実行は「フルガベージコレクション」でスタックすることがあり、数秒かかる場合があります)proxy_connect_timeout
。2秒に設定しました。サービスがGCでスタックし、時間内に応答しないため、別のサーバーに要求を渡す必要があることを確認します。
またproxy_read_timeout
、サービス自体が応答を計算するのに時間がかかりすぎる場合、リバースプロキシがスタックするのを防ぐように設定しました。再び、要求をタイムリーな応答を返すのに十分な空きがある別のサーバーに移動する必要があります。
いくつかのベンチマークを実行しましたがproxy_connect_timeout
、サービスがスタックして着信接続を受け入れないため、一部の要求が接続タイムアウトに指定された時間に正確に戻るため、正しく機能することが明確にわかります(サービスは埋め込みとしてJettyを使用しています)サーブレットコンテナ)。ここproxy_read_timeout
でも指定されたタイムアウト後に戻るリクエストを見ることができるため、これも機能します。
問題はproxy_read_timeout + proxy_connect_timeout
、サービスがスタックし、Nginxがアクセスしようとしたときに接続を受け入れない場合、Nginxがタイムアウトする前にタイムアウトする、またはほぼその時間のタイムアウトが発生するリクエストがあることです。処理を開始しますが、速度が遅すぎるため、読み取りのタイムアウトのためにNginxが中断します。サービスにはそのような場合があると思いますが、いくつかのベンチマークを実行して、合計数百万のリクエストがあります-上記のいずれかで返される単一のリクエストを見ることはできませんでしたproxy_read_timeout
(タイムアウトが大きい)。
この問題に関するコメントをいただければ幸いです。ただし、接続後にタイムアウトカウンターがリセットされないというNginxのバグ(コードをまだ見ていないため、これは単なる仮定です)が原因である可能性がありますNginxがアップストリームサーバーから何も読み取らなかった場合、成功です。
proxy_read_timeout
は「グローバルタイムアウト」ではなく、2つの読み取り操作の間にあることに注意してください。
proxy_read_timeout + proxy_connect_timeout
。だからこそ、合計タイムアウトがになると思っています。