使用 HAProxy 和 Nginx 的 SSL 问题

使用 HAProxy 和 Nginx 的 SSL 问题

我正在使用多个 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 上完成它。

相关内容