Nginx配置EMQX负载均衡
请先搭建集群,参考
EMQX
集群部署
修改emqx1
注意宿主机的
1883
端口不能映射给EMQX
,我们需要nginx
代理它,而非直连。请使用其他端口映射
Nginx配置
nginx.conf
json
# ~/nginx_emqx_lb_config/nginx.conf
worker_processes 1; # 或者 auto
pid /var/run/nginx.pid;
# error_log /var/log/nginx/error.log info; # 可以取消注释以获取更多日志
# 工作线程数
events {
worker_connections 20480;
}
stream {
# 定义 EMQX 后端服务器集群
upstream emqx_mqtt_cluster {
# down:表示当前的 server 暂时不参与负载
# max_fails:允许请求失败的次数;默认为 1
# fail_timeout:失败超时时间,默认 10s, max_fails 达到次数后暂停的请求时间
# backup:其它所有的非backup机器down或者忙的时候,请求backup机器
# EMQX 容器在 emqx-net 网络中的名称和它们监听的 MQTT 端口
least_conn; #负载均衡算法,最小连接数
server 127.0.0.1:18888 max_fails=2 fail_timeout=30s;
server 127.0.0.1:18889 max_fails=2 fail_timeout=30s;
}
# Nginx 监听的服务器,用于 MQTT TCP 连接
server {
listen 1883;
# 将流量转发到上面定义的 upstream
proxy_pass emqx_mqtt_cluster;
# 代理协议(空获取请求的真实IP和端口),对应后端监听器(这里是EMQX)也需要启用 proxy_protocol
proxy_protocol on;
proxy_connect_timeout 5s;
# 默认心跳时间为 10 分钟
proxy_timeout 1800s;
proxy_buffer_size 1M;
tcp_nodelay on;
}
}
测试是否正确
bash
sudo nginx -t
EMQX开启代理协议
- 创建时通设置变量
EMQX_LISTENERS__TCP__DEFAULT__PROXY_PROTOCOL
为true
- 在控制面板查看设置
mermaid
sequenceDiagram
participant Publisher
participant Broker
participant Subscriber
Note over Publisher, Broker: 阶段1: 消息从发布者到代理
Publisher->>Broker: PUBLISH (Topic, Payload, QoS 1, PacketId=X, DUP=0)
Note right of Publisher: Publisher 存储 PUBLISH (PacketId=X) 等待 PUBACK
Broker->>Publisher: PUBACK (PacketId=X)
Note right of Publisher: Publisher 收到 PUBACK, 丢弃已存储的 PUBLISH (PacketId=X)
Note over Broker, Subscriber: 阶段 2: 消息从代理到订阅者 (假设订阅时QoS也为1)
Broker->>Subscriber: PUBLISH (Topic, Payload, QoS 1, PacketId=Y, DUP=0)
Note right of Broker: Broker 存储 PUBLISH (PacketId=Y) 等待 PUBACK
Subscriber->>Broker: PUBACK (PacketId=Y)
Note right of Broker: Broker 收到 PUBACK, 丢弃已存储的 PUBLISH (PacketId=Y)