HTTPリバースプロキシは通常、プロキシ接続のクライアント側でサーバー側ではなくHTTPキープアライブを有効にしますか?


30

HAProxyには、クライアント側(クライアント<-> HAProxy)でHTTPキープアライブを有効にする機能がありますが、サーバー側(HAProxy <->サーバー)では無効になります。

一部のクライアントはサテライト経由でWebサービスに接続しているため、レイテンシは最大600ミリ秒になります。キープアライブを有効にすると、速度が少し速くなると思います。私は正しいですか?

これはNginxでサポートされていますか?これは、他のソフトウェアおよびハードウェアロードバランサーに広く実装されている機能ですか?HAProxy以外に他に何がありますか?

回答:


43

編集:私の答えは元の未編集の質問のみをカバーしています。これは、この種のことがロードバランサー/リバースプロキシで一般的かどうかでした。nginx / product Xがこれをサポートしているかどうかはわかりませんが、リバースプロキシエクスペリエンスの99.9%がHAproxyを使用しています。

正しい。HTTPキープアライブはクライアント側で実行されますが、サーバー側では実行されません。

どうして?

いくつかの詳細を分析すると、なぜこれが利点なのかがすぐにわかります。この例では、ページwww.example.comを読み込んでいるとします。このページには3つの画像img [1-3] .jpgが含まれています。

Keep-Aliveを使用しないブラウザーのページ読み込み

  1. クライアントはポート80でwww.example.comへのTCP接続を確立します
  2. クライアントは「/」のHTTP GET要求を行います
  3. サーバーは、URI「/」のHTMLコンテンツを送信します(これには3つの画像を参照するHTMLタグが含まれます)
  4. サーバーはTCP接続を閉じます
  5. クライアントはポート80でwww.example.comへのTCP接続を確立します
  6. クライアントは「/img1.jpg」に対してHTTP GET要求を実行します
  7. サーバーは画像を送信します
  8. サーバーはTCP接続を閉じます
  9. クライアントはポート80でwww.example.comへのTCP接続を確立します
  10. クライアントは「/img2.jpg」に対してHTTP GET要求を実行します
  11. サーバーは画像を送信します
  12. サーバーはTCP接続を閉じます
  13. クライアントはポート80でwww.example.comへのTCP接続を確立します
  14. クライアントが「/img3.jpg」に対してHTTP GET要求を実行します
  15. サーバーは画像を送信します
  16. サーバーはTCP接続を閉じます

4つの個別のTCPセッションが確立されてから閉じられることに注意してください。

Keep-Aliveを使用したブラウザーのページの読み込み

HTTPキープアライブでは、1つのTCP接続で複数のHTTP要求を次々に処理できます。

  1. クライアントはポート80でwww.example.comへのTCP接続を確立します
  2. クライアントは「/」のHTTP GET要求を実行し、これをHTTPキープアライブセッションにするようサーバーに要求します。
  3. サーバーは、URI「/」のHTMLコンテンツを送信します(これには3つの画像を参照するHTMLタグが含まれます)
  4. サーバー TCP接続を閉じない
  5. クライアントは「/img1.jpg」のHTTP GETリクエストを行います
  6. サーバーは画像を送信します
  7. クライアントは「/img2.jpg」のHTTP GETリクエストを行います
  8. サーバーは画像を送信します
  9. クライアントは「/img3.jpg」のHTTP GETリクエストを行います
  10. サーバーは画像を送信します
  11. HTTPキープアライブタイムアウト期間内にHTTPリクエストが受信されない場合、サーバーはTCP接続を閉じます

キープアライブでは、1つのTCP接続のみが確立され、最終的に閉じられることに注意してください。

キープアライブの方が良いのはなぜですか?

これに答えるためには、クライアントとサーバー間のTCP接続を確立するために必要なことを理解する必要があります。これは、TCP 3ウェイハンドシェイクと呼ばれます。

  1. クライアントはSYN(chronise)パケットを送信します
  2. サーバーはSYN(chronise)ACK(nowledgement)、SYN-ACKを送り返します
  3. クライアントはACK(nowledgement)パケットを送信します
  4. TCP接続は、クライアントとサーバーの両方でアクティブと見なされるようになりました

ネットワークには遅延があるため、3ウェイハンドシェイクの各ステップには一定の時間がかかります。クライアントとサーバー間に30ミリ秒があるとしましょう。TCP接続を確立するために必要なIPパケットの往復送信は、TCP接続を確立するのに3 x 30ミリ秒= 90ミリ秒かかることを意味します。

