NGINX 负载均衡 FMQ 集群
大约 4 分钟
NGINX 负载均衡 FMQ 集群
一、功能与优势
- 作为反向代理服务器,位于 MQTT 服务器端,代表客户端向 FMQ 集群发起连接请求并处理和返回响应,隐藏集群细节,提高系统可维护性与可扩展性。
- 可终结 SSL 加密的 MQTT 连接,减轻 FMQ 集群加密解密负担,提升性能、简化证书管理并增强安全性。
- 具备灵活负载均衡策略,如粘性负载平衡等,可根据不同策略将请求分发到 FMQ 节点,分摊流量与请求,提高性能和可靠性。
二、安装和使用 NGINX
(一)前置准备
创建由 3 个 FMQ 节点(fmq1-cluster.fmq.io、fmq2-cluster.fmq.io、fmq3-cluster.fmq.io,MQTT TCP 端口 1883,MQTT WebSocket 端口 8083)组成的集群。
(二)安装 NGINX
环境要求
:安装 GNU C 和 C++ 编译器、PCRE 库、zlib 压缩库、OpenSSL 库
sudo apt-get update sudo apt-get install build-essential libpcre3-dev zlib1g-dev libssl-dev下载源码
wget https://nginx.org/download/nginx-1.24.0.tar.gz编译配置命名
tar -zxvf nginx-1.24.0.tar.gz cd nginx-1.24.0开始编译:
make安装
sudo make install sudo ln -s /usr/local/nginx/sbin/nginx /usr/local/bin/nginx开始使用
检查配置文件:
sudo nginx -t启动 NGINX:
sudo nginx重新加载配置:
sudo nginx -s reload停止 NGINX:
sudo nginx stop
四、配置 NGINX 的反向代理和负载均衡功能
(一)配置反向代理 MQTT
stream {
upstream mqtt_servers {
server fmq1-cluster.fmq.io:1883 max_fails=2 fail_timeout=10s;
server fmq2-cluster.fmq.io:1883 down;
server fmq3-cluster.fmq.io:1883 backup;
}
server {
listen 1883;
proxy_pass mqtt_servers;
proxy_protocol on;
proxy_connect_timeout 10s;
proxy_timeout 1800s;
proxy_buffer_size 3M;
tcp_nodelay on;
}
}(二)配置反向代理 MQTT SSL
stream {
upstream mqtt_servers {
server fmq1-cluster.fmq.io:1883;
server fmq2-cluster.fmq.io:1883;
}
server {
listen 8883 ssl;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_certificate /usr/local/NGINX/certs/fmq.pem;
ssl_certificate_key /usr/local/NGINX/certs/fmq.key;
ssl_verify_depth 2;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;
proxy_pass mqtt_servers;
proxy_protocol on;
proxy_connect_timeout 10s;
proxy_timeout 1800s;
proxy_buffer_size 3M;
tcp_nodelay on;
}
}(三)配置反向代理 MQTT WebSocket
http {
upstream mqtt_websocket_servers {
server fmq1-cluster.fmq.io:8083;
server fmq2-cluster.fmq.io:8083;
}
server {
listen 80;
server_name mqtt.example.com;
location /mqtt {
proxy_pass http://mqtt_websocket_servers;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_buffering off;
proxy_connect_timeout 10s;
proxy_send_timeout 3600s;
proxy_read_timeout 3600s;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
}(四)配置反向代理 MQTT WebSocket SSL
http {
upstream mqtt_websocket_servers {
server fmq1-cluster.fmq.io:8083;
server fmq2-cluster.fmq.io:8083;
}
server {
listen 443 ssl;
server_name mqtt.example.com;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_certificate /usr/local/NGINX/certs/fmq.pem;
ssl_certificate_key /usr/local/NGINX/certs/fmq.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;
location /mqtt {
proxy_pass http://mqtt_websocket_servers;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_buffering off;
}
}
}(五)配置负载均衡策略
轮询(Round Robin)
:默认策略,依次分配请求给后端服务器。
upstream backend_servers { server fmq1-cluster.fmq.io:1883; server fmq2-cluster.fmq.io:1883; server fmq3-cluster.fmq.io:1883; }权重轮询(Weighted Round Robin)
:为节点分配不同权重影响请求分配比例。
upstream backend_servers { server fmq1-cluster.fmq.io:1883 weight=3; server fmq2-cluster.fmq.io:1883 weight=2; server fmq3-cluster.fmq.io:1883 weight=1; }IP 哈希(IP Hash)
:根据客户端 IP 地址哈希计算分配请求到固定后端服务器。
upstream backend_servers { ip_hash; server fmq1-cluster.fmq.io:1883; server fmq2-cluster.fmq.io:1883; server fmq3-cluster.fmq.io:1883; }最少连接数(Least Connections)
:将请求分发到当前连接数最少的服务器。
upstream backend_servers { least_conn; server fmq1-cluster.fmq.io:1883; server fmq2-cluster.fmq.io:1883; server fmq3-cluster.fmq.io:1883; }
五、使用 NGINX Plus 优化 FMQ 部署
(一)配置 MQTT 粘性(Sticky)会话负载均衡
stream {
mqtt_preread on;
upstream backend_servers {
hash $mqtt_preread_clientid consistent;
server fmq1-cluster.fmq.io:1883;
server fmq2-cluster.fmq.io:1883;
server fmq3-cluster.fmq.io:1883;
}
server {
listen 1883;
proxy_pass backend_servers;
proxy_connect_timeout 1s;
}
}(二)配置客户端 ID 替换功能
stream {
mqtt on;
server {
listen 1883 ssl;
ssl_certificate /etc/NGINX/certs/fmq.pem;
ssl_certificate_key /etc/NGINX/certs/fmq.key;
ssl_client_certificate /etc/NGINX/certs/ca.crt;
ssl_session_cache shared:SSL:10m;
ssl_verify_client on;
proxy_pass 10.0.0.113:1883;
proxy_connect_timeout 1s;
mqtt_set_connect clientid $ssl_client_serial;
}
}六、优化 NGINX 性能并启用监控
(一)NGINX 基础配置调整
worker_processes auto;
events {
worker_connections 20480;
}(二)NGINX 多网卡支持海量连接反向代理
stream {
split_clients "$remote_addr$remote_port" $multi_ip {
20% 10.211.55.5;
20% 10.211.55.20;
20% 10.211.55.21;
20% 10.211.55.22;
* 10.211.55.23;
}
upstream mqtt_servers {
server fmq1-cluster.fmq.io:1883;
server fmq2-cluster.fmq.io:1883;
}
server {
listen 1883;
proxy_pass mqtt_servers;
proxy_bind $multi_ip;
}
}(三)NGINX 状态监控
http {
server {
listen 8888;
location /status {
stub_status on;
access_log off;
}
}
}七、附录:主要参数说明
| 参数名称 | 说明 |
|---|---|
| proxy_protocol | 启用 PROXY protocol,使 FMQ 能获取真实客户端 IP |
| proxy_pass | 定义后端 MQTT 服务器地址,转发客户端请求到此处 |
| proxy_connect_timeout | 与后端建立连接超时时间,超时中断连接尝试 |
| proxy_timeout | 后端服务器超时时间,未响应则关闭连接 |
| proxy_buffer_size | 存储后端数据的缓冲区大小,处理大数据流 |
| tcp_nodelay | 启用 TCP_NODELAY,禁用 Nagle 算法,减少延迟 |
| ssl_session_cache | 配置 SSL 会话缓存,加速握手过程,如 shared:SSL:10m 为 10MB 缓存 |
| ssl_session_timeout | 设置 SSL 会话超时时间为 10 分钟,未重用则清除 |
| ssl_certificate | 指定 SSL 证书文件路径,证明服务器身份 |
| ssl_certificate_key | 指定证书私钥文件路径 |
| ssl_protocols | 指定允许的 SSL/TLS 协议版本 |
| ssl_ciphers | 配置允许的加密算法(密码套件),如 HIGH:!aNULL:!MD5 排除不安全选项 |
| ssl_client_certificate | 指定验证客户端证书的 CA 证书路径 |
| ssl_verify_client | 启用客户端证书验证,要求客户端提供有效证书 |
| ssl_verify_depth | 设置客户端证书验证深度,如 1 表示仅验证一层 |
