我正在尝试将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工作但直接工作,我真的很感激你的建议。
答案 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