借助 NGINX Plus 优化企业环境中的 MQTT 部署

原文作者:Michael Vernik - F5 高级产品经理

原文链接:借助 NGINX Plus 优化企业环境中的 MQTT 部署

转载来源:NGINX 中文官网


NGINX 唯一中文官方社区 ,尽在 nginx.org.cn

在宣布推出 NGINX Plus R29 版本时,我们简要介绍了其对 MQTT 消息解析的全新原生支持。本文将在此基础上探讨如何配置 NGINX Plus,以优化企业环境中的 MQTT 部署。

什么是 MQTT?

MQTT 是指“消息队列遥测传输”,是一种常用的轻量级“发布-订阅”消息协议,非常适合通过互联网连接物联网(IoT)或机器对机器(M2M)设备和应用。MQTT 可在低带宽或低功耗环境中高效运行,因此是有着众多远程客户端的应用的理想之选,适用于多个行业,包括消费类电子产品、汽车、运输、制造及医疗行业。

NGINX Plus MQTT 消息处理

NGINX Plus R29 支持 MQTT 3.1.1 和 MQTT 5.0。它充当了客户端和 Broker 之间的代理,可从核心系统卸载数据加密任务,简化可扩展性并降低计算成本。具体来说,NGINX Plus 能够解析并重写 MQTT CONNECT 消息的部分内容,从而实现以下功能:

  • MQTT Broker 负载均衡
  • 会话保持(将客户端重新连接到同一 Broker)
  • SSL/TLS 卸载
  • 客户端证书身份验证

MQTT 消息处理指令必须在 NGINX 配置文件的 stream 上下文中进行定义,并由 ngx_stream_mqtt_preread_module
和 ngx_stream_mqtt_filter_module 提供。

preread 模块先于 NGINX 的内部代理处理 MQTT 数据,允许根据解析的消息数据做出负载均衡和上游路由决策。

filter 模块支持重写已接收 CONNECT 消息中的 clientidusername 及 password 字段,并允许将这些字段设置为变量和复值,这可大幅扩展配置选项,支持 NGINX Plus 屏蔽敏感设备信息或插入 TLS 证书专有名称等数据。

 

MQTT 指令和变量

现有多个新指令和嵌入式变量可用于调整 NGINX 配置,以优化 MQTT 部署并满足您的特定需求。

preread 模块指令和嵌入式变量
  • mqtt_preread – 启用 MQTT 解析,以便从客户端设备发送的 CONNECT 消息中提取 clientid 和 username 字段。这些值通过嵌入式变量提供,可帮助将会话散列到负载均衡的上游服务器上(示例请见下文)。
  • $mqtt_preread_clientid – 表示设备发送的 MQTT 客户端标识符。
  • $mqtt_preread_username – 表示客户端发送的用于身份验证的用户名。
filter 模块指令
  • mqtt – 定义是否启用 MQTT 重写。
  • mqtt_buffers – 覆盖每个连接可分配的最大 MQTT 处理缓冲区数以及每个缓冲区的大小。默认情况下,NGINX 将限制每个连接 100 个缓冲区,每个缓冲区的长度为 1k。通常,这对于性能来说是最佳的,但在特殊情况下可能需要进行调整。例如,较长的 MQTT 消息需要较大的缓冲区。在短时间内为给定连接处理大量 MQTT 消息的系统可能会受益于缓冲区数量的增加。在大多数情况下,由于 NGINX 是从内部内存池构建缓冲区的,调整缓冲区参数对底层系统性能影响不大。
  • mqtt_rewrite_buffer_size – 指定用于构建已修改 MQTT 消息的缓冲区的大小。该指令已被弃用,并且自 NGINX Plus R30 起已过时。
  • mqtt_set_connect – 重写从客户端发送的 CONNECT 消息的参数。支持的参数包括:clientidusername 及 password

MQTT 示例

下面我们来更详细地了解一下使用 NGINX Plus 处理 MQTT 消息的优势以及相关的最佳实践。请注意,在下面的示例中,我们使用的是端口 1883 和端口 8883。端口 1883 是默认的不安全 MQTT 端口,而端口 8883 是默认的 SSL/TLS 加密端口。

MQTT Broker 负载均衡

MQTT 设备的短暂连接行为可能导致客户端 IP 意外更改,不利于将设备连接路由到正确的上游 Broker。在将设备连接从一个上游 Broker 移动到另一个上游 Broker 时,会带来高开销的 Broker间同步操作,进而增加延迟和成本。

