[シーン記述
後HTTP1.1、HTTPプロトコル、すなわち接続長、TCP接続で接続確立の遅延と消費を低減し、閉じ、HTTP要求および応答の複数を送信することができるという利点を永続的な接続をサポートします。
我々はリバースプロキシとしてnginxのを使用するか、長い接続要求を介してクライアントから、負荷分散する場合は、サーバー側への短い接続に変換されます。
長い接続をサポートするために、我々は、nginxのサーバー上でいくつかの設定を行う必要があります。
[条件]
nginxのを使用する場合は、あなたが長い接続をしたい、我々は次の2つの作業を行う必要があります
nginxのにクライアントから1.長い接続されて
nginxのから2.サーバーへの長い接続であります
関係するクライアントの場合、逆に、サーバーの役割を果たし、実際にnginxのは、サーバに、nginxのは、クライアントです。
[クライアントとは長い接続を維持します]
私たちは長い間の接続を維持し、クライアントとnginxの間で実現したい場合は、次のものが必要:
「キープアライブ」ヘッダーを運ぶ1.Clientにより送信されたリクエストを。
2.Nginx設定サポートは、キープアライブ
[HTTPの構成]
デフォルトでは、nginxのは、クライアント接続のためのキープアライブのサポートを開きました。特別なシーンのために、あなたはパラメータを調整することができます。
HTTP {
keepalive_timeout 120S;#クライアントのリンクのタイムアウト。ときに長い無効にするには0に接続されています。
keepalive_requests 10000;#長い接続上で提供することができる要求の最大数。
要求と前要求の最大数は、すべての後に、接続が閉じている#。
#デフォルト値は100です
}
ほとんどの場合、keepalive_requests = 100は十分ですが、より高いQPSシーンのために、多数の接続が再表示されTIME_WAITを減らし、放棄しているの生成を避けるために、このパラメータを大きくする必要があります。
クライアントが10,000あたりの要求(長い確立された接続の通常複数)を送信= 10000 QPSは、各接続要求は100まで実行することができ、それは平均で毎秒長いコネクタ100は、このようにnginxのだろうということを意味します閉じます。
また、それはQPSを維持するために、クライアントが再新しい毎秒100個の接続があることを意味します。
我々はnetstatコマンドでクライアントマシンを見ればこのように、あなたはTIME_WAITソケット接続(でも、クライアントとnginxの間の力の間、キープアライブ)が多数あります。
・[保つために]と長い接続サーバー
次のようにnginxのとサーバー、最も簡単なセット間の長い接続を維持したいです:
HTTP {
上流のバックエンド{
サーバ192.168.0.1:8080重量= 1 max_fails = 2 fail_timeout = 30秒。
サーバ192.168.0.2:8080重量= 1 max_fails = 2 fail_timeout = 30秒。
キープアライブ300; //これは非常に重要です!
}
サーバー{
8080 DEFAULT_SERVERを聞きます。
サーバーの名前 "";
位置/ {
proxy_passます。http://バックエンド。
proxy_http_version 1.1;#セットのHTTPバージョン1.1
proxy_set_header接続「」;長い接続に#セットの接続(デフォルトはno)}
}
}
}
[上流]設定
上流、特に重要なパラメータは、キープアライブでもあります。
このパラメータとHTTP前keepalive_timeoutなく、同じ内部。
この引数の意味は、空き接続プールの最大数は内部のことです。
私は理解していませんか?それは私たちが例を与える、重要ではありません。
シーン:
HTTPサーバは、サーバは、上流の要求、100ミリ秒の応答時間を受け取り、があります。
10000 QPSするために必要なパフォーマンス、我々は上流のサーバーとの間の約1000のnginxのHTTPリクエストを構築する必要があります。(1000 / 0.1秒= 10000)
最適条件:
各要求は100ミリ秒であっても、仮定及び平滑要求、要求は直ちに接続プールの端に置かれ、(アイドル)状態をIDLEに設定されています。
私たちは0.1秒単位:
1.私たちは今、キープアライブ値が10に設定されている、すべての0.1秒クロック1000個の接続を持っています
2. 0.1秒初めて、我々は1000の要求とリリースの合計を受け
時間0.2秒の終了時に解放3.最初の0.2秒、我々は再び行く千リクエスト、
制服の両方の要求と応答、ちょうど十分な0.1秒解除可能な接続、新しい接続を確立せず、および接続プールがアイドル状態に接続されていません。
最初のケース:
レスポンスは非常に滑らかですが、要求されたときに滑らかではありません
4. 0.3秒初めて、我々は来ていない500の要求、ネットワークの遅延のために500曲のリクエストやその他の理由のみを受けています
この時間は、nginxの500がアイドル状態に接続され、接続プール、直接閉鎖を検出した(500-10)接続
5. 0.4秒初めて、我々は1500個の要求を受けたが、nginxのは(1500から510)の接続を再確立していたので、今のプール(500 + 10)の接続は、唯一の存在です。
それは490の接続を閉じませんステップ4、であれば、唯一の我々は500個の接続を再確立する必要があります。
後者の場合:
要求は非常に滑らかではなく、スムーズな応答時間であります
4. 0.3秒初めて、我々は1500の要求の合計を受け
しかし、プールは唯一の千の接続がありますが、この時、nginxのは500台の接続、1500の接続の合計を作成しました
5.すべての接続の最初の0.3秒が解除され、最初時間0.3秒は、我々は500個の要求を受け
アイドル状態1000での接続を検出したnginxのセルは、それがリリースしていた(1000年から1010年)の接続
接続数プロモーターによって引き起こされる繰り返しショック、これは接続のキープアライブアイドルの最大数です。
キープアライブは、nginxの設定されている2例以上無理はリリースプロセスを何度になったし、資源の無駄が生じ、接続を作成しました。
キープアライブパラメータは、一般的に平均応答時間に基づいて、特に比較的高いQPS不安定なネットワーク環境やシーンのために、注意しなければならないとQPSの値は、おおよそ長い接続の必要数を計算することができます。
次に、接続の数は10%〜30%のキープアライブ長さを設定します。
[場所]設定
HTTP {
サーバー{
位置/ {
proxy_passます。http://バックエンド。
proxy_http_version 1.1;#セットのHTTPバージョン1.1
proxy_set_header接続「」;長い接続に#セットの接続(デフォルトはno)
}
}
}
長い接続からHTTPプロトコルのサポートは、バージョン1.1の後、proxy_http_version命令によって1.1に設定することが好ましいです。
HTTP1.0はHTTP1.1のない使用がない場合、バックエンドサービスが101エラーを返し、その後、切断されます、キープアライブプロパティをサポートしていません。
「接続」ヘッダをクリーンアップすることを選択することができるので、はい、nginxの上流側との間も短い接続は、クライアントとnginxの間の長い接続を開くことができます。
もう一つの方法[詳細]
HTTP {
マップ$ http_upgrade $ {connection_upgrade
デフォルトのアップグレード。
「」に近いです。
}
上流のバックエンド{
サーバ192.168.0.1:8080重量= 1 max_fails = 2 fail_timeout = 30秒。
サーバ192.168.0.2:8080重量= 1 max_fails = 2 fail_timeout = 30秒。
キープアライブ300;
}
サーバー{
8080 DEFAULT_SERVERを聞きます。
サーバーの名前 "";
位置/ {
proxy_passます。http://バックエンド。
proxy_connect_timeout 15;#上流サーバと接続時間(単位なし、最大75Sを超えることはできません)
proxy_read_timeout 60年代は、#nginxは、要求に対する応答を取得するために長い間待っています
proxy_send_timeoutの12S;#は、上流のサーバのタイムアウトにリクエストを送信します
proxy_http_version 1.1;
proxy_set_header $ http_upgradeをアップグレード。
proxy_set_header接続する$ connection_upgrade。
}
}
}
マップ内部HTTPの役割は以下のとおりです。
「アップグレード」フィールドの値がクライアント要求ヘッダーに応じて、プロキシサーバヘッダフィールド「接続」に転送してみましょう。
一致するものがない場合は$ Http_upgrade、その後、ヘッダフィールド「接続」の値がアップグレードになります。
$ http_upgrade空の文字列ならば、「接続」ヘッダフィールドの値が近いだろう。
[補足]
nginxのサポート用WebSocket。
バックエンドサーバーにクライアントから送信されたnginxのアップグレード要求については、明示的にアップグレードおよび接続のタイトルを設定する必要があります。
これは、状況は非常に一般的なシナリオの上に考えることができます。
アップグレード、HTTPからアップグレードのWebSocket接続に接続するためのHTTPプロトコルヘッダ機構をアップグレード機構は、接続プロトコルヘッダおよびプロトコルヘッダをアップグレード使用します。
nginxのは、バックエンドサーバへのクライアント要求からのアップグレードも行い、接続ヘッダ情報を明示的に設定する必要がありますアップグレードします。
[注]
現在のモジュール設定をproxy_set_headerされていない場合、nginxの設定ファイルでは、それはレベルから設定を継承します。
承継の順序は次のとおりです。http、サーバー、場所。
proxy_set_headerを使用して次の層は、ヘッダの値を変更する場合、すべてのヘッダ値は、すべての以前の設定継承は破棄され、変化してもよいです。
だから、限り同じ場所にある可能性proxy_set_headerとして、そうでない場合は他の問題がある可能性があります。