我正在使用多个 HAProxy 负载均衡器、Nginx Web 服务和 MySQL 服务器构建一个高可用性站点。站点需要能够在负载均衡器或 Web 服务器节点离线的情况下继续运行,而不会中断对访问者的服务。目前,我有两个运行 HAProxy 的盒子,它们使用 keepalived 共享一个虚拟 IP,它们转发到两个运行 Nginx 的 Web 服务器,然后这两个 Web 服务器使用 MySQL 复制绑定到两个 MySQL 盒子,并使用 heartbeat 共享一个虚拟 IP。除了通过 HAProxy 的 SSL 流量外,一切都正常工作。我运行的是版本 1.5 dev12,其中编译了 openssl 支持。当我尝试通过 https 导航到 haproxy 的虚拟 IP 时,我收到消息:纯 HTTP 请求已发送到 HTTPS 端口。这是我到目前为止的 haproxy.cfg,主要从其他帖子中汇编而成:
global
log 127.0.0.1 local0
log 127.0.0.1 local1 notice
# log 127.0.0.1 local0
user haproxy
group haproxy
daemon
maxconn 20000
defaults
log global
option dontlognull
balance leastconn
clitimeout 60000
srvtimeout 60000
contimeout 5000
retries 3
option redispatch
listen front
bind :80
bind :443 ssl crt /etc/pki/tls/certs/cert.pem
mode http
option http-server-close
option forwardfor
reqadd X-Forwarded-Proto:\ https if { is_ssl }
reqadd X-Proto:\ SSL if { is_ssl }
server web01 192.168.25.34 check inter 1s
server web02 192.168.25.32 check inter 1s
stats enable
stats uri /stats
stats realm HAProxy\ Statistics
stats auth admin:*********
知道为什么 SSL 流量无法正确传递吗?另外,您还推荐其他更改吗?我仍然需要配置日志记录,所以不用担心该部分。提前感谢您的帮助。
答案1
使用 SSL 时,您必须使用前端/后端,而不是监听。原因是使用监听时,通过一个端口进入 haproxy 的连接将转到同一端口上的后端服务器。因此,443 上的 SSL 请求由 haproxy 解密,然后发送到端口 443 上的 Web 服务器,该服务器正在等待 SSL 连接。(这就是您收到该错误的原因。)使用前端/后端,您可以告诉 haproxy 在前端的一个端口上接受连接,但在后端完成与另一个端口的连接。
或者,您可以重新配置您的 Web 服务器以在端口 443 上接受 http 请求(而不是 https 请求)。就我个人而言,我不会这样做,因为这是相当不标准的,而您会期望执行 SSL 卸载的负载均衡器在 443 上接受连接并在端口 80 上完成它。