通过解析 MQTT CONNECT 消息中的 clientid 字段,NGINX 可与上游服务 Broker 建立会话保持。其实现方法是,使用 clientid 作为哈希键来维护与后端 Broker 服务的连接。

在本例中,我们使用 clientid 作为令牌来代理 MQTT 设备数据,从而与三个上游 Broker 建立会话保持。我们使用一致的参数,以便在上游服务器发生故障时,将其流量平均分发给其余服务器,而不影响这些服务器上已建立的会话。

stream {mqtt_preread on; upstream backend {zone tcp_mem 64k;hash $mqtt_preread_clientid consistent;server 10.0.0.7:1883; # upstream mqtt broker 1server 10.0.0.8:1883; # upstream mqtt broker 2server 10.0.0.9:1883; # upstream mqtt broker 3 }server {listen 1883;proxy_pass backend;proxy_connect_timeout 1s;}}

NGINX Plus 还能够解析 MQTT CONNECT 消息的 username 字段。更多详情,请参阅 ngx_stream_mqtt_preread_module 规范。

SSL/TLS 卸载

加密设备通信是确保数据保密性和抵御中间人攻击的关键。不过,TLS 握手、加密和解密可能会给 MQTT Broker 带来资源负担。为了解决这一问题,NGINX Plus 可从 Broker(或 Broker 集群)卸载数据加密,从而简化安全规则,支持 Broker 全力处理设备消息。

在本例中,我们展示了如何使用 NGINX 将 TLS 加密的 MQTT 流量从设备代理到后端 Broker。ssl_session_cache 指令定义了一个 5 MB 缓存,该容量足以存储约 20,000 个 SSL 会话。根据 proxy_connect_timeout 指令的定义,NGINX 将尝试在五秒钟(超时期限)内访问代理的 Broker 。

stream {server {listen 8883 ssl;ssl_certificate /etc/nginx/certs/tls-cert.crt;ssl_certificate_key /etc/nginx/certs/tls-key.key;ssl_session_cache shared:SSL:5m;proxy_pass 10.0.0.8:1883;proxy_connect_timeout 5s;}} 

客户端 ID 替换

出于安全原因,您可以选择不在 MQTT Broker 的数据库中存储客户端可识别信息。例如,设备发送的 MQTT CONNECT 消息中可能会有序列号或其他敏感数据。只需将设备的标识符替换为从客户端接收的其他已知静态值,便可为尝试访问 NGINX Plus 代理的 Broker 的每台设备建立一个新的唯一标识符。

在本例中,我们从设备的客户端 SSL 证书中提取了一个唯一标识符,并用它来屏蔽其 MQTT 客户端 ID。客户端证书身份验证(双向 TLS)通过 ssl_verify_client 指令进行控制。当参数设置为 on 时,NGINX 可确保客户端证书由受信任证书颁发机构(CA)签发。受信任 CA 证书通过 ssl_client_certificate 指令进行定义。

stream {mqtt on; server {listen 8883 ssl;ssl_certificate /etc/nginx/certs/tls-cert.crt;ssl_certificate_key /etc/nginx/certs/tls-key.key;ssl_client_certificate /etc/nginx/certs/client-ca.crt;ssl_session_cache shared:SSL:10m;ssl_verify_client on;proxy_pass 10.0.0.8:1883;proxy_connect_timeout 1s;mqtt_set_connect clientid $ssl_client_serial;}}

客户端证书作为身份验证凭证

对 MQTT 客户端进行身份验证的一种常见方法是使用客户端证书中存储的数据作为用户名。NGINX Plus 可以解析客户端证书并重写 MQTT username 字段,从后端 Broker 卸载这项任务。在下面的示例中,我们提取客户端证书的持有者专有名称(持有者 DN),并将其复制到 MQTT CONNECT 消息的 username 部分。

stream {mqtt on; server {listen 8883 ssl;ssl_certificate /etc/nginx/certs/tls-cert.crt;ssl_certificate_key /etc/nginx/certs/tls-key.key;ssl_client_certificate /etc/nginx/certs/client-ca.crt;ssl_session_cache shared:SSL:10m;ssl_verify_client on;proxy_pass 10.0.0.8:1883;proxy_connect_timeout 1s;mqtt_set_connect username $ssl_client_s_dn;}} 

有关 NGINX Plus MQTT CONNECT 消息重写的完整规范,请参阅 ngx_stream_mqtt_filter_module 规范。

立即行动

NGINX Plus 中 MQTT 的后续开发可能包括对其他 MQTT 消息类型进行解析,并能够更深入地解析 CONNECT 消息以启用以下功能:

  • 额外的身份验证和访问控制机制
  • 通过对频繁通信的客户端进行速率限制来保护 Broker
  • 消息遥测和连接指标

欢迎您就所看重的特性给我们反馈,请在评论区告诉我们您的想法,或者添加小N助手(微信号:nginxoss)加入官方讨论群,与社区用户交流探讨。


NGINX 唯一中文官方社区 ,尽在 nginx.org.cn

更多 NGINX 相关的技术干货、互动问答、系列课程、活动资源: 开源社区官网 | 微信公众号

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/387239.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C#知识|文件与目录操作:对象的创建、保存、读取

哈喽,你好啊,我是雷工! 面向对象编程的特点就是一切皆对象,操作的也是对象,本节学习文件与目录操作中,对象的保存; 以下为学习笔记。 01 对象的特点 ①:对象运行在内存中&#xff…

二刷代码随想录训练营Day 11| 150. 逆波兰表达式求值、239. 滑动窗口最大值、347.前 K 个高频元素、总结

1.逆波兰表达式 题目链接/文章讲解/视频讲解&#xff1a;代码随想录 代码&#xff1a; class Solution { public:int evalRPN(vector<string>& tokens) {stack<long long> st;for(int i 0; i < tokens.size(); i){if(tokens[i] "" || tokens[i…

vue里给img的src绑定数据失效

起因 在v-for遍历数据时想要通过给img的src单向绑定 图片路径时出现问题 解决过程 上网查说是webpack构建时识别不到&#xff0c;直接不单绑数据&#xff0c;写死试试看 解决方案 直接require导入图像文件模块

热门超声波清洗机有哪些?小型超声波清洗机推荐

在繁忙的工作和生活中&#xff0c;许多人常常会因为种种原因忽略日常的小事&#xff0c;比如忘记清洁手表、眼镜、首饰等常用物品。实际上&#xff0c;这些物品表面不仅积累了灰尘和污垢&#xff0c;特别是跟眼部朝夕相处的眼镜&#xff0c;还可能滋生各种致病细菌&#xff0c;…

【数据分享】《内蒙古省统计年鉴》2000-2023

而今天要限时免费分享的数据就是2000-2023年间出版的《内蒙古省统计年鉴》并以多格式提供免费下载。&#xff08;无需分享朋友圈即可获取&#xff09; 数据介绍 位于中国北部的内蒙古自治区&#xff0c;以其独特的地理和文化特性&#xff0c;成为中国经济发展的重要组成部…

京东科技集团将在香港发行与港元1:1挂钩的加密货币稳定币

据京东科技集团旗下公司京东币链科技(香港)官网信息&#xff0c;京东稳定币是一种基于公链并与港元(HKD) 1:1挂钩的稳定币&#xff0c;将在公共区块链上发行&#xff0c;其储备由高度流动且可信的资产组成&#xff0c;这些资产安全存放于持牌金融机构的独立账户中&#xff0c;通…

工具(1)—截屏和贴图工具snipaste

演示和写代码文档的时候&#xff0c;总是需要用到截图。在之前的流程里面&#xff0c;一般是打开WX或者QQ&#xff0c;找到截图工具。但是尴尬的是&#xff0c;有时候&#xff0c;微信没登录&#xff0c;而你这个时候就在写文档。为了截个图&#xff0c;还需要启动微信&#xf…

数据透视表(二)

文章目录 导入外部数据源创建数据透视表Query 工具下的数据透视表创建如何统计业绩成交情况创建组利用函数构建辅助列创建组手动创建多样分组创建组区间统计创建组按年月日统计数据透视表的多种统计方法计算字段 导入外部数据源创建数据透视表 点击数据选项卡下数据-获取外部数…

环境搭建-Windows系统搭建Docker

Windows系统搭建Docker 一、系统虚拟化1.1 启用虚拟化2.2 启用Hyper-v并开启虚拟任务 三、安装WSL3.1 检验安装3.2 安装WSL 四、Docker安装4.1 Docker安装包下载4.2 Docker安装4.3 运行docker Desktop 五、Docker配置5.1 打开Docker配置中心5.2 配置Docker国内镜像 六、使用 一…

马斯克的Memphis AI超级计算中心:全球最强AI训练集群的诞生

引言 近期&#xff0c;马斯克宣布其最新的Memphis AI超级计算中心正式启动&#xff0c;这一新闻引发了科技界的广泛关注。该中心配备了10万块液冷H100 GPU&#xff0c;成为全球最强大的AI训练集群。本文将深入探讨Memphis AI超级计算中心的建设过程、技术细节、以及其对未来人…

昇思25天学习打卡营第24天|基于MobileNetv2的垃圾分类案例:从数据准备到导出模型文件

目录 MindSpore 版本配置及相关数据集与预训练权重文件下载 基于 MindSpore 的垃圾分类数据集创建与配置 MobileNetV2 模型的构建与相关类定义 基于 MindSpore 的 MobileNetV2 模型训练与测试代码分析 基于 MobileNetV2 模型的图像推理代码分析 MobileNetV2 模型的构建、加…

C语言——设计TVM(地铁自动售票机)机软件。

输入站数&#xff0c;计算费用&#xff0c;计费规则&#xff0c;6站2元&#xff0c;7-10站3元&#xff0c;11站以上为4元。 输入钱数&#xff0c;计算找零(找零时优先找回面额大的钞票)&#xff0c;找零方式为各种面额张数&#xff0c;可识别面额&#xff1a; 100,50,20,10,5,1…

yandex图标点选验证码YOLOV8识别案例

注意,本文只提供学习的思路,严禁违反法律以及破坏信息系统等行为,本文只提供思路 如有侵犯,请联系作者下架 某yandex图标点选验证码如下: 使用过yolov8的小伙伴可能都知道,这种直接打个标注,基本上就可以了,至于问题图片由于不能很好的切割做分类,所以干脆也做成目标…

[Bugku] web-CTF靶场详解!!!

平台为“山东安信安全技术有限公司”自研CTF/AWD一体化平台&#xff0c;部分赛题采用动态FLAG形式&#xff0c;避免直接抄袭答案。 平台有题库、赛事预告、工具库、Writeup库等模块。 ------------------------------- Simple_SSTI_1 启动环境&#xff1a; 页面提示传入参数f…

【Linux】make/Makefile的理解

1.make是一个命令&#xff0c;makefile是一个文件, 依赖关系和依赖方法. a.快速使用一下 i.创建一个Makefile文件(首字母也可以小写) b.依赖关系和依赖方法 i.依赖关系: 我为什么要帮你? mybin:mytest.c ii.依赖方法: 怎么帮? gcc -o mybin mytest.c make之前要注意先创建…

2024电赛H题参考方案(+视频演示+核心控制代码)——自动行驶小车

目录 一、题目要求 二、参考资源获取 三、TI板子可能用到的资源 1、环境搭建及工程移植 2、相关模块的移植 四、控制参考方案 1、整体控制方案视频演示 2、视频演示部分核心代码 五、总结 一、题目要求 小编自认为&#xff1a;此次控制类类型题目的H题&#xff0c;相较于往年较…

Snowflake 集成模式:Apache Kafka 与零 ETL 和反向 ETL

Snowflake 是领先的云原生数据仓库。集成模式包括批量数据集成、零 ETL 和使用 Apache Kafka 的近乎实时的数据摄取。这篇博文探讨了不同的方法&#xff0c;并发现了它们的利弊。根据行业建议&#xff0c;建议避免使用反向 ETL 等反模式&#xff0c;而是使用数据流来增强企业架…

MySQL基础练习题12-使用唯一标识码替换员工ID

题目&#xff1a;展示每位用户的 唯一标识码&#xff08;unique ID &#xff09;&#xff1b;如果某位员工没有唯一标识码&#xff0c;使用 null 填充即可。 准备数据 分析数据 题目&#xff1a;展示每位用户的 唯一标识码&#xff08;unique ID &#xff09;&#xff1b;如果…

Vue2从基础到实战(指令篇)

案例&#xff1a;动态切换图片 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Vue.js 示例</ti…

划重点!「2024观测云发布会」亮点速览

在刚刚落幕的「2024观测云发布会」上&#xff0c;CEO蒋烁淼及其团队以「ENDLESS EVOLUTION」为主题&#xff0c;向大家展示了观测云近两年的革新之旅。不仅深入回顾了观测云在产品创新、技术突破上的持续追求&#xff0c;更以远见卓识&#xff0c;描绘了一幅充满潜力与创新的未…