添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
Skip to content
EMQX 文档

用 NGINX 负载均衡 EMQX 集群

NGINX 是一种高性能多功能的服务器软件,可以作为 Web 服务器和反向代理服务器,除此以外,NGINX 还可以作为负载均衡器将来自客户端的请求分发到多个后端服务器,以确保负载平衡和性能优化。NGINX 非常适用于物联网应用,因为它可以处理大量的并发请求。在物联网中,设备数量庞大,因此需要一个可以处理大量请求的服务器来保证稳定性。EMQX 原生支持由多个 MQTT 服务器组成的分布式集群架构,因此,使用 NGINX 部署负载均衡以及 EMQX 集群,可以保证高可用性和可扩展性。

本页主要介绍了如何安装 NGINX 并配置 NGINX 的反向代理和负载均衡功能来搭建 MQTT 服务器从而为 EMQX 集群实现负载均衡。此外,本页还介绍了如何使用 NGINX Plus 优化 EMQX 部署。

功能与优势

使用 NGINX 负载均衡 EMQX 集群具备以下几个功能和优势:

  • 作为反向代理服务器,NGINX 位于 MQTT 服务器端,代表 MQTT 客户端向 EMQX 集群发起 MQTT 连接请求,并代替 EMQX 集群处理请求,然后将 EMQX 集群的响应返回给 MQTT 客户端。这样的设置可以将多个集群隐藏起来,暴露一个接入点给 MQTT 客户端。MQTT 客户端只需要与 NGINX 通信,而不需要知道后面的集群数量和布局,这种方式可以提高系统的可维护性和可扩展性。
  • NGINX 可用于终结 MQTT 客户端与 EMQX 集群之间经 SSL 加密的 MQTT 连接,减轻 EMQX 集群的加密解密负担。从而提供多种优势,如提高性能、简化证书管理和增强安全性。
  • NGINX 具有灵活的负载均衡策略,以使用不同的策略来决定请求应该发送到集群中的哪个 EMQX 节点,有助于分摊流量和请求,提高性能和可靠性。例如粘性负载平衡,可将请求路由到同一后端服务器,从而提高性能和会话持久性。

EMQX LB NGINX

快速体验

此处提供了一个具有实际示例的 Docker Compose 配置,让您能够轻松地进行验证和测试 NGINX 的功能。您可以按照以下步骤来进行操作:

  1. 克隆示例仓库并进入 mqtt-lb-nginx 目录:
  1. 通过 Docker Compose 启动示例:
  1. 使用 MQTTX CLI 建立 10 个 TCP 连接,模拟 MQTT 客户端连接:
  1. 您可以查看 NGINX 连接监控情况以及 EMQX 客户端连接的分布情况:

    • 通过以下命令查看 NGINX 连接监控:

    这将显示当前活动连接数以及服务器的请求处理统计情况,包括读取、写入和等待状态。

    • 使用以下命令分别查看每个 EMQX 节点的客户端连接情况:

    这将显示每个节点的连接数以及活动连接数,10 个连接均匀分布在集群节点:

通过以上步骤,您可以验证示例中的 NGINX 负载均衡功能,以及 EMQX 集群中客户端连接的分布情况。您也可以更改 emqx-usage-example/mqtt-lb-nginx/nginx.conf 文件进行自定义的配置验证。

安装和使用 NGINX

本节将具体介绍如何安装并使用 NGINX。

前置准备

在开始使用之前,确保您已经创建了由以下 3 个 EMQX 节点组成的集群。需要了解如何创建 EMQX 集群,详见 创建与管理集群

节点地址 MQTT TCP 端口 MQTT WebSocket 端口
emqx1-cluster.emqx.io 1883 8083
emqx2-cluster.emqx.io 1883 8083
emqx3-cluster.emqx.io 1883 8083

本页中的示例将使用单个 NGINX 服务器配置为负载均衡器,将请求转发到由这 3 个 EMQX 节点组成的集群。

安装 NGINX

此处使用 Ubuntu 22.04 LTS 系统,通过源码编译安装的方式安装 NGINX。您还可以考虑使用 NGINX Plus ,它提供了适用于 MQTT 的特殊指令和变量,可以实现粘性会话负载均衡和客户端 ID 替换等功能,这些功能可以帮助您更好地管理和保护 MQTT 流量。

以下是源码编译安装 NGINX 的步骤。

环境要求

在编译和安装 NGINX 前,需要确保系统中已经安装了以下依赖项:

  • GNU C 和 C++ 编译器
  • PCRE (Perl Compatible Regular Expressions) 库
  • zlib 压缩库
  • OpenSSL 库

可以使用以下命令在 Ubuntu 系统中安装以上依赖项:

下载源码

可以从 NGINX 官方网站 下载最新的稳定版本,例如:

编译配置命名

下载完成后,需要解压并进入源码目录:

使用以下命令进行编译配置:

其中 --with-http_ssl_module 参数用于添加 SSL 功能支持, --with-stream --with-stream_ssl_module 参数用于添加 TCP 反向代理支持。

开始编译

完成配置后,可以使用以下命令开始编译:

安装

编译完成后,可以使用以下命令安装 NGINX:

将 NGINX 可执行文件连接到系统 PATH 中的目录:

开始使用

NGINX 的配置文件默认位于 /usr/local/nginx/conf/nginx.conf ,将本页的配置示例添加到文件末尾即可。NGINX 基本操作命令如下:

检查配置文件:

如果 NGINX 配置文件验证成功,则可以启动 NGINX:

