EMQX-5.3.1单机集群部署并基于Nginx实现负载均衡

一、 环境规划

  • 部署模式:单机多节点 Docker 集群
  • 节点数量:3(node1、node2、node3)
  • 集群发现策略:静态节点列表(static)
  • 负载均衡器:Nginx(Stream 模块代理 TCP 流量)

二、 EMQX 集群部署

1. 目录准备与授权
1
2
3
4
5
6
7
8
mkdir -p node1/data node1/logs
mkdir -p node2/data node2/logs
mkdir -p node3/data node3/logs

chown 1000 node1/ node2/ node3/
chown 1000 node1/data/ node1/logs/
chown 1000 node2/data/ node2/logs/
chown 1000 node3/data/ node3/logs/
2. Docker Compose 配置

创建 docker-compose.yml,保留原配置值,仅修正缩进与语法高亮:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
version: '3'
services:
emqx1:
image: emqx:5.3.1
container_name: emqx1
environment:
- "EMQX_NODE_NAME=emqx@node1.emqx.io"
- "EMQX_CLUSTER__DISCOVERY_STRATEGY=static"
- "EMQX_CLUSTER__STATIC__SEEDS=[emqx@node1.emqx.io,emqx@node2.emqx.io,emqx@node3.emqx.io]"
healthcheck:
test: ["CMD", "/opt/emqx/bin/emqx ctl", "status"]
interval: 5s
timeout: 25s
retries: 5
networks:
emqx-bridge:
aliases:
- node1.emqx.io
ports:
- 1883:1883
- 8083:8083
- 8084:8084
- 8883:8883
- 18083:18083
volumes:
- /etc/localtime:/etc/localtime:ro
- ./node1/logs:/opt/emqx/log
- ./node1/data:/opt/emqx/data

emqx2:
image: emqx:5.3.1
container_name: emqx2
environment:
- "EMQX_NODE_NAME=emqx@node2.emqx.io"
- "EMQX_CLUSTER__DISCOVERY_STRATEGY=static"
- "EMQX_CLUSTER__STATIC__SEEDS=[emqx@node1.emqx.io,emqx@node2.emqx.io,emqx@node3.emqx.io]"
healthcheck:
test: ["CMD", "/opt/emqx/bin/emqx ctl", "status"]
interval: 5s
timeout: 25s
retries: 5
networks:
emqx-bridge:
aliases:
- node2.emqx.io
ports:
- 1873:1883
- 8073:8083
- 8074:8084
- 8873:8883
- 18073:18083
volumes:
- /etc/localtime:/etc/localtime:ro
- ./node2/logs:/opt/emqx/log
- ./node2/data:/opt/emqx/data

emqx3:
image: emqx:5.3.1
container_name: emqx3
environment:
- "EMQX_NODE_NAME=emqx@node3.emqx.io"
- "EMQX_CLUSTER__DISCOVERY_STRATEGY=static"
- "EMQX_CLUSTER__STATIC__SEEDS=[emqx@node1.emqx.io,emqx@node2.emqx.io,emqx@node3.emqx.io]"
healthcheck:
test: ["CMD", "/opt/emqx/bin/emqx ctl", "status"]
interval: 5s
timeout: 25s
retries: 5
networks:
emqx-bridge:
aliases:
- node3.emqx.io
ports:
- 1863:1883
- 8063:8083
- 8064:8084
- 8863:8883
- 18063:18083
volumes:
- /etc/localtime:/etc/localtime:ro
- ./node3/logs:/opt/emqx/log
- ./node3/data:/opt/emqx/data

networks:
emqx-bridge:
driver: bridge
3. 启动集群
1
docker-compose up -d

三、 Nginx 负载均衡配置

1. 基础 TCP 代理策略

编辑 nginx.conf,使用 stream 模块代理 MQTT 流量:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;

events {
worker_connections 1024;
}

stream {
upstream emqx_tcp_cluster {
server 10.10.1.100:1883 weight=1 max_fails=3 fail_timeout=30s;
server 10.10.1.110:1873 weight=1 max_fails=3 fail_timeout=30s;
server 10.10.1.120:1863 weight=1 max_fails=3 fail_timeout=30s;
}

server {
listen 1893;
proxy_pass emqx_tcp_cluster;
proxy_buffer_size 8k;
tcp_nodelay on;
}
}
2. 扩展调度策略

根据业务需求替换 upstream 块配置:

  • 随机轮询
    1
    2
    3
    4
    5
    6
    upstream emqx_tcp_cluster {
    random;
    server 10.10.1.100:1883;
    server 10.10.1.110:1873;
    server 10.10.1.120:1863;
    }
  • 带权轮询
    1
    2
    3
    4
    5
    upstream emqx_tcp_cluster {
    server 10.10.1.100:1883 weight=1;
    server 10.10.1.110:1873 weight=2;
    server 10.10.1.120:1863 weight=3;
    }
  • 最小连接数
    1
    2
    3
    4
    5
    6
    upstream emqx_tcp_cluster {
    least_conn;
    server 10.10.1.100:1883;
    server 10.10.1.110:1873;
    server 10.10.1.120:1863;
    }
  • IP Hash(会话保持)
    1
    2
    3
    4
    5
    6
    upstream emqx_tcp_cluster {
    ip_hash;
    server 10.10.1.100:1883;
    server 10.10.1.110:1873;
    server 10.10.1.120:1863;
    }

四、 验证与访问

  • Dashboard 访问http://${ip}:18083
  • 默认凭证admin / public(首次登录强制修改)
  • 集群状态验证:进入任意容器执行 /opt/emqx/bin/emqx ctl cluster status,确认三节点状态为 running
  • 负载均衡验证:客户端连接 10.10.1.x:1893,查看 Nginx 访问日志或 EMQX Dashboard 连接分布。

五、 关键注意事项

  • 节点间通过 Docker 自定义网络 emqx-bridge 通信,需确保 EMQX_CLUSTER__STATIC__SEEDS 中的域名解析正确。
  • Nginx stream 模块需编译时启用(官方默认包通常已包含)。
  • 生产环境建议将 10.10.1.x 替换为实际宿主机 IP 或 Docker 网关 IP。
  • 端口映射已做偏移处理(1883/1873/1863),避免宿主机端口冲突。