Haproxy

帶有“標頭(主機)”檢查的 haproxy acl 不適用於 mqtt 後端

  • April 9, 2019

我正在嘗試應用 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)。

如果您mode tcp在 haproxy 中使用,則無法將 HTTP 標頭與hdr()etc匹配。

是否在此連接上使用 HTTP?然後使用mode http. 如果不是(您實際上是在埠 80 上使用 MQTT 協議),那麼您無法匹配主機名,因為這不是通過連接進行通信的。您只能通過使用不同的 IP 地址和/或不同的埠號在一個系統上使用不同的 MQTT 代理。

引用自:https://serverfault.com/questions/962112