haproxy + stunnel + keep-alive?


10

HTTPSトラフィックを処理するためにhaproxy 1.4の前にstunnelを配置したいと思います。X-Forwarded-Forヘッダーを追加するためのstunnelも必要です。これは 、haproxy Webサイトからの「stunnel-4.xx-xforwarded-for.diff」パッチによって達成できます。

ただし、説明では次のように述べています。

このパッチはキープアライブでは機能しないことに注意してください...

私の質問は、これは私にとって実際に何を意味するのでしょうか?わからない

  1. これがキープアライブの場合
    • クライアントとstunnel
    • stunnelとhaproxy
    • またはhaproxyとバックエンドサーバー?
  2. これがパフォーマンスに与える影響:Webページに100個のアイコンがある場合、ブラウザーは100個の完全なSSL接続をネゴシエートする必要がありますか、それとも新しいTCP接続を作成するだけでSSL接続を再利用できますか?

回答:


12

これは、HTTPキープアライブに関するものです。これにより、複数のリソース要求が単一のTCPセッション(およびSSLを使用する場合は単一のSSLセッション)を介して送信されます。キープアライブがないと、要求されたリソースごとにSSLハンドシェイクが必要になるため、これはSSLサイトのパフォーマンスにとって非常に重要です。

したがって、ここでの懸念は、クライアントからバックエンドサーバーまでの1つの大きなキープアライブセッションです。これはパフォーマンスにとって重要なことであり、最近のHTTPサーバーでは当然のことと考えられていますが、このパッチではサポートされていません。その理由を見てみましょう。


キープアライブセッションは、次々と要求が増えるだけFINです。サーバーが1つの要求に対する応答を完了すると、サーバーはTCPセッションを終了するためのパケットを送信しません。クライアントは単純にヘッダーの別のバッチを送信できます。

そのパッチの機能を理解するために、キープアライブの会話の例を次に示します。

クライアント:

GET / HTTP/1.1
Connection: keep-alive
Host: domain.com
...

サーバ:

HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8
Server: Apache
Content-Length: 34
.... (other headers)
<html><head>content!</head></html>

ここで、非キープアライブ接続が停止します。ただし、キープアライブを使用すると、クライアントは別のクライアントを起動できます。

GET /images/some/image.on.the.page.jpg HTTP/1.1
Connection: keep-alive
Host: domain.com
...

プロキシのクライアントIDの場合、一部のリバースプロキシはX-Forwarded-For、各クライアント要求のヘッダーに追加できます。これにより、ロギングやその他のアプリケーションのニーズにおける健全性のために、要求が(リバースプロキシのIPから開始されるすべての要求の代わりに)どこから来ているかが上流のサーバーに通知されます。

X-Forwarded-Forヘッダは、各フルヘッダーが毎回送信されるように、キープアライブ接続を介して送信されたすべてのクライアントのリソース要求に注入する必要があります。X-Forwarded-Forヘッダーの処理と「実際の」要求IP であるヘッダーへの変換は、TCP-keep-alive-sessionごとではなく、要求ごとに行われます。そして、ねえ、単一のキープアライブセッションを使用して複数のクライアントからの要求にサービスを提供する素晴らしいリバースプロキシソフトウェアがあるかもしれません。

これは、このパッチが失敗する場所です。


そのサイトのパッチは、TCPセッションのバッファでストリーム内の最初のHTTPヘッダーセットの終わりを監視し、最初のヘッダーセットの終わりの後で新しいヘッダーをストリームに挿入します。これが完了すると、X-Forwarded-Forジョブが完了したと見なされ、新しいヘッダーセットの終わりのスキャンが停止します。このメソッドは、後続のリクエストを介して着信する将来のヘッダーすべてを認識しません。

それらを本当に非難することはできません。stunnelは、ストリームのコンテンツの処理と変換を行うために実際に構築されたのではありません。

これがシステムに与える影響は、キープアライブストリームの最初のリクエストでX-Forwarded-Forヘッダーが適切に挿入され、後続のすべてのリクエストが正常に機能することですが、ヘッダーはありません。

接続ごとに複数のクライアント要求を処理できる別のヘッダーインジェクションパッチがない(または、スタックオーバーフローで友人の助けを借りてこれを調整できる)場合を除き、SSL終了の他のオプションを確認する必要があります。


1
すばらしい答え、ありがとう。なぜここで質問するのが良いのかを思い出させます。
Chris Lercher、2011

1
stunnelでキープアライブヘッダーインジェクションを使用できるようにするには、ほとんどすべてのHTTPを話すことができなければならず、これは膨大な作業になります。とはいえ、HAproxyのPROXYプロトコル(stunnelまたはstudのパッチが必要)を使用して、HAproxyにヘッダーを挿入することもできます。詳細についてはドキュメントを参照しください(HAproxyサイトは部分的にATMがダウンしているようなので、Googleキャッシュから)
Holger Just


3

私が別のスレッドで投稿したものと同様に、HAProxyは1.5-dev12以降、両側でネイティブSSLをサポートしています。したがって、X-Forwarded-For、HTTPキープアライブ、および接続がSSL経由で行われたことをサーバーに通知するヘッダーを使用することは、次のように簡単です。

listen front
    bind :80
    bind :443 ssl crt /etc/haproxy/haproxy.pem
    mode http
    option http-server-close
    option forwardfor
    reqadd X-Forwarded-Proto:\ https if { is_ssl }
    server srv1 1.1.1.1:80 check ...
    ...

stunnelにパッチを適用するよりもはるかに簡単で、キープアライブをドロップする必要があるよりもはるかに優れています。


is_sslの代わりにssl_fcを使用することもできます
josch

2

Shaneからの優れた回答を拡張して、HAproxyの前でNginxをSSLターミネーターとして使用できます。最もレイテンシの影響を受けやすいクライアントとnginxの間のキープアライブを正しく処理し、クライアント要求ごとにバックエンドへの新しい接続を作成して、それぞれにX-FORWARDED-FORを送信します。


1
ただし、websocketが必要な場合、nginxは機能しません。
w00t 21:09

さらに、SSLセッションキャッシュもサポートします。
3molo 2012
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.