mqtt服务器搭建参考上一篇文章
uniapp前端从零开始搭建一套mqtt服务
配置节点名称
为分别部署在 s1.emqx.io
和 s2.emqx.io
的两个节点创建一个集群
在第一个节点的 emqx.conf
配置文件中配置节点名称,例如:
node.name = emqx@s1.emqx.io
emqx.conf
配置文件默认位于/etc/emqx
还可以使用环境变量覆盖节点名称:
env EMQX_NODE__NAME='emqx@s1.emqx.io' ./bin/emqx start
为其他节点重复上述步骤以加入集群。
现在已经命名了两个要加入集群的节点,emqx@s1.emqx.io
和 emqx@s2.emqx.io
。可以手动或自动创建一个集群。
自动集群是最简单的
在所有节点 emqx.conf
文件中配置相同的集群方式和节点列表:
cluster {
discovery_strategy = static
static {
seeds = ["emqx@node1.emqx.com", "emqx@node2.emqx.com"]
}
}
设置节点 Cookie
出于安全考虑,应该在所有要加入集群的节点上的 emqx.conf
中将默认 cookie 设置更改为秘密 cookie。所有要加入集群的节点都应使用相同的秘密 cookie,是一个字符串
node.cookie = "mqxsecretcookie"
关闭匿名连接
emqx.conf
中加入
allow_anonymous = false
用 Nginx 负载均衡 EMQX 集群
安装 Nginx
此处使用 Ubuntu 22.04 LTS 系统,通过源码编译安装的方式安装 Nginx。您也可以使用 Docker 或二进制包安装 Nginx。
环境要求
在编译和安装 Nginx 前,需要确保系统中已经安装了以下依赖项:
- GNU C 和 C++ 编译器
- PCRE (Perl Compatible Regular Expressions) 库
- zlib 压缩库
- OpenSSL 库
可以使用以下命令在 Ubuntu 系统中安装以上依赖项:
sudo apt-get update
sudo apt-get install build-essential libpcre3-dev zlib1g-dev libssl-dev
下载源码
可以从 Nginx 官方网站下载最新的稳定版本,例如:
wget https://nginx.org/download/nginx-1.24.0.tar.gz
编译配置命名
下载完成后,需要解压并进入源码目录:
tar -zxvf nginx-1.24.0.tar.gz
cd nginx-1.24.0
使用以下命令进行编译配置:
./configure \
--with-threads \
--with-http_stub_status_module \
--with-http_ssl_module \
--with-http_realip_module \
--with-stream \
--with-stream_ssl_module
其中 --with-http_ssl_module
参数用于添加 SSL 功能支持,--with-stream
与 --with-stream_ssl_module
参数用于添加 TCP 反向代理支持。
开始编译
完成配置后,可以使用以下命令开始编译:
make
安装
编译完成后,可以使用以下命令安装 Nginx:
sudo make install
将 Nginx 可执行文件连接到系统 PATH 中的目录:
sudo ln -s /usr/local/nginx/sbin/nginx /usr/local/bin/nginx
开始使用
Nginx 的配置文件默认位于 /usr/local/nginx/conf/nginx.conf
,将反向代理配置示例添加到文件末尾即可。Nginx 基本操作命令如下:
检查配置文件:
sudo nginx -t
如果 Nginx 配置文件验证成功,则可以启动 Nginx:
sudo nginx
重新加载正在运行的 Nginx 并应用新配置,建议在操作前检查配置是否无误:
sudo nginx -s reload
停止 Nginx:
sudo nginx stop
反向代理 MQTT
您可以在 Nginx 的配置文件中添加以下配置来反向代理来自客户端的 MQTT 连接请求,将请求转发至后端 MQTT 服务器。
stream {
upstream mqtt_servers {
# down:表示当前的 server 暂时不参与负载
# max_fails:允许请求失败的次数;默认为 1
# fail_timeout:失败超时时间,默认 10s, max_fails 达到次数后暂停的请求时间
# backup:其它所有的非backup机器down或者忙的时候,请求backup机器
server emqx1-cluster.emqx.io:1883 max_fails=2 fail_timeout=10s;
server emqx2-cluster.emqx.io:1883 down;
server emqx3-cluster.emqx.io:1883 backup;
}
server {
listen 2883; # 这个是tcp连接时的端口
proxy_pass mqtt_servers;
# 启用此项时,对应后端监听器也需要启用 proxy_protocol
proxy_protocol on;
proxy_connect_timeout 10s;
# 默认心跳时间为 10 分钟
proxy_timeout 1800s;
proxy_buffer_size 3M;
tcp_nodelay on;
}
}
后端监听器启用 proxy_protocol可以在dashboard里设置,tcp打开就好,webscoket打开的话就连接不上了
反向代理 MQTT WebSocket
您可以使用以下配置使 Nginx 反向代理 MQTT WebSocket 连接,将客户端请求转发至后端 MQTT 服务器。需要使用 server_name
指定 HTTP 域名或 IP 地址。
http {
upstream mqtt_websocket_servers {
server emqx1-cluster.emqx.io:8083;
server emqx2-cluster.emqx.io:8083;
}
server {
listen 8085;# 这个是webscoket连接时的端口
server_name mqtt.example.com; # 这个是webscoket连接时的地址
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;
# WebSocket 连接有效时间
# 在该时间内没有数据交互的话 WebSocket 连接会自动断开,默认为 60s
proxy_send_timeout 3600s;
proxy_read_timeout 3600s;
# 反向代理真实 IP
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;
}
}
}
目前项目里只使用了tcp及wenbscoket连接,需要代理其他连接的看官网用 Nginx 负载均衡 EMQX 集群 | EMQX 文档
修改完记得重新加载nginx
sudo nginx -s reload
负载均衡策略
Nginx 提供了多种负载均衡策略,用于控制连接的分发方式。我们目前只用到一种
在 upstream
块中配置即可。
轮询(Round Robin)
这是默认的负载均衡策略,它将请求依次分配给每个后端服务器,循环往复。这样可以平均分担负载,适用于后端服务器性能差不多的情况。
upstream backend_servers {
server emqx1-cluster.emqx.io:1883;
server emqx2-cluster.emqx.io:1883;
server emqx3-cluster.emqx.io:1883;
}
开放端口
emqx有几个默认端口需要开放,tcp:1883,ws:8083,wss:8084,ssl:8883,这几个是可以修改的,也是可以在dashboard里设置
负载均衡的端口自己设置就好了,比如实例里的2883和8085
还有两个集群内通信端口4370,5370,这两个前三个数字默认不可以配置,集群通信端口一定要打开,不然部署了集群与负载均衡后,不在相同节点的客户端无法通信
dashboard默认端口是18083,修改的话在emqx.conf中修改
dashboard {
listeners.http {
bind = 18084
}
}
集群内通信端口
为了形成一个集群,EMQX 节点需要通过一些常规端口进行互联
如果集群节点之间有防火墙,常规监听端口应该允许集群中的其他节点连通。
EMQX 节点之间有两种不同的通道进行通信。
Erlang 分布式传输端口
EMQX 采用了传统的端口映射机制,而非 Erlang Port Mapper Daemon, EPMD。
Erlang 分布端口。ListeningPort = BasePort + Offset
。 其中 BasePort
是 4370(默认不可以配置),Offset
是节点名称的后缀。 如果节点名称没有数字后缀,Offsset
就是 0。
例如,在 emqx.conf
中的 node.name = emqx@192.168.0.12
应该使 节点的监听端口为 4370
,而 emqx1
(或 emqx-1
)的端口为 4371
,以此类推。
集群 RPC 端口
默认情况下,每个 EMQX 节点有一个 RPC 监听端口。 防火墙应该配置成允许访问。
端口映射规则类似于 Erlang 分布式端口映射规则。 只有 "BasePort" 是 "5370"。
也就是说,在 emqx.conf
中的 node.name = emqx@192.168.0.12
应该使节点的 监听端口 5370
,端口 5371
用于 emqx1
(或 emqx-1
),以此类推。
Docker 容器中的 EMQX 使用静态端口 5369
进行集群 RPC。
设置完记得重启emqx服务