![带有“header(host)”检查的 haproxy acl 不适用于 mqtt 后端](https://linux22.com/image/736204/%E5%B8%A6%E6%9C%89%E2%80%9Cheader%EF%BC%88host%EF%BC%89%E2%80%9D%E6%A3%80%E6%9F%A5%E7%9A%84%20haproxy%20acl%20%E4%B8%8D%E9%80%82%E7%94%A8%E4%BA%8E%20mqtt%20%E5%90%8E%E7%AB%AF.png)
我尝试应用 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 代理。