HAProxy 多后端 TCP/HTTP 模式仅适用于一个后端

HAProxy 多后端 TCP/HTTP 模式仅适用于一个后端
listen mqtt-ssl
    bind *:8883 ssl no-sslv3 crt /my.pem verify required ca-file /my/pem/all_cas.pem crl-file /my/pem/all_crls.pem
    mode tcp
    option tcplog
    log global
    maxconn 50000
    tcp-request inspect-delay 30s
    use_backend pki unless { req.payload(0,0),mqtt_is_valid }
    default_backend emqx_k8s_svc

backend pki
    mode http
    server pki.my.domain someIP:443 ssl verify none

backend emqx_k8s_svc
    mode tcp
    log global
    server emqx1 emqx-ee.emqx:1883 check inter 30s downinter 30s fall 1 rise 1

鉴于上述 haproxy.cfg 代码片段,我确认以下问题:

当我在监听地址上执行 curl/wget 时,请求通常会转发到backend pki,这是理所当然的。但与此同时,当尝试连接到 时,backend emqx_k8s_svcMosquitto 客户端停留在“发送连接”处,并且未建立任何连接。

我怎样才能有这样的条件:如果请求负载是 MQTT 类型,则将其转发到default_backend,如果连接不是 MQTT(例如,http 客户端),则将其转发到backend pki

我也尝试了以下方法,但没有解决:

tcp-request inspect-delay 30s
use_backend pki if !{ req.payload(0,0),mqtt_is_valid }
use_backend emqx_k8s_svc if { req.payload(0,0),mqtt_is_valid }
default_backend emqx_k8s_svc
------------------------------
tcp-request inspect-delay 10s
use_backend pki if { ssl_fc }
use_backend emqx_k8s_svc if { req.payload(0,0),mqtt_is_valid }
default_backend emqx_k8s_svc

注意:所有内容都在 Kubernetes 环境中运行,除了在backend pki其他地方(但可访问)的 - HAProxy 版本:2.5

相关内容