我正在使用 HAProxy 平衡 3 个前端,但我想使用总是同一个后端/服务器,但有一个特定的子域 (admin.mysite.com)。HAProxy
没有终止 SSL(有人告诉我这不好,最好用 nginx 来做),所以我使用 req_ssl_sni 来检测子域,因为我不能使用 acl 规则。
但出于某种原因,对于某些用户,HAProxy 在请求子域时连接到了错误的前端,我不明白为什么,这是我的配置:
global
debug
maxconn 16000
daemon
ssl-default-bind-options force-tlsv12
tune.ssl.default-dh-param 2048
stats socket /var/run/haproxy/info.sock mode 600 level admin
stats timeout 2m
defaults
log global
retries 0
timeout connect 5s
timeout server 50s
timeout client 50s
default-server init-addr libc,none
frontend frontend-http
bind *:80
maxconn 10000
mode http
option forwardfor
use_backend admin-nossl if { hdr_dom(host) -i admin.mysite.com }
use_backend users-nossl if { hdr_dom(host) -i www.mysite.com }
use_backend users-nossl if { hdr_dom(host) -i mysite.com }
default_backend redirect-https
frontend frontend-https-public
bind *:443
maxconn 10000
mode tcp
option tcplog
tcp-request inspect-delay 5s
tcp-request content accept if { req.ssl_hello_type 1 }
use_backend admin if { req_ssl_sni -i admin.mysite.com }
use_backend users if { req_ssl_sni -i www.mysite.com }
use_backend users if { req_ssl_sni -i mysite.com }
backend redirect-https
mode http
redirect scheme https code 301
backend admin-nossl
mode http
server frontend01 [//FRONT_1_IP//]:80 check resolve-prefer ipv4
backend admin
mode tcp
server frontend01 [//FRONT_1_IP//]:443 check resolve-prefer ipv4 send-proxy
backend users-nossl
mode http
balance roundrobin
server frontend01 [//FRONT_1_IP//]:80 check resolve-prefer ipv4
backend users
mode tcp
balance roundrobin
stick-table type binary len 32 size 30k expire 30m
stick on src
server frontend01 [//FRONT_1_IP//]:443 check resolve-prefer ipv4 send-proxy
server frontend02 [//FRONT_2_IP//]:443 check resolve-prefer ipv4 send-proxy
server frontend03 [//FRONT_3_IP//]:443 check resolve-prefer ipv4 send-proxy
这是 HAProxy 的一个错误还是我的配置有问题?
答案1
SNI 需要客户端支持。换句话说,您可以要求那些没有被重定向到管理后端的人尝试使用已知良好的 Web 浏览器来确认这实际上是您的配置还是 HAProxy 本身的问题。
话虽如此,但我认为从几年前开始,就没有理由不让 HAProxy 终止客户端 TLS 流量并启动自己的 TLS 会话到后端服务器,这样如果需要,您可以以更灵活、更先进的方式使用它。除非您有大量客户端流量(在这种情况下,您可能还是应该为您的服务器投资 TLS 卸载硬件),否则能够在传入客户端流量到达 Web 服务之前对其进行分析所带来的好处通常会超过任何性能开销。