如何在 HAProxy 中强制基于 SNI 的特定路由?

如何在 HAProxy 中强制基于 SNI 的特定路由?

我有以下 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

相关内容