【发布时间】:2013-12-28 12:32:26
【问题描述】:
我正在尝试在 HAProxy 负载平衡器后面放置一个 HTTPS Web 服务器。
HTTPS 服务器在端口 8000 上的 Node.js 上运行,拥有所有正确的 SSL 证书和密钥,如果我尝试通过 URL 直接访问它,它就可以工作,例如https://ssltest.mydomain.com:8000/。我还可以使用openssl s_client -connect ssltest.mydomain.com:8000 检查 SSL 连接,它显示的数据似乎正确。
此 HTTPS 服务器的前端是另一个子域,例如app.mydomain.com,它在默认的 SSL 端口 443 上运行。
但是当我尝试从浏览器访问 https://app.mydomain.com 时,我收到了 SSL 错误。上面的命令行检查也失败了:openssl s_client -connect app.mydomain.com:443 -state -debug
下面是我的 HA 代理配置的样子:
global
log /dev/log local0 info
log /dev/log local0 notice
maxconn 20000
user haproxy
group haproxy
daemon
spread-checks 5
defaults
log global
mode tcp
option dontlognull
retries 3
option redispatch
timeout connect 30s
timeout client 30s
timeout server 30s
timeout check 5s
balance roundrobin
frontend https_proxy
bind :443
acl is_app hdr_dom(host) -i app.mydomain.com
acl is_rest hdr_dom(host) -i rest.mydomain.com
acl is_io hdr_dom(host) -i io.mydomain.com
use_backend core_https if is_app
use_backend core_rest_api if is_rest
use_backend core_www_io if is_io
backend core_https
server www1 10.0.0.174:8000 maxconn 25 check inter 5s rise 18 fall 2
backend core_www_io
server io1 10.0.0.174:8100 maxconn 25 check inter 5s rise 18 fall 2
backend core_rest_api
server api1 10.0.0.174:8200 maxconn 25 check inter 5s rise 18 fall 2
我不明白为什么这不能通过 HAProxy 工作,而是直接工作,我非常感谢你的建议。
【问题讨论】:
-
我对 haproxy 了解不多,但在我看来,您想要访问 3 个不同的后端,具体取决于客户端在其 Host: http 标头中发送的主机。这不适用于 SSL,因为 HTTP 标头直到 SSL 协商之后才会发送到服务器,并且 SSL 协商已经知道目标主机名才能选择正确的证书。
-
感谢您的回复,但在这种情况下,是否有 1,3 个或更多不同的主机并不重要。正如我所说,这对它们中的任何一个都不起作用,但是在直接连接到主机时起作用,没有 HAProxy