我尝试应用 HAProxy acl 来选择 mqtt 代理后端,但不起作用。我尝试了以下 HAProxy 配置。
环境:
HAProxy 版本:1.8.19 MQTT Broker:EMQ X Broker 版本 3.0
示例配置 1
listen mqtt
bind *:80
mode tcp
maxconn 50000
acl mqtt-request hdr_beg(host) -i mqtt.mydoamin.com
use_backend backend_mqtt if mqtt-request
backend backend_mqtt
mode tcp
server smg1 192.168.0.100:1883 check
示例配置 2
listen mqtt
bind *:80
mode tcp
maxconn 50000
acl mqtt_request req.payload(4,15) -m sub mqtt.mydoamin.com
tcp-request content accept if mqtt_request
use_backend backend_mqtt if mqtt_request
backend backend_mqtt
mode tcp
server smg1 192.168.0.100:1883 check
示例配置 3
listen mqtt
bind *:80
mode tcp
maxconn 50000
acl host_mqtt hdr(host) -i mqtt.mydoamin.com
use_backend backend_mqtt if host_mqtt
backend backend_mqtt
mode tcp
server smg1 192.168.0.100:1883 check
示例配置 4
listen mqtt
bind *:80
mode tcp
maxconn 50000
use_backend backend_mqtt if { hdr_end(host) -i mqtt.mydoamin.com }
backend backend_mqtt
mode tcp
server smg1 192.168.0.100:1883 check
上述配置均无法匹配主机(mqtt.mydoamin.com)。
答案1
如果您在 haproxy 中使用,mode tcp
那么您无法匹配 HTTP 标头等hdr()
。
此连接是否使用 HTTP?然后使用mode http
。如果不是(您实际上在端口 80 上使用 MQTT 协议),则无法匹配主机名,因为该主机名不会通过连接进行通信。您只能通过使用不同的 IP 地址和/或不同的端口号在一个系统上使用不同的 MQTT 代理。