![如何通过 HTTPS 使用 HAProxy 进行服务器修复](https://linux22.com/image/1392747/%E5%A6%82%E4%BD%95%E9%80%9A%E8%BF%87%20HTTPS%20%E4%BD%BF%E7%94%A8%20HAProxy%20%E8%BF%9B%E8%A1%8C%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%BF%AE%E5%A4%8D.png)
我之前在 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
我不知道如何重写此配置以使对端口 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
重新启动 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.
答案1
当您创建 HTTPS 代理时(取决于您使用的 HAProxy 版本,以及它是否编译了 SSL 支持),您有两种不同的方式来处理流量。
一个是您使用此配置所采用的路线 - 使其成为直接 TCP 代理,并将流量直接传递到后端服务器而不进行任何 Layer7 处理。
mode tcp
当处于 tcp 模式时,您将无法使用任何专门用于 http 代理的选项 - 在您的情况下,您将丢失统计端点、cookie 处理、“X-Forwarded-For”标头的插入等。发出警告只是为了让您知道该代理仍将运行,但它可能不会按您期望的方式运行,因为您使用仅特定于 http 代理的选项。
您可以采取的另一种方法是终止 HAProxy 服务器上的 SSL。在这种情况下,您的客户端和 HAProxy 之间有 HTTPS 流量,而 HAProxy 和您的后端服务器之间(通常)有未加密的 HTTP 流量。如果您要在 HAProxy 本身中执行 SSL 终止,而不是使用类似 pound 的东西,那么您需要运行编译了 SSL 支持的 v1.5。您得到的代理配置可能如下所示。
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
关于这一点,有几点需要注意。这个 listen 指令实际上是将 HTTP 和 HTTPS 代理合并到同一个代理中。它也可以很容易地被拆分,但除非是必需的,否则我喜欢像这样让事情变得更干净一些。此外,“密码”选项可以根据您的喜好或应用程序进行配置——我不是 SSL 专家,但这些选项对我来说很有用,所以我想我会把它们包括在内。