web-dev-qa-db-ja.com

httpプロキシの前でHAproxy(SSL)を使用する

私は現在、 polipo プロセス間でトラフィックの負荷を分散できるアプリを自分で構築しようとしています。 httpを使用すると、すべてが機能しますが、httpsに切り替えるとすぐに、haproxyは単に「400bad」リクエストを表示します。理由は何ですか。

これは私の設定です:

                                                <-> Polipo 1 (http) 
Client <----> (https) HAproxy <----> (http)     <-> Polipo 2 (http)
                                                <-> Polipo 3 (http)

これは私のHAproxy設定です:

global
  maxconn 4096 
  daemon
  tune.ssl.default-dh-param 2048
  ssl-default-bind-ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:RSA+AESGCM:RSA+AES:!aNULL:!MD5:!DSS
  ssl-default-bind-options no-sslv3
  pidfile <%= pid_file %>

defaults
  mode http
  maxconn 4096
  option  httplog
  option  dontlognull
  option forwardfor
  option http-server-close
  retries 3
  timeout connect 5s
  timeout client 60s
  timeout server 60s




frontend rotating_proxies
  bind *:<%= port %> ssl crt /etc/ssl/private/mydomain.pem
  reqadd X-Forwarded-Proto:\ https
  default_backend polipo
  option http_proxy


backend polipo
  option http_proxy
  http-response replace-value Location ^http://(.*)$ https://\1
  redirect scheme https if !{ ssl_fc }
  balance leastconn



  <% backends.each do |b| %>
  server <%= b[:name] %><%= b[:port] %> <%= b[:addr] %>:<%= b[:port] %> check maxconn 4096
  <% end %>

よくわからない

http-response replace-value Location ^http://(.*)$ https://\1

それは正確にはどういう意味ですか? Polipoはhttp(暗号化されていない)のみを話している。 HAproxyは単にSSLオフロードを実行する必要があります。

2
sunwave121

tl; dr:大丈夫です。パブリックURLです。option http_proxyを削除してください。

引用 ドキュメント

Location応答ヘッダーは、ページをリダイレクトするURLを示します。 3xx(リダイレクト)または201(作成済み)ステータス応答が提供された場合にのみ意味を提供します。

リダイレクトはユーザーエージェントによって実行される必要があるため、HAProxyにアクセスするときに使用される正しいURLを提示する必要があります。

HAProxy docs から:

オプションhttp_proxy [...]このモードでは、サーバーは宣言されず、接続は「http://」スキームの後にURLで見つかったIPアドレスとポートに転送されます。

これはあなたが望むものではありません。ディレクティブを削除します。

1
fuero