Skip to content

Nginx配置EMQX负载均衡

请先搭建集群,参考EMQX集群部署

EMQX LB NGINX

修改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开启代理协议

  1. 创建时通设置变量EMQX_LISTENERS__TCP__DEFAULT__PROXY_PROTOCOLtrue
  2. 控制面板查看设置

image-20250508165328336

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)