如何通过 HTTPS 使用 HAProxy 进行服务器固定

Dan*_*orn 1 ssl load-balancer

我之前在 HAProxy 中为 Web 服务器创建了一个负载均衡器,但那个是 HTTP,而不是 HTTPS。

这是我之前使用的配置。

listen appname 0.0.0.0:80
    mode http
    stats enable
    stats uri /haproxy?stats
    stats realm Strictly\ Private
    stats auth admin:XXXXXXXX
    balance roundrobin
    option http-server-close
    timeout http-keep-alive 3000
    option forwardfor
    cookie SRVNAME insert
    server lamp1 10.128.24.97:80 cookie S1 check
    server lamp2 10.128.24.98:80 cookie S2 check
Run Code Online (Sandbox Code Playgroud)

我不知道如何重写此配置以使端口 443 的请求可供 HAProxy 后面的服务器使用。我复制了上一个并将端口更改为 443。但是我收到了很多错误。如何将配置转换为对 HTTPS / SSL 连接有效?

listen httpsapp 0.0.0.0:443
    mode tcp
    stats enable
    stats uri /haproxy?stats
    stats realm Strictly\ Private
    stats auth admin:XXXXXXXXXXX
    balance roundrobin
    option http-server-close
    timeout http-keep-alive 3000
    option forwardfor
    cookie SRVNAME insert
    server lamp1 10.128.24.97:443 cookie S1 check
    server lamp2 10.128.24.98:443 cookie S2 check
Run Code Online (Sandbox Code Playgroud)

重新启动 HAProxy 时收到警告

[WARNING] 007/090716 (2409) : config : cookie will be ignored for proxy 'httpsapp' (needs 'mode http').
[WARNING] 007/090716 (2409) : config : 'option httplog' not usable with proxy 'httpsapp' (needs 'mode http'). Falling back to 'option tcplog'.
[WARNING] 007/090716 (2409) : config : 'stats' statement ignored for proxy 'httpsapp' as it requires HTTP mode.
[WARNING] 007/090716 (2409) : config : 'option forwardfor' ignored for proxy 'httpsapp' as it requires HTTP mode.
[WARNING] 007/090716 (2409) : config : 'option http-server-close' ignored for proxy 'httpsapp' as it requires HTTP mode.
[WARNING] 007/090716 (2409) : config : proxy 'httpsapp' : ignoring cookie for server 'lamp1' as HTTP mode is disabled.
[WARNING] 007/090716 (2409) : config : proxy 'httpsapp' : ignoring cookie for server 'lamp2' as HTTP mode is disabled.
Run Code Online (Sandbox Code Playgroud)

小智 5

当您创建 HTTPS 代理时(取决于您使用的 HAProxy 版本,以及它是否编译了 SSL 支持),您有 2 种不同的方式来处理流量。

一种是您使用此配置所采取的路线 - 使其成为直接 TCP 代理,并将流量直接传递到后端服务器,而不进行任何第 7 层处理。

mode tcp
Run Code Online (Sandbox Code Playgroud)

在 tcp 模式下,您将无法使用任何专门用于 http 代理的选项 - 在您的情况下,您将丢失统计端点、cookie 处理、“X-Forwarded-For”的插入警告的目的只是让您知道此代理仍然可以运行,但它可能不会按您的预期运行,因为您使用仅特定于 http 代理的选项。

您可以采取的另一种方法是终止 HAProxy 服务器上的 SSL。在这种情况下,客户端和 HAProxy 之间有 HTTPS 流量,HAProxy 和后端服务器之间(通常)有未加密的 HTTP 流量。如果您要在 HAProxy 本身中执行 SSL 终止,而不是使用 pound 之类的东西,那么您需要运行 v1.5 并编译了 SSL 支持。您生成的代理配置可能如下所示。

listen appname
  bind 0.0.0.0:80
  bind 0.0.0.0:443 ssl crt /path/to/your/cert.pem ciphers TLSv1+HIGH:!SSLv2:RC4+MEDIUM:!aNULL:!eNULL:!3DES:@STRENGTH
  mode http
  stats enable
  stats uri /haproxy?stats
  stats realm Strictly\ Private
  stats auth admin:XXXXXXXX
  balance roundrobin
  option http-server-close
  timeout http-keep-alive 3000
  option forwardfor
  cookie SRVNAME insert
  server lamp1 10.128.24.97:80 cookie S1 check
  server lamp2 10.128.24.98:80 cookie S2 check
Run Code Online (Sandbox Code Playgroud)

关于这一点有几点说明。该监听指令实际上将 HTTP 和 HTTPS 代理集中到同一个代理中。它可以很容易地重新拆分,但除非有必要,否则我喜欢让事情像这样保持干净一点。另外,“密码”选项可以根据您的喜好或应用程序进行配置——我不是 SSL 专家,但这些选项对我有用,所以我想我应该包括它们。