これはあまり聞こえないかもしれませんが、元の例で4つのTCP接続を確立する必要があると考えると、これは360ミリ秒になります。クライアントとサーバー間の遅延が30ミリ秒ではなく100ミリ秒の場合はどうなりますか?その後、4つの接続が確立するのに1200msかかります。

さらに悪いことに、一般的なWebページでは、読み込むために3つ以上の画像が必要な場合があり、クライアントが要求する必要のある複数のCSS、JavaScript、画像、またはその他のファイルが存在する場合があります。ページに他の30個のファイルが読み込まれ、クライアントサーバーの待ち時間が100ミリ秒の場合、TCP接続の確立に費やす時間はどれくらいですか?

  1. 1つのTCP接続を確立するには、3倍の遅延が必要です。つまり、3 x 100ms = 300msです。
  2. これを31回、ページに対して1回、ページによって参照される他の各ファイルに対してさらに30回行う必要があります。31 x 300ms = 9.3秒。

9.3秒でTCP接続の確立に費やし、他の30個のファイルを参照するWebページをロードしました。また、HTTP要求の送信と応答の受信に費やされた時間もカウントされません。

HTTPキープアライブでは、1つのTCP接続を確立するだけで、300ミリ秒かかります。

HTTPキープアライブが非常に優れている場合、サーバー側でも使用してみませんか?

HTTPリバースプロキシ(HAproxyなど)は、通常、プロキシするバックエンドサーバーの非常に近くに展開されます。ほとんどの場合、リバースプロキシとそのバックエンドサーバー間の遅延は1ミリ秒未満であるため、TCP接続の確立はクライアント間よりもはるかに高速です。

しかし、それは理由の半分にすぎません。HTTPサーバーは、クライアント接続ごとに一定量のメモリを割り当てます。Keep-Aliveを使用すると、接続をキープアライブに維持し、拡張により、キープアライブタイムアウトに達するまでサーバー上で一定量のメモリを使用し続けます。 。

したがって、HTTPリバースプロキシのサーバー側でキープアライブを使用する効果を考慮すると、メモリの必要性が増加しますが、プロキシとサーバー間のレイテンシが非常に低いため、実際のメリットは得られませんTCPの3ウェイハンドシェイクにかかる時間を短縮するため、通常、このシナリオではプロキシとWebサーバー間のKeep-Aliveを無効にすることをお勧めします。

免責事項:はい、この説明では、ブラウザーが通常サーバーへの複数のHTTP接続を並行して確立するという事実を考慮していません。ただし、ブラウザが同じホストに対して行う並列接続の数には制限があり、通常、これはキープアライブを望ましいものにするのに十分なほど小さいものです。


5
優れた説明グレアムのための賞賛は、私は私にこれを尋ねた誰でもへの長い応答のための十分な時間を過ごしたことがない、と私は確信し、今非常に明確な応答として機能するように、この記事へのリンクをしておこう:-)
ウィリーTarreau

2
プロキシとバックエンド間の接続がhttpsである場合、サーバー側でkeepAliveに利点がありますか?
-avmohan

「HTTPサーバーは各クライアント接続に一定量のメモリを割り当てます」はい、しかしそれらの接続はほとんどありません(?)ロードバランサーごとに1つだけですか?インターネット上のクライアントごとに1つではない(?)
Raedwald

@Raedwald、ロードバランサーが各バックアップサーバーへの単一HTTP接続の作成に制限されている場合、かなり悪い時間を過ごすことになります。:-)
ThatGraemeGuy

7

Nginxは両側でキープアライブをサポートしています。


プロキシとバックエンドの間に遅延がある場合、キープアライブはバックエンドに役立ちますか?また、キープアライブ接続の最適な数は何を許可しますか?
CMCDragonkai 14

@CMCDragonkaiバックエンドが専用サーバーに配置されている場合、ネットワークに依存する接続遅延を回避すると便利です。黄金色の意味はありません。最適な数は、主に設定、環境、アプリケーション、リクエストパターンによって異なります。
VBart 14

これを解決する方程式を見つけたいと思います!
CMCDragonkai 14

2
私が読んだ質問は、nginxがアップストリームでキープアライブをサポートするかどうかではなく、nginxがアップストリーム側でキープアライブを無効にすることをサポートするかどうかを尋ねていることです。
-user45793
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.