在Nginx反向代理后部署EMQ X MQTT Broker失败问题排查
Nginx反向代理EMQ X MQTT Broker失败问题及解决方法
问题场景
尝试在Nginx反向代理后部署EMQ X MQTT Broker,两者运行在同一Docker Compose环境中,但连接失败。
初始配置
Nginx配置(nginx.conf)
error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid; events { worker_connections 1024; } stream { upstream stream_backend { server 127.0.0.1:1883 weight=1; } server { listen 8080; #proxy_send_timeout 2h; #proxy_read_timeout 2h; proxy_connect_timeout 150s; proxy_timeout 150s; proxy_pass stream_backend; proxy_buffer_size 3M; tcp_nodelay on; #proxy_protocol on; } }
EMQ X配置(emqx.conf)
node { name = "emqx@127.0.0.1" cookie = "mysecret" data_dir = "data" } listeners.tcp.default { bind = "127.0.0.1:1883" proxy_protocol = true proxy_protocol_timeout = 30 enable_authn = false } dashboard { listeners.http { bind = 18083 } }
错误信息
连接时EMQ X抛出以下错误:
emqx | 2023-09-26T23:20:47.213039+00:00 [error] supervisor:
'esockd_connection_sup - <0.2858.0>', errorContext:
connection_shutdown, reason: {invalid_proxy_info,<<"GET /mqtt
HTTP/1.1
">>}, offender:
[{pid,<0.3309.0>},{name,connection},{mfargs,{emqx_connection,start_link,[#{enable_authn
=> false,limiter => undefined,listener => {tcp,default},zone => default}]}}]
问题原因
错误信息显示EMQ X收到了HTTP格式的请求而非预期的Proxy Protocol协议数据,核心矛盾在于:
- EMQ X配置中开启了
proxy_protocol = true,要求连接携带Proxy Protocol头 - 但Nginx配置注释掉了
proxy_protocol on;,未发送对应协议头,导致EMQ X无法解析连接信息,判定为无效代理数据
解决方案
有两种适配方案可选:
- 启用Proxy Protocol匹配:在Nginx的stream server配置中取消注释
proxy_protocol on;,让Nginx发送Proxy Protocol头,与EMQ X配置保持一致 - 关闭Proxy Protocol:修改EMQ X配置,移除
proxy_protocol = true和proxy_protocol_timeout = 30,让EMQ X直接处理原生MQTT连接
用户采用第二种方案解决了问题,修改后的EMQ X配置如下:
修改后的emqx.conf
node { name = "emqx@127.0.0.1" cookie = "mysecret" data_dir = "data" } listeners.tcp.default { bind = "127.0.0.1:1883" } dashboard { listeners.http { bind = 18083 } }
内容的提问来源于stack exchange,提问作者EricStolz
相关产品推荐
相关产品推荐