重新加载正在运行的 NGINX 并应用新配置,建议在操作前检查配置是否无误:

停止 NGINX:

配置 NGINX 的反向代理和负载均衡功能

本节介绍了如何配置 NGINX 以实现各类场景下的负载均衡需求。

配置反向代理 MQTT

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

配置反向代理 MQTT SSL

您可以通过以下配置使 NGINX 反向代理 MQTT 并解密 TLS 连接,将客户端加密的 MQTT 请求解密后转发至后端 MQTT 服务器,以确保通信安全性。

只需在 TCP 基础配置上添加 SSL 与证书相关参数即可:

配置反向代理 MQTT WebSocket

您可以使用以下配置使 NGINX 反向代理 MQTT WebSocket 连接,将客户端请求转发至后端 MQTT 服务器。需要使用 server_name 指定 HTTP 域名或 IP 地址。

配置反向代理 MQTT WebSocket SSL

您可以使用以下配置使 NGINX 反向代理 MQTT WebSocket 并解密 TLS 连接,将客户端加密的 MQTT 请求解密后转发至后端 MQTT 服务器,以确保通信安全性。需要使用 server_name 指定 HTTP 域名或 IP 地址。

只需在 WebSocket 基础配置上添加 SSL 与证书相关参数即可:

配置负载均衡策略

NGINX 提供了多种负载均衡策略,用于控制连接的分发方式。在实际使用中,根据您的服务器性能、流量需求等选择适当的负载均衡策略非常重要。

以下是一些常见的 NGINX 负载均衡策略,根据需要在 upstream 块中配置即可。

轮询(Round Robin)

这是默认的负载均衡策略,它将请求依次分配给每个后端服务器,循环往复。这样可以平均分担负载,适用于后端服务器性能差不多的情况。

权重轮询(Weighted Round Robin)

在轮询基础上,为每个 EMQX 节点分配不同的权重,从而影响请求分配的比例。权重越高的服务器会获得更多的请求。

IP 哈希(IP Hash)

根据客户端的 IP 地址进行哈希计算,然后将请求分配给一个固定的后端服务器。这确保同一个客户端的请求总是分发到同一个服务器上。

最少连接数(Least Connections)

请求分发到当前连接数最少的服务器,以确保每个服务器的负载尽可能平衡。适用于后端服务器性能差异较大的情况。

使用 NGINX Plus 优化 EMQX 部署

本节介绍了如何通过配置 NGINX Plus 中特有的功能优化 EMQX 部署。以下功能的配置示例仅在 NGINX Plus 版本中可用,本页中编译安装的 NGINX 无法引用这些配置。有关使用 NGINX Plus 优化 MQTT 连接的操作可参阅此 文档

配置 MQTT 粘性(Sticky)会话负载均衡

「粘性」是负载均衡器在重新连接时将客户端路由到之前服务器的能力,在 MQTT 中可以避免会话接管。这对于多客户端频繁重新连接或有问题的客户端断开连接再次连接的情况特别有用,能够优化数据流并减少连接开销。

为了实现粘性,服务器需要识别连接请求中的客户端标识符(通常是客户端 ID),这需要负载均衡器检查 MQTT 数据包。一旦获取客户端标识符,对于静态集群,服务器可以将其散列到服务器 ID,或者负载均衡器可以维护客户端标识符到目标节点 ID 的映射表以提供更灵活的路由。

以下是该功能的配置示例:

请注意,上述示例配置可能需要根据您的实际情况进行调整。配置中使用的模块(如 ip_hash least_conn )都是 NGINX 内置的模块,无需额外的模块依赖。

配置客户端 ID 替换功能

安全性在 MQTT 通信中至关重要。设备通常会使用序列号等敏感数据作为客户端 ID,而将其存储在 MQTT 服务器的数据库中可能会带来安全风险。NGINX Plus 提供了客户端 ID 替换功能,允许将客户端 ID 替换为 NGINX Plus 配置中设置的其他值。

以下是该功能的配置示例:

在此示例中,我们为客户端启用了双向认证,并从客户端的 SSL 证书中提取证书序列号作为唯一标识符,使用它来替换原始的客户端 ID。您也可以使用其他值如 $ssl_client_s_dn 提取证书 DN。

优化 NGINX 性能并启用监控

本节介绍了如何通过配置对 NGINX 进行性能优化以及启用状态监控功能。

NGINX 基础配置调整

worker_processes :工作进程数,设置与服务器 CPU 核心数相近的值,但要避免设置过多的进程,以防资源竞争。

worker_connections :单个工作进程可以允许同时建立外部连接的数量,数字越大能同时处理的连接数越多,所消耗内存也更多。这个值不超过操作系统允许的最大文件描述符数量。

NGINX 多网卡支持海量连接反向代理

在反向代理过程中,NGINX 作为客户端与后端 EMQX 节点建立连接。在这种情况下,单个 IP 地址最多能够创建约 6 万个长连接。为了支持更多的连接,你可以选择部署多个 NGINX 服务器或者配置多个 IP 地址。

以下是配置多个 IP 的示例,使用 NGINX 内置的 split_clients 模块来定义一个变量 $multi_ip ,根据客户端的 IP 地址和端口号进行请求分流,需要确保所使用的 IP 地址在本地可用。

NGINX 状态监控

需要确认是否安装监控模块 http_stub_status_module ,如果已经安装该模块,可以为 NGINX 启用状态监控:

打开 http://localhost:8888/status 即可查看状态数据: