Nginx反向代理MQTT服务端(emqx)

发布时间 2023-12-26 15:58:52作者: ydqun

安装Nginx

此处使用Ubuntu22.04LTS系统,通过源码编译安装的方式安装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 broker

Nginx作为负载均衡器将来自客户端的请求分发到多个后端服务器,以确保负载平衡和性能优化。Nginx 非常适用于物联网应用,因为它可以处理大量的并发请求。在物联网中,设备数量庞大,因此需要一个可以处理大量请求的服务器来保证稳定性。EMQX 原生支持由多个 MQTT 服务器组成的分布式集群架构,因此,使用 Ngnix 部署负载均衡以及 EMQX 集群,可以保证高可用性和可扩展性,所以在这里我们运用Nginx的反向代理,实现EMQX(MQTT Broker)的冗余备份和负载均衡。

我们可以在 Nginx 的配置文件中添加以下配置来反向代理来自客户端的 MQTT 连接请求,将请求转发至后端 MQTT 服务器。

stream {
  upstream mqtt_servers {
    # down:表示当前的 server 暂时不参与负载
    # max_fails:允许请求失败的次数;默认为 1
    # fail_timeout:失败超时时间,默认 10s, max_fails 达到次数后暂停的请求时间
    # backup:其它所有的非backup机器down或者忙的时候,请求backup机器

    server 172.18.157.180:1883 max_fails=2 fail_timeout=10s;
    server 172.18.157.179:1883;
  }

  server {
    listen 1884;
    proxy_pass mqtt_servers;

    # 启用此项时,对应后端监听器也需要启用 proxy_protocol
    proxy_protocol on;
    proxy_connect_timeout 10s;
    # 默认心跳时间为 10 分钟
    proxy_timeout 1800s;
    proxy_buffer_size 3M;
    tcp_nodelay on;
  }
}

修改好配置后,使用nginx -s reload重新加载正在运行的 Nginx 并应用新配置。

这时候,我们可以用MQTT客户端连接nginx的端口号,然后nginx就会代理我们的请求,采用轮询负载均衡策略,将请求依次分配给每个后端服务器,循环往复。