HAProxyには、クライアント側(クライアント<-> HAProxy)でHTTPキープアライブを有効にする機能がありますが、サーバー側(HAProxy <->サーバー)では無効にします。
一部のクライアントは衛星経由でWebサービスに接続しているため、レイテンシは約600ミリ秒です。キープアライブを有効にすると、処理速度が少し向上すると思います。私は正しいですか?
これはNginxでサポートされていますか?これは、他のソフトウェアおよびハードウェアロードバランサーで広く実装されている機能ですか? HAProxy以外に他に何がありますか?
編集:私の回答は、この種のことがロードバランサー/リバースプロキシで一般的なものであるかどうかという、編集されていない元の質問のみを対象としています。 nginx /製品Xがこれをサポートしているかどうかはわかりませんが、リバースプロキシの99.9%はHAproxyを使用した経験です。
正しい。クライアント側ではHTTPキープアライブが、サーバー側ではありません。
どうして?
いくつかの詳細を分解すると、これがメリットである理由がすぐにわかります。この例では、www.example.comというページを読み込んでいて、そのページに3つの画像img [1-3] .jpgが含まれているとします。
4つの別々のTCPセッションが確立されてから閉じられていることに注意してください。
HTTPキープアライブを使用すると、単一のTCP接続で複数のHTTPリクエストを次々に処理できます。
キープアライブでは、1つのTCP接続のみが確立され、最終的に閉じられることに注意してください。
これに答えるには、クライアントとサーバー間のTCP接続を確立するために必要なことを理解する必要があります。これはTCP 3ウェイハンドシェイクと呼ばれます。
ネットワークにはレイテンシがあるため、3ウェイハンドシェイクの各ステップには一定の時間がかかります。クライアントとサーバーの間に30ミリ秒あるとしましょう。TCP接続の確立に必要なIPパケットの往復送信は、TCP接続の確立に3 x 30ms = 90ミリ秒かかることを意味します。
これはあまり聞こえないかもしれませんが、元の例で4つの個別のTCP接続を確立する必要があると考えると、これは360ミリ秒になります。クライアントとサーバー間の待ち時間が30ミリ秒ではなく100ミリ秒の場合はどうなりますか?次に、4つの接続が確立するのに1200ミリ秒かかります。
さらに悪いことに、一般的なWebページは、ロードするために3つ以上の画像を必要とする場合があり、クライアントが要求する必要のある複数のCSS、JavaScript、画像、またはその他のファイルがある場合があります。ページが他の30個のファイルをロードし、クライアントサーバーの待ち時間が100ミリ秒である場合、TCP接続の確立にどのくらいの時間がかかりますか?
他の30個のファイルを参照するWebページをロードするために、TCP接続の確立に9.3秒かかりました。また、HTTPリクエストの送信とレスポンスの受信に費やされた時間も考慮されません。
HTTPキープアライブを使用すると、1つのTCP接続を確立するだけで済みます。これには300ミリ秒かかります。
HTTPリバースプロキシ(HAproxyなど)は通常、プロキシの対象となるバックエンドサーバーの非常に近くに配置されます。ほとんどの場合、リバースプロキシとそのバックエンドサーバー間の遅延は1ミリ秒未満になるため、TCP接続の確立は、クライアント間の接続よりもはるかに高速です。
それは理由の半分だけです。 HTTPサーバーは、クライアント接続ごとに一定量のメモリを割り当てます。キープアライブを使用すると、接続をアライブに維持します。さらに、キープアライブタイムアウトに達するまで、サーバーで一定量のメモリを使用し続けます。これは、サーバーの構成によっては最大15秒になる場合があります。 。
したがって、HTTPリバースプロキシのサーバー側でキープアライブを使用した場合の影響を考慮すると、メモリの必要性が高まりますが、プロキシとサーバー間のレイテンシが非常に低いため、 TCPの3ウェイハンドシェイクにかかる時間の短縮のため、通常、このシナリオでは、プロキシとWebサーバー間のキープアライブを無効にすることをお勧めします。
免責事項:はい、この説明では、通常、ブラウザーがサーバーへの複数のHTTP接続を並行して確立するという事実は考慮されていません。ただし、ブラウザが同じホストに対して行う並列接続の数には制限があり、通常、これはキープアライブを望ましいものにするのに十分なほど小さいです。
Nginxは両側でキープアライブをサポートしています。