
Tomcat サービスのリバース プロキシとして Nginx を使用した Docker をセットアップしています。負荷が高い場合 (テスト)、応答時間が急上昇します。
Nginx なしの Tomcat サービスのインスタンス 1 つが、Nginx を前面に置いた複数のサービスよりもうまく機能していることが判明したため、問題は Nginx と Tomcat の間にあります。さらに調査したところ、Nginx の upload_connect_time が最大 3 秒、場合によっては 7 秒になることが分かりました。
Nginx で keepalive、keepalive_connections、proxy_connect_timeout、worker_processes、worker_connections を試してみましたが、何も役に立ちませんでした。次に試すのは、Tomcat max_connections の値を高くすることです。
高いupstream_connect_timeの原因は何でしょうか?
答え1
私はこれを追加することで解決しました
proxy_http_version 1.1;
proxy_set_header Connection "";
これらがなければ、keepalive は意味をなさないので、keepalive パラメータの調整は効果がありません。
私の理解が正しければ、http 1.1 では、同時応答とリクエストに同じ接続を使用でき、ヘッダーに Connection "" を追加することで接続を開いたままにすることができます。
簡単に言うと、以前は Nginx に対して、アップストリームでキープアライブを使用することは許可されていると伝えていましたが、接続を開いたままにする方法を Nginx に設定していなかったため (http 1.1 とヘッダーの接続部分が存在します)、キープアライブは使用されませんでした。
最終的に、これら 2 つのパラメータを正しく設定すると、keepalive 500 は「通常の」パフォーマンスには十分でしたが、高トラフィックの状況を考慮して keepalive 1000 が維持されました。