如何在Nginx中配置MQTT?附已尝试的配置代码
Nginx配置MQTT反向代理与集群负载均衡
嘿,看你已经在搭建Nginx代理MQTT集群的路上了,我帮你把现有配置理清楚,再补全关键的缺失部分,让整个配置真正跑起来!
首先,你创建的/usr/local/etc/nginx/mqtt.conf配置内容可以整理成清晰的代码块,方便后续维护:
log_format mqtt '$remote_addr [$time_local] $protocol $status $bytes_received ' '$bytes_sent $upstream_addr'; upstream hive_mq { server 127.0.0.1:18831; # node1 server 127.0.0.1:18832; # node2 server 127.0.0.1:18833; # node3 zone tcp_mem 64k; } match mqtt_conn { # 发送带有客户端ID "nginx health check"的CONNECT包 send \x10\x20\x00\x06\x4d\x51\x54\x54\x04\x02\x00\x3c\x00\x0f\x6e\x67\x69\x6e\x78\x20\x68\x65\x61\x6c\x74\x68\x20\x63\x68\x65\x63\x6b; expect ~* \x20\x02; }
接下来,还有几个关键步骤必须完成,不然这个配置没法生效:
1. 在Nginx主配置中引入mqtt.conf
找到你的Nginx主配置文件(一般是/usr/local/etc/nginx/nginx.conf),注意要在http块外面添加stream模块配置——因为MQTT是TCP协议,不属于HTTP模块的范畴:
stream { include /usr/local/etc/nginx/mqtt.conf; server { listen 1883; # 对外提供MQTT服务的标准端口 proxy_pass hive_mq; proxy_protocol on; # 如果你的后端MQTT服务器支持Proxy Protocol,开启它能让后端拿到客户端真实IP proxy_timeout 1d; # MQTT是长连接,得设个较长的超时时间,避免连接被无故断开 proxy_connect_timeout 10s; # 启用健康检查,自动剔除挂掉的节点 health_check match=mqtt_conn interval=5s falls=2 rises=2; } }
2. 关键配置点解释
- log_format mqtt:专门给MQTT流量定制的日志格式,能记录客户端IP、请求时间、协议状态、收发字节数以及后端节点地址,出问题的时候排查起来很方便。
- upstream hive_mq:定义你的MQTT集群节点,
zone tcp_mem 64k用来在Nginx的worker进程间共享节点状态,让负载均衡的效果更稳定。 - match mqtt_conn:这是Nginx的TCP健康检查规则——发送一个符合MQTT协议规范的CONNECT包,期望收到后端返回的CONNACK成功响应(
\x20\x02就是连接成功的标识),以此判断节点是否存活。 - stream块:Nginx处理TCP/UDP流量的核心模块,必须放在http块外面配置,这里监听1883端口,把客户端的MQTT连接转发到集群节点,同时开启健康检查保证服务可用性。
3. 验证配置并重启Nginx
配置完别急着重启,先检查下配置有没有语法错误:
nginx -t
如果输出显示test is successful,就可以重启Nginx让配置生效了:
nginx -s reload
这样你的Nginx就可以完美充当MQTT的反向代理和负载均衡器,把客户端的连接均匀分发到后端的HiveMQ节点,还能自动跳过不健康的节点,保证服务的稳定性。
内容的提问来源于stack exchange,提问作者Rock Admin
相关产品推荐
相关产品推荐

