我有以下 HAProxy 配置:
listen sni-443
bind *:443
mode tcp
timeout connect 4s
timeout client 3m
timeout server 3m
tcp-request inspect-delay 5s
tcp-request content accept if { req.ssl_hello_type 1 }
acl no-ssl req.ssl_hello_type 0
use-server backend1.default.svc.cluster.local if !no-ssl { req_ssl_sni -i www.example.com }
server backend1.default.svc.cluster.local 10.96.245.95:443 weight 0
use-server backend2.default.svc.cluster.local if !no-ssl { req_ssl_sni -i demo.example.com }
server backend2.default.svc.cluster.local 10.96.184.199:443 weight 0
如果我访问www.example.com
,一切都很好。但是当我在高频率重新加载后这样做时demo.example.com
(在浏览器中按下 Shift-Ctrl-R),我最终会进入demo.example.com
。是的,确实如此:我www.example.com
在浏览器中打开,但 HAProxy 将其路由到 backend2(返回错误)。
显然,HAProxy 并没有完全理解这两个服务并不是负载平衡的替代品,而是截然不同的产品。我该如何确保最后www.example.com
以 backend1 结尾?
答案1
这是来自文档的一个示例req_ssl_sni
:
tcp-request inspect-delay 5s
tcp-request content accept if { req_ssl_hello_type 1 }
use_backend bk_allow if { req_ssl_sni -f allowed_sites }
default_backend bk_sorry_page
您可能需要tcp-request inspect-delay
设置某些内容,因为不设置它意味着 haproxy 根本不等待,也不知道 SNI 是什么。
更详细的解释在文档tcp-request inspect-delay