SSL over HAProxy问题

时间:2013-12-10 19:47:50

标签: ssl https haproxy

我正在尝试将HTTPS Web服务器放在HAProxy负载均衡器后面。 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工作但直接工作,我真的很感激你的建议。

1 个答案:

答案 0 :(得分:2)

您将第4层和第7层负载平衡混淆。要使用hdr_dom分隔请求,您需要第7层仅适用于HTTP,因为您可能认为HTTPS适用于第4层。

因为haproxy无法检查主机,所以没有ifs返回true并且没有选择后端,要修复你应该添加default_backend条目。

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
    default_backend core_https