生产部署
提示
如果 EMQX 集群部署在 HAProxy 或 Nginx 后,且需要拿到客户端真实的源 IP 地址与端口,则需打开 Proxy Protocol 配置,配置项:EMQX 监听器 proxy_protocol
参考: 。
Nginx 使用 Proxy Prorcol 参考: https://docs.nginx.com/nginx/admin-guide/load-balancer/using-proxy-protocol/ (opens new window)
EMQX 集群可作为物联网接入服务(IoT Hub)部署,目前 EMQ 在青云、阿里云、AWS 等云服务提供商上均提供开箱即用的免费软件镜像,对于特殊硬件平台和系统版本如树莓派、Linux ARM,可使用源码编译安装。
典型部署架构:
LB (负载均衡器) 负责分发设备的 MQTT 连接与消息到 EMQX 集群,LB 提高 EMQX 集群可用性、实现负载平衡以及动态扩容。
部署架构推荐在 LB 终结 SSL 连接。设备与 LB 之间 TLS 安全连接,LB 与 EMQX 之间普通 TCP 连接。这种部署模式下 EMQX 单集群可轻松支持 100 万设备。
公有云厂商 LB 产品:
私有部署 LB 服务器:
开源 LB | 是否支持 TLS 终结 | 方案介绍 |
---|---|---|
是 | https://www.haproxy.com/solutions/load-balancing.html (opens new window) | |
是 | https://www.nginx.com/solutions/load-balancing/ (opens new window) |
提示
国内公有云部署推荐青云 (EMQX 合作伙伴),国外部署推荐 AWS ,私有部署推荐使用 HAProxy 作为 LB。
EMQX 默认开启的 MQTT 服务 TCP 端口:
防火墙根据使用的 MQTT 接入方式,开启上述端口的访问权限。
EMQX 节点集群使用的 TCP 端口:
端口 | 说明 |
---|---|
4369 | 集群节点发现端口 (EPMD 模式) |
4370 | 集群节点发现端口 |
5370 | 集群节点 PRC 通道 |
集群节点间如有防护墙,需开启上述 TCP 端口互访权限。
创建 VPC 网络。
VPC 网络内创建 EMQX 集群 ‘ 私有网络 ‘,例如: 192.168.0.0/24
私有网络内创建两台 EMQX 主机,例如:
安装并集群 EMQX 主机,具体配置请参考安装集群章节。
创建 LB (负载均衡器) 并指定公网 IP 地址。
在 LB 上创建 MQTT TCP 监听器:
或创建 SSL 监听器,并终结 SSL 在 LB :
VPC 网络内创建 EMQX 集群 ‘ 私有网络 ‘,例如: 192.168.0.0/24
私有网络内创建两台 EMQX 主机,指定上面创建的 VPC 网络,例如:
节点 | IP 地址 |
---|---|
emqx1 | 192.168.0.2 |
emqx2 | 192.168.0.3 |
在安全组中,开放 MQTT 服务的 TCP 端口,比如 1883, 8883。
安装并集群 EMQX 主机,具体配置请参考安装集群章节。
创建 ELB (Classic 负载均衡器),指定 VPC 网络,并指定公网 IP 地址。
在 ELB 上创建 MQTT TCP 监听器:
或创建 SSL 监听器,并终结 SSL 在 LB :
- MQTT 客户端连接 LB 公网地址测试。
EMQX 集群直接挂 DNS 轮询,设备通过域名或者 IP 地址列表访问:
- 部署 EMQX 集群
- EMQX 节点防火墙开启外部 MQTT 访问端口,例如 1883, 8883
- 设备通过 IP 地址列表或域名访问 EMQX 集群
提示
产品部署不推荐这种部署方式。
HAProxy 作为 LB 部署 EMQX 集群,并终结 SSL 连接:
- 创建 EMQX 集群节点,例如:
- 配置 /etc/haproxy/haproxy.cfg,示例:
- 创建 EMQX 节点集群,例如:
节点 | IP 地址 |
---|---|
emqx1 | 192.168.0.2 |
emqx2 | 192.168.0.3 |
- 配置 /etc/nginx/nginx.conf,示例:
upstream stream_backend {
zone tcp_servers 64k;
hash $remote_addr;
server 192.168.0.2:1883 max_fails=2 fail_timeout=30s;
}
server {
listen 8883 ssl;
status_zone tcp_server;
proxy_buffer_size 4k;
ssl_handshake_timeout 15s;
ssl_certificate /etc/emqx/certs/cert.pem;
ssl_certificate_key /etc/emqx/certs/key.pem;