NanoMQ ds笔记250306
NanoMQ多版本下载地址 https://www.emqx.com/zh/downloads/nanomq
NanoMQ官方文档 https://nanomq.io/docs/zh/latest/
NanoMQ 是一个专为物联网边缘计算设计的轻量级、高性能 MQTT 消息代理(Message Broker),由中国的开源物联网公司 EMQ 开发并维护。它专注于在资源受限的边缘设备上提供高效的 MQTT 消息通信能力,同时支持与云端服务的无缝集成。
一、核心特性
-
轻量高效
- 内存占用极低:NanoMQ 采用 C 语言开发,运行时内存占用仅 数百KB,适合嵌入式设备(如树莓派、工业网关)或低功耗边缘计算场景。
- 高吞吐低延迟:单机支持10万+ QoS 0消息/秒的吞吐量,端到端延迟低至毫秒级,满足实时性要求高的场景。
-
协议支持
- 完整 MQTT 3.1.1/5.0 协议:支持 QoS 0/1/2、保留消息、遗嘱消息等标准功能。
- 多协议桥接:内置 MQTT-SN、WebSocket、nanomsg 等协议转换,方便与不同设备通信。
- TLS/SSL 加密:支持 MQTT over TLS,保障数据传输安全。
-
灵活扩展
- 插件机制:通过动态加载插件支持功能扩展(如 CoAP、HTTP 桥接)。
- 规则引擎:支持 SQL 语法配置消息路由、过滤、存储到数据库(如 MySQL、TDengine)。
-
边缘-云协同
- 云端无缝集成:可一键桥接至 EMQX 企业版或 AWS IoT Core 等云平台,实现边缘数据聚合与云端分析联动。
二、架构设计
NanoMQ 采用 事件驱动模型 和 异步 I/O 设计,最大化利用硬件资源:
- 多线程模型:分离网络 I/O 与业务处理,避免阻塞。
- 零拷贝技术:减少内存复制开销,提升吞吐量。
- 模块化设计:核心服务、协议扩展、插件相互独立,按需裁剪。
三、适用场景
- 工业物联网(IIoT)
在工厂车间部署 NanoMQ,实时收集传感器数据并转发至边缘分析平台。 - 智能家居网关
作为家庭设备的 MQTT 中枢,连接 Zigbee/WiFi 设备并同步至云端。 - 车联网(V2X)
在车载终端运行,处理车辆状态消息并实时上报至云平台。 - 边缘 AI 推理
与边缘 AI 框架(如 TensorFlow Lite)集成,传递实时推理结果。
四、快速入门
-
安装
# Linux 安装 curl -sSL https://github.com/nanomq/nanomq/releases/download/0.15.0/nanomq-0.15.0-linux-amd64.deb sudo apt install ./nanomq-0.15.0-linux-amd64.deb
-
启动服务
nanomq start --conf /etc/nanomq.conf
-
测试通信
- 订阅主题:
nanomq_cli sub -t "sensor/data" -q 1
- 发布消息:
nanomq_cli pub -t "sensor/data" -m "temperature=25" -q 1
- 订阅主题:
五、配置示例
编辑 nanomq.conf
启用 TLS 和 WebSocket:
listeners.tcp {bind = "0.0.0.0:1883"
}listeners.wss {bind = "0.0.0.0:8083"tls {cert = "/path/to/cert.pem"key = "/path/to/key.pem"}
}bridges.mqtt.cloud {server = "mqtts://cloud.example.com:8883"clientid = "edge_gateway_001"username = "admin"password = "public"forwards = ["edge/to/cloud"]
}
六、优势与对比
特性 | NanoMQ | Mosquitto | EMQX |
---|---|---|---|
内存占用 | ~2MB | ~10MB | ~50MB |
MQTT 5.0 支持 | ✅ | ✅ | ✅ |
集群支持 | ❌ | ❌ | ✅ |
规则引擎 | 基础 SQL | ❌ | 高级 SQL + 扩展 |
适用场景 | 边缘计算 | 轻量级通用代理 | 企业级云端部署 |
七、社区与资源
- GitHub 仓库:https://github.com/nanomq/nanomq
- 文档:https://nanomq.io/docs/zh/latest/
- 应用案例:工业预测性维护、智慧农业边缘数据聚合、车联网实时监控。
总结
NanoMQ 是边缘计算场景下理想的 MQTT 消息中间件,凭借其极致的轻量化与高性能,填补了传统代理在资源受限环境中的空白。对于需要在边缘端实现高效数据汇聚、协议转换并连接云端的物联网系统,NanoMQ 是值得优先考虑的选择。
安装部署NanoMQ
以下是 NanoMQ 的安装与部署指南,涵盖多种操作系统和场景:
一、安装方法
1. Linux 系统
Ubuntu/Debian
# 下载最新版本(以 0.15.0 为例)
wget https://github.com/nanomq/nanomq/releases/download/0.15.0/nanomq-0.15.0-linux-amd64.deb# 安装
sudo apt install ./nanomq-0.15.0-linux-amd64.deb# 验证安装
nanomq --version
CentOS/RHEL
# 下载 RPM 包
wget https://github.com/nanomq/nanomq/releases/download/0.15.0/nanomq-0.15.0-el7-amd64.rpm# 安装
sudo rpm -ivh nanomq-0.15.0-el7-amd64.rpm# 启动服务
sudo systemctl start nanomq
树莓派(ARM 架构)
# 下载 ARM 版
wget https://github.com/nanomq/nanomq/releases/download/0.15.0/nanomq-0.15.0-linux-arm64.deb# 安装
sudo apt install ./nanomq-0.15.0-linux-arm64.deb
2. Windows 系统
- 从 GitHub Releases 下载
nanomq-0.15.0-windows-amd64.zip
。 - 解压后进入
bin
目录,双击运行nanomq.exe
(默认监听0.0.0.0:1883
)。
3. 源码编译安装
适用于自定义功能或开发环境:
# 安装依赖
sudo apt install build-essential cmake# 克隆源码
git clone https://github.com/nanomq/nanomq.git
cd nanomq# 编译
mkdir build && cd build
cmake -G Ninja ..
ninja# 安装
sudo ninja install
4. Docker 部署
# 拉取镜像
docker pull emqx/nanomq:latest# 启动容器(映射端口 1883 和配置文件)
docker run -d \-p 1883:1883 \-v /path/to/nanomq.conf:/etc/nanomq.conf \emqx/nanomq:latest
二、配置文件
默认配置文件路径:/etc/nanomq.conf
常用配置项示例:
# 监听 TCP MQTT
listeners.tcp {bind = "0.0.0.0:1883"
}# 启用 WebSocket
listeners.ws {bind = "0.0.0.0:8083"
}# 桥接到云端 MQTT 服务
bridges.mqtt.cloud {server = "mqtts://cloud.example.com:8883"clientid = "edge-node-001"username = "admin"password = "public"forwards = ["edge/to/cloud/#"]
}# 启用 TLS 加密
tls {cert = "/path/to/cert.pem"key = "/path/to/key.pem"
}
三、服务管理
启动/停止
# 前台启动(调试模式)
nanomq start --conf /etc/nanomq.conf# 后台守护进程
nanomq start --daemon# 停止服务
nanomq stop
设为系统服务(Systemd)
创建服务文件 /etc/systemd/system/nanomq.service
:
[Unit]
Description=NanoMQ MQTT Broker
After=network.target[Service]
ExecStart=/usr/bin/nanomq start --conf /etc/nanomq.conf
Restart=on-failure[Install]
WantedBy=multi-user.target
启用并启动:
sudo systemctl enable nanomq
sudo systemctl start nanomq
四、测试连接
订阅消息
nanomq_cli sub -t "test/topic" -q 1
发布消息
nanomq_cli pub -t "test/topic" -m "Hello NanoMQ" -q 1
验证桥接
向桥接主题 edge/to/cloud
发布消息,观察云端是否收到。
五、常见问题
1. 端口被占用
修改配置文件中的 bind
端口,或终止占用进程:
sudo lsof -i :1883 # 查看占用进程
kill -9 <PID> # 终止进程
2. TLS 证书错误
确保证书路径正确且权限允许:
chmod 644 /path/to/cert.pem
chmod 600 /path/to/key.pem
3. 桥接连接失败
检查云端 MQTT 服务的地址、端口、用户名和密码是否正确,确保网络可达。
通过以上步骤,您可以快速完成 NanoMQ 的安装、配置与基础验证。如需高级功能(如规则引擎、插件扩展),请参考 官方文档。
配置NanoMQ
以下是 NanoMQ 的详细配置指南,涵盖核心功能模块和实际场景示例:
一、配置文件结构
默认配置文件路径:/etc/nanomq.conf
采用 HOCON 格式(类 JSON 语法),支持嵌套和注释。
核心模块包括:
- 监听器(Listeners)
- 桥接(Bridges)
- TLS/SSL 加密
- 认证与权限(Authentication)
- 日志(Log)
- 数据持久化(Persistence)
二、核心配置详解
1. 监听器配置
定义 NanoMQ 监听的协议和端口:
listeners {# MQTT over TCP(默认端口 1883)tcp {bind = "0.0.0.0:1883"max_connections = 1024 # 最大连接数}# WebSocket(端口 8083)ws {bind = "0.0.0.0:8083"}# MQTT over TLS(端口 8883)ssl {bind = "0.0.0.0:8883"tls {cert = "/etc/nanomq/cert.pem" # 证书路径key = "/etc/nanomq/key.pem" # 私钥路径}}
}
2. 桥接配置
将边缘数据转发至云端 MQTT 服务:
bridges {mqtt {# 桥接名称(例如云端服务商名称)aws_iot {server = "mqtts://your-iot-endpoint.amazonaws.com:8883" # 云端地址clientid = "edge-device-001" # 客户端 IDusername = "edge-user" # 认证用户名password = "secret" # 认证密码clean_start = true # 是否清除会话keepalive = 60 # 心跳间隔(秒)# 转发规则:本地主题 -> 云端主题forwards = ["sensor/+/temperature -> aws/sensor/+/temp","device/status -> aws/device/status"]# 订阅云端下发的指令subscription = [{topic = "aws/command/#"qos = 1}]}}
}
3. TLS/SSL 加密
启用安全通信:
tls {cert = "/path/to/server.crt" # 服务器证书key = "/path/to/server.key" # 私钥cacert = "/path/to/ca.crt" # CA 证书(可选)verify_peer = false # 是否验证客户端证书(双向认证)fail_if_no_peer_cert = false # 是否拒绝无证书的连接
}
4. 认证与权限
基础认证
auth {# 用户名密码认证user {username = "admin"password = "public" # 支持明文或 bcrypt 哈希}# 匿名访问控制allow_anonymous = false # 禁止匿名连接
}
ACL 权限控制
acl {# 规则语法:允许/拒绝 用户/IP 发布/订阅 主题rules = ["allow user admin pub/sub #", # 管理员拥有全部权限"allow ip 192.168.1.0/24 sub sensor/#", # 允许子网订阅传感器主题"deny all sub $SYS/#" # 禁止所有人订阅系统主题]
}
5. 数据持久化
配置消息存储(防止断电丢失):
persistence {enabled = true # 启用持久化mode = "queue" # 存储模式:队列/内存max_mqueue_len = 10000 # 最大队列长度path = "/var/lib/nanomq" # 存储路径
}
6. 日志管理
调整日志级别和输出:
log {level = info # 日志级别:debug, info, warn, errordir = "/var/log/nanomq" # 日志目录file = "nanomq.log" # 日志文件名rotation {size = "10MB" # 单个日志文件大小count = 5 # 保留的历史日志文件数}
}
三、高级配置场景
场景1:边缘到云端双向同步
bridges {mqtt {cloud_sync {server = "mqtts://cloud.example.com:8883"clientid = "edge-gateway-001"forwards = ["edge/data/# -> cloud/edge/data/#"]subscription = ["cloud/command/# -> edge/command/#"]}}
}
场景2:HTTP WebHook 集成
web_hook {url = "http://localhost:8080/webhook" # 接收端 URLheaders = { "Content-Type" = "application/json" }rules = [{event = "message.publish" # 触发事件(消息发布)topics = ["sensor/#"] # 匹配主题}]
}
场景3:规则引擎(数据过滤)
rule {sql = "SELECT payload.temp FROM 'sensor/#' WHERE payload.temp > 50"actions = ["mqtt://topic/alarm"] # 触发告警主题
}
四、配置验证与重载
1. 语法检查
nanomq check --conf /etc/nanomq.conf
2. 热重载配置
nanomq reload # 不重启服务加载新配置
3. 运行调试模式
nanomq start --conf /etc/nanomq.conf --log-level debug
五、常见问题
1. 配置未生效
- 确保配置文件路径正确,启动时通过
--conf
指定。 - 检查配置项是否拼写错误(如
listener
vslisteners
)。
2. 权限不足
- 日志或数据目录需赋予写入权限:
sudo chown -R nanomq:nanomq /var/lib/nanomq /var/log/nanomq
3. 桥接连接不稳定
- 调整
keepalive
和retry_interval
参数:bridges.mqtt.cloud {keepalive = 30retry_interval = 10s # 重试间隔 }
六、性能调优参数
system {num_taskq_threads = 4 # 任务线程数(建议 CPU 核心数)max_taskq_size = 1024 # 任务队列容量parallel = 256 # 并行处理数tcp {nodelay = true # 禁用 Nagle 算法send_timeout = "5s" # 发送超时}
}
通过灵活组合这些配置项,您可以实现从轻量级边缘消息代理到复杂数据路由网关的功能扩展。建议参考 NanoMQ 官方文档 获取最新配置选项说明。
NanoMQ的配置文件
以下是 NanoMQ 配置文件 的详细说明,涵盖核心配置项和实用示例,帮助您快速掌握关键参数的使用方法。
一、配置文件基础
- 默认路径:
/etc/nanomq.conf
(Linux)或解压目录下的etc/nanomq.conf
(Windows) - 语法格式:HOCON(Human-Optimized Config Object Notation),支持嵌套结构和注释(
#
开头) - 重载配置:支持运行时热更新(
nanomq reload
)
二、核心配置模块详解
1. 网络监听(listeners
)
定义 NanoMQ 监听的协议和端口:
listeners {# MQTT over TCP(默认端口 1883)tcp {bind = "0.0.0.0:1883"max_connections = 1024 # 最大连接数backlog = 1024 # 连接队列长度}# WebSocket(端口 8083)ws {bind = "0.0.0.0:8083"}# MQTT over TLS(端口 8883)ssl {bind = "0.0.0.0:8883"tls {cert = "/path/to/cert.pem" # 证书路径key = "/path/to/key.pem" # 私钥路径verify_peer = false # 是否验证客户端证书}}
}
2. 跨网络桥接(bridges
)
将数据转发至其他 MQTT 服务(如云端平台):
bridges {mqtt {# 桥接名称(自定义)cloud_bridge {server = "mqtts://broker.emqx.io:8883" # 目标地址clientid = "edge-node-001" # 客户端标识username = "admin" # 认证信息password = "public"keepalive = 60 # 心跳间隔(秒)clean_start = true # 是否清除会话proto_ver = 4 # MQTT 协议版本(4=3.1.1,5=5.0)# 转发规则(本地主题 -> 云端主题)forwards = ["sensor/temperature -> cloud/sensor/temp","device/status -> cloud/device/status"]# 订阅云端下发的指令subscription = [{topic = "cloud/command/#"qos = 1}]}}
}
3. 安全认证(auth
)
配置连接认证和权限控制:
auth {# 允许匿名访问(生产环境建议关闭)allow_anonymous = false# 用户名密码认证列表users = [{ username = "admin", password = "public" }{ username = "client", password = "123456" }]# ACL 权限规则acl {rules = ["allow user admin pub/sub #", # 管理员全权限"allow user client sub sensor/#", # 客户端仅订阅传感器主题"deny all sub $SYS/#" # 禁止系统主题访问]}
}
4. 持久化存储(persistence
)
配置消息持久化策略:
persistence {enabled = true # 启用持久化mode = "queue" # 存储模式:queue(队列)或 memory(内存)path = "/var/lib/nanomq" # 数据存储路径max_mqueue_len = 10000 # 最大队列长度flush_interval = "10s" # 刷盘间隔
}
5. 日志管理(log
)
调整日志输出行为:
log {level = "info" # 日志级别:debug | info | warn | errordir = "/var/log/nanomq" # 日志目录file = "nanomq.log" # 日志文件名rotation {size = "10MB" # 单个文件最大大小count = 5 # 保留的历史文件数}
}
三、进阶配置示例
场景1:边缘到云端双向同步
bridges.mqtt.cloud_sync {server = "mqtts://iot-cloud.com:8883"clientid = "gateway-001"forwards = ["edge/data/# -> cloud/edge/data/#"]subscription = ["cloud/cmd/# -> edge/cmd/#"]tls {cert = "/certs/cloud_cert.pem"key = "/certs/cloud_key.pem"}
}
场景2:HTTP 数据转发(WebHook)
web_hook {url = "http://192.168.1.100:8080/webhook"headers = { "Content-Type" = "application/json" }rules = [{event = "message.publish" # 触发事件:客户端发布消息时topics = ["sensor/#"] # 匹配主题过滤器}]
}
场景3:规则引擎过滤数据
rule {sql = "SELECT payload.temp, client_id FROM 'sensor/#' WHERE payload.temp > 50"actions = ["mqtt://topic/alarm", # 发布到告警主题"http://api.example.com/alert" # 发送 HTTP 请求]
}
四、配置验证与调试
-
语法检查:
nanomq check --conf /etc/nanomq.conf
-
热重载配置(无需重启服务):
nanomq reload
-
调试模式启动:
nanomq start --conf /etc/nanomq.conf --log-level debug
五、注意事项
-
路径权限:确保证书、日志和数据目录有读写权限:
chown -R nanomq:nanomq /etc/nanomq /var/lib/nanomq /var/log/nanomq
-
端口冲突:使用
netstat -tunlp | grep 1883
检查端口占用。 -
TLS 证书:自签名证书需客户端配置 CA 证书,否则需设置
verify_peer = false
。 -
性能调优:根据硬件调整线程数:
system {num_taskq_threads = 4 # 建议等于 CPU 核心数max_taskq_size = 2048 # 任务队列容量 }
通过合理配置这些参数,您可以轻松实现从基础的 MQTT 代理到复杂的边缘数据网关的功能扩展。建议参考 官方配置文档 获取最新配置说明。
docker安装部署NanoMQ
以下是使用 Docker 安装和部署 NanoMQ 的详细指南,涵盖基础操作、自定义配置及常见场景示例:
一、快速启动
1. 拉取官方镜像
docker pull emqx/nanomq:latest
2. 运行基础容器
# 默认监听 1883(MQTT)和 8083(WebSocket)
docker run -d \--name nanomq \-p 1883:1883 \ # MQTT TCP 端口-p 8083:8083 \ # WebSocket 端口emqx/nanomq:latest
二、自定义配置
1. 挂载配置文件
创建本地配置文件 nanomq.conf
,然后挂载至容器:
docker run -d \--name nanomq \-p 1883:1883 \-v $(pwd)/nanomq.conf:/etc/nanomq/nanomq.conf \ # 挂载配置文件emqx/nanomq:latest
2. 配置示例文件
nanomq.conf
内容示例:
listeners.tcp {bind = "0.0.0.0:1883"
}bridges.mqtt.cloud {server = "mqtts://broker.emqx.io:8883"clientid = "docker-nanomq"forwards = ["docker/#"]
}log {level = "debug" # 容器内日志级别调至调试模式
}
三、持久化数据存储
1. 挂载数据目录
docker run -d \--name nanomq \-p 1883:1883 \-v $(pwd)/nanomq_data:/var/lib/nanomq \ # 持久化存储路径emqx/nanomq:latest
2. 启用持久化配置
在 nanomq.conf
中添加:
persistence {enabled = truepath = "/var/lib/nanomq" # 与挂载目录一致
}
四、启用 TLS 加密
1. 挂载证书文件
docker run -d \--name nanomq \-p 8883:8883 \-v $(pwd)/tls/cert.pem:/etc/nanomq/cert.pem \-v $(pwd)/tls/key.pem:/etc/nanomq/key.pem \-v $(pwd)/nanomq.conf:/etc/nanomq/nanomq.conf \emqx/nanomq:latest
2. 配置 TLS 监听
nanomq.conf
内容:
listeners.ssl {bind = "0.0.0.0:8883"tls {cert = "/etc/nanomq/cert.pem" # 容器内路径key = "/etc/nanomq/key.pem"}
}
五、使用 Docker Compose 部署
创建 docker-compose.yml
:
version: '3.8'services:nanomq:image: emqx/nanomq:latestcontainer_name: nanomqports:- "1883:1883"- "8083:8083"- "8883:8883"volumes:- ./nanomq.conf:/etc/nanomq/nanomq.conf- ./tls:/etc/nanomq/tls- ./nanomq_data:/var/lib/nanomqrestart: unless-stopped
启动服务:
docker-compose up -d
六、操作命令
1. 查看日志
docker logs nanomq --tail 100 -f # 实时查看最后100行日志
2. 进入容器终端
docker exec -it nanomq /bin/sh
3. 重启服务
docker restart nanomq
七、高级场景示例
场景1:边缘到云端桥接
# nanomq.conf
bridges.mqtt.cloud {server = "mqtts://your-cloud-broker:8883"clientid = "edge-docker-001"username = "admin"password = "public"forwards = ["sensor/#"]tls {cert = "/etc/nanomq/tls/client-cert.pem"key = "/etc/nanomq/tls/client-key.pem"}
}
场景2:集成 Redis 缓存
通过环境变量注入 Redis 地址:
docker run -d \--name nanomq \-e REDIS_HOST=192.168.1.100 \ # 假设插件需要该变量emqx/nanomq:latest
八、常见问题
1. 端口冲突
# 检查端口占用
netstat -tunlp | grep 1883# 修改容器映射端口
docker run -d -p 1884:1883 ... # 主机端口:容器端口
2. 权限不足
确保挂载目录有写入权限:
chmod -R 777 ./nanomq_data # 开发环境临时方案
3. 配置文件未生效
检查容器内路径是否匹配:
docker exec nanomq ls /etc/nanomq/nanomq.conf
九、性能调优
在 nanomq.conf
中调整系统参数:
system {num_taskq_threads = 4 # 建议等于 CPU 核心数max_taskq_size = 2048 # 任务队列容量parallel = 1024 # 并行处理数
}
通过 Docker 部署 NanoMQ 可快速实现边缘 MQTT 服务的容器化,结合挂载配置和数据卷,既能保持轻量化,又能满足生产级稳定性需求。如需更多定制,请参考 NanoMQ Docker 文档。
docker-compose安装部署NanoMQ
以下是使用 docker-compose 部署 NanoMQ 的完整指南,包含基础配置、自定义扩展和实用场景示例:
一、基础部署
1. 创建项目目录
mkdir nanomq-docker && cd nanomq-docker
mkdir -p {conf,data,tls} # 配置文件、数据持久化、证书目录
2. 编写 docker-compose.yml
version: '3.8'services:nanomq:image: emqx/nanomq:latest # 使用官方镜像container_name: nanomqrestart: unless-stopped # 异常退出自动重启ports:- "1883:1883" # MQTT TCP- "8083:8083" # WebSocket- "8883:8883" # MQTT over TLSvolumes:- ./conf/nanomq.conf:/etc/nanomq/nanomq.conf # 挂载配置文件- ./data:/var/lib/nanomq # 持久化数据目录- ./tls:/etc/nanomq/tls # TLS证书目录networks:- mqtt_netnetworks:mqtt_net: # 创建专用网络(可选)driver: bridge
3. 配置文件示例
创建 conf/nanomq.conf
:
listeners {tcp {bind = "0.0.0.0:1883"}ws {bind = "0.0.0.0:8083"}ssl {bind = "0.0.0.0:8883"tls {cert = "/etc/nanomq/tls/server-cert.pem"key = "/etc/nanomq/tls/server-key.pem"}}
}persistence {enabled = truepath = "/var/lib/nanomq"
}
4. 启动服务
docker-compose up -d # 后台运行
docker-compose logs -f # 查看实时日志
二、进阶配置场景
场景1:桥接云端 MQTT 服务
修改 conf/nanomq.conf
添加桥接配置:
bridges.mqtt.cloud {server = "mqtts://broker.emqx.io:8883"clientid = "docker-nanomq"username = "admin"password = "public"forwards = ["edge/# -> cloud/edge/#"]tls {cert = "/etc/nanomq/tls/client-cert.pem" # 客户端证书key = "/etc/nanomq/tls/client-key.pem"}
}
场景2:启用 WebHook 集成
web_hook {url = "http://webhook-server:8080/callback"headers = { "X-Auth-Token" = "your_token" }rules = [{event = "message.publish"topics = ["sensor/#"]}]
}
三、TLS 证书配置
1. 生成自签名证书(示例)
# 生成 CA 证书
openssl req -x509 -newkey rsa:4096 -days 365 -nodes \-keyout tls/ca-key.pem -out tls/ca-cert.pem \-subj "/CN=Nanomq CA"# 生成服务器证书
openssl req -newkey rsa:4096 -nodes \-keyout tls/server-key.pem -out tls/server-req.pem \-subj "/CN=nanomq-server"openssl x509 -req -in tls/server-req.pem -days 60 \-CA tls/ca-cert.pem -CAkey tls/ca-key.pem -CAcreateserial \-out tls/server-cert.pem
2. 证书目录结构
tls/
├── ca-cert.pem # CA 证书
├── server-cert.pem # 服务器证书
└── server-key.pem # 服务器私钥
四、操作命令集
功能 | 命令 |
---|---|
启动服务 | docker-compose up -d |
停止服务 | docker-compose down |
查看日志 | docker-compose logs -f |
进入容器终端 | docker-compose exec nanomq sh |
热重载配置 | docker-compose exec nanomq nanomq reload |
扩容节点 | docker-compose scale nanomq=3 (需集群支持) |
五、完整 docker-compose.yml
示例
version: '3.8'services:nanomq:image: emqx/nanomq:0.15.0 # 指定版本container_name: nanomqports:- "1883:1883"- "8083:8083"- "8883:8883"volumes:- ./conf/nanomq.conf:/etc/nanomq/nanomq.conf- ./data:/var/lib/nanomq- ./tls:/etc/nanomq/tlsenvironment:- NANOMQ_LOG_LEVEL=debug # 环境变量覆盖日志级别networks:- mqtt_net# 可选:搭配 MQTT 客户端测试服务mqtt-client:image: eclipse-mosquitto:latestcommand: sh -c "sleep 10 && mosquitto_sub -h nanomq -t test"depends_on:- nanomqnetworks:- mqtt_netnetworks:mqtt_net:driver: bridge
六、常见问题排查
1. 证书权限错误
# 设置证书目录权限
chmod 644 tls/*.pem
chmod 600 tls/*-key.pem
2. 桥接连接失败
# 进入容器测试网络连通性
docker-compose exec nanomq ping broker.emqx.io
docker-compose exec nanomq openssl s_client -connect broker.emqx.io:8883
3. 配置热重载无效
# 确保配置文件中启用动态加载
system {allow_reload = true # 默认已启用
}
七、生产环境建议
-
资源限制 - 添加 CPU/内存约束:
deploy:resources:limits:cpus: '2'memory: 512M
-
日志轮转 - 避免容器日志膨胀:
logging:driver: "json-file"options:max-size: "10m"max-file: "5"
-
健康检查 - 添加容器健康监测:
healthcheck:test: ["CMD", "nanomq", "ping"]interval: 30stimeout: 10sretries: 3
通过以上配置,您可以快速搭建一个高可用、安全的 MQTT 边缘消息枢纽。根据实际需求扩展桥接规则、安全策略和集成组件,实现完整的物联网数据管道。
k8s安装部署NanoMQ
以下是 Kubernetes (k8s) 上部署 NanoMQ 的完整指南,包含集群化部署、持久化存储和监控集成方案:
一、部署架构设计
- Deployment:无状态代理(默认)或 StatefulSet(需持久化)
- Service:通过
NodePort
/LoadBalancer
暴露 MQTT 端口 - ConfigMap:管理
nanomq.conf
配置文件 - PersistentVolume:持久化消息队列数据(可选)
- Monitoring:集成 Prometheus + Grafana
二、部署步骤
1. 创建 Namespace
# nanomq-namespace.yaml
apiVersion: v1
kind: Namespace
metadata:name: nanomq
2. 创建 ConfigMap
# nanomq-configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:name: nanomq-confignamespace: nanomq
data:nanomq.conf: |listeners.tcp {bind = "0.0.0.0:1883"}persistence {enabled = truepath = "/var/lib/nanomq"}
3. 创建 Deployment
# nanomq-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: nanomqnamespace: nanomq
spec:replicas: 2selector:matchLabels:app: nanomqtemplate:metadata:labels:app: nanomqannotations:prometheus.io/scrape: "true" # 启用监控spec:containers:- name: nanomqimage: emqx/nanomq:0.15.0ports:- containerPort: 1883name: mqttvolumeMounts:- name: config-volumemountPath: /etc/nanomq/nanomq.confsubPath: nanomq.conf- name: datamountPath: /var/lib/nanomqlivenessProbe:exec:command: ["nanomq", "ping"]initialDelaySeconds: 30readinessProbe:tcpSocket:port: 1883volumes:- name: config-volumeconfigMap:name: nanomq-config- name: dataemptyDir: {} # 生产环境建议使用 PVC
4. 创建 Service
# nanomq-service.yaml
apiVersion: v1
kind: Service
metadata:name: nanomqnamespace: nanomq
spec:type: LoadBalancerports:- name: mqttport: 1883targetPort: 1883selector:app: nanomq
三、高级部署场景
场景1:持久化存储(PVC)
# nanomq-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: nanomq-datanamespace: nanomq
spec:accessModes:- ReadWriteOnceresources:requests:storage: 10GistorageClassName: standard # 根据集群调整
修改 Deployment 挂载:
volumes:
- name: datapersistentVolumeClaim:claimName: nanomq-data
场景2:启用 TLS 加密
# 在 ConfigMap 中添加 TLS 配置
data:nanomq.conf: |listeners.ssl {bind = "0.0.0.0:8883"tls {cert = "/etc/nanomq/tls/server-cert.pem"key = "/etc/nanomq/tls/server-key.pem"}}# 创建 Secret 存储证书
kubectl create secret tls nanomq-tls \--cert=server-cert.pem \--key=server-key.pem \-n nanomq# 在 Deployment 中挂载 Secret
volumeMounts:
- name: tlsmountPath: /etc/nanomq/tls
volumes:
- name: tlssecret:secretName: nanomq-tls
四、监控集成(Prometheus)
1. 启用 NanoMQ Prometheus 插件
在 nanomq.conf
中添加:
prometheus {enable = trueport = 9283
}
2. 部署 ServiceMonitor
# nanomq-servicemonitor.yaml
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:name: nanomq-monitornamespace: nanomq
spec:endpoints:- port: prometheusinterval: 15sselector:matchLabels:app: nanomq
五、操作命令
# 一键部署
kubectl apply -f nanomq-namespace.yaml
kubectl apply -f nanomq-configmap.yaml
kubectl apply -f nanomq-deployment.yaml
kubectl apply -f nanomq-service.yaml# 查看状态
kubectl -n nanomq get pods -o wide
kubectl -n nanomq logs -f <pod-name># 测试 MQTT 连接
kubectl -n nanomq port-forward svc/nanomq 1883:1883 &
nanomq_cli sub -t "k8s/test" -h localhost
六、生产环境优化
1. 资源配额限制
resources:limits:cpu: "2"memory: "512Mi"requests:cpu: "500m"memory: "256Mi"
2. 亲和性调度
affinity:podAntiAffinity:preferredDuringSchedulingIgnoredDuringExecution:- weight: 100podAffinityTerm:labelSelector:matchExpressions:- key: appoperator: Invalues: [nanomq]topologyKey: kubernetes.io/hostname
七、故障排查
1. Pod 启动失败
kubectl describe pod -n nanomq <pod-name> # 查看事件日志
kubectl logs -n nanomq <pod-name> --previous # 查看前一个容器的日志
2. 网络连通性问题
kubectl -n nanomq run net-tools --image=nicolaka/netshoot -it --rm
curl telnet://nanomq:1883 # 测试集群内访问
通过以上配置,您可以在 Kubernetes 集群中快速部署高可用、可扩展的 NanoMQ 消息服务,满足物联网边缘计算场景下的 MQTT 通信需求。
Windows安装部署NanoMQ
以下是 Windows 系统 上安装和部署 NanoMQ 的详细指南,涵盖从基础安装到高级配置的完整流程:
一、下载与安装
1. 获取二进制包
- 访问 NanoMQ GitHub Releases 页面。
- 下载适用于 Windows 的压缩包(如
nanomq-0.15.0-windows-amd64.zip
)。
2. 解压文件
将压缩包解压到目标目录(如 C:\nanomq
),目录结构如下:
nanomq/
├── bin/
│ ├── nanomq.exe # 主程序
│ └── nanomq_cli.exe # 客户端工具
├── etc/
│ └── nanomq.conf # 配置文件
└── logs/ # 日志目录
3. 配置环境变量(可选)
将 bin
目录加入系统 PATH,以便全局调用:
- 右键点击 此电脑 > 属性 > 高级系统设置 > 环境变量。
- 在 系统变量 中找到
Path
,点击 编辑,添加 NanoMQ 的bin
目录路径(如C:\nanomq\bin
)。
二、快速启动
1. 命令行启动
# 进入 NanoMQ 目录
cd C:\nanomq# 启动服务(默认加载当前目录的 etc/nanomq.conf)
bin\nanomq.exe start
2. 验证运行
打开浏览器访问 http://localhost:8081
(默认 Web 仪表盘端口),或查看日志文件 logs\nanomq.log
。
三、配置文件
1. 修改配置
编辑 etc\nanomq.conf
(示例配置):
listeners {tcp {bind = "0.0.0.0:1883"}ws {bind = "0.0.0.0:8083"}
}# 启用基础认证
auth {allow_anonymous = falseusers = [{ username = "admin", password = "public" }]
}
2. 指定配置文件启动
bin\nanomq.exe start --conf "C:\nanomq\etc\nanomq.conf"
四、作为 Windows 服务运行
1. 使用 NSSM 工具
- 下载 NSSM。
- 解压后,将
nssm.exe
复制到C:\Windows\System32
。
2. 创建服务
# 以管理员身份运行 CMD
nssm install NanoMQ# 设置服务参数:
- Path: C:\nanomq\bin\nanomq.exe
- Startup Directory: C:\nanomq
- Arguments: start --conf "C:\nanomq\etc\nanomq.conf"
3. 管理服务
nssm start NanoMQ # 启动服务
nssm stop NanoMQ # 停止服务
nssm remove NanoMQ # 删除服务
五、启用 TLS 加密
1. 生成证书
使用 OpenSSL 生成自签名证书:
# 安装 OpenSSL(如通过 Chocolatey)
choco install openssl# 生成证书
openssl req -x509 -newkey rsa:4096 -nodes -days 365 \-keyout server-key.pem -out server-cert.pem \-subj "/CN=localhost"
2. 配置 TLS
修改 nanomq.conf
:
listeners.ssl {bind = "0.0.0.0:8883"tls {cert = "C:\\nanomq\\certs\\server-cert.pem" # 注意 Windows 路径转义key = "C:\\nanomq\\certs\\server-key.pem"}
}
六、测试 MQTT 通信
1. 使用 nanomq_cli
工具
# 订阅主题(新窗口)
nanomq_cli.exe sub -t "test" -q 1# 发布消息
nanomq_cli.exe pub -t "test" -m "Hello Windows" -q 1
2. 使用 MQTTX 客户端
- 下载 MQTTX。
- 连接
localhost:1883
,输入用户名密码(如admin/public
)。 - 发布/订阅消息验证功能。
七、常见问题
1. 端口被占用
# 查找占用端口的进程
netstat -ano | findstr :1883# 终止进程(替换 <PID>)
taskkill /PID <PID> /F
2. 证书路径错误
- 使用绝对路径,并确保反斜杠转义(如
C:\\nanomq\\certs\\cert.pem
)。 - 检查证书文件权限,确保可读。
3. 缺少 DLL 文件
安装 Visual C++ Redistributable。
八、卸载 NanoMQ
- 停止服务:
nssm stop NanoMQ
。 - 删除服务:
nssm remove NanoMQ
。 - 手动删除安装目录
C:\nanomq
。 - 移除环境变量中的 NanoMQ 路径。
通过以上步骤,您可以在 Windows 系统上快速搭建一个高性能的 MQTT 消息代理,满足边缘计算或本地测试需求。如需更多功能(如规则引擎、数据桥接),请参考 NanoMQ 官方文档。
Ubuntu安装部署NanoMQ
以下是 Ubuntu 系统 上安装和部署 NanoMQ 的完整指南,涵盖多种安装方式和配置场景:
一、安装方法
方法1:通过 APT 仓库安装(推荐)
# 添加 NanoMQ 官方仓库
curl -sSL https://repo.emqx.io/nanomq/install.sh | sudo bash# 更新软件包列表
sudo apt update# 安装 NanoMQ
sudo apt install nanomq# 验证安装
nanomq --version
方法2:通过 Snap 安装
# 安装 Snap(如未安装)
sudo apt install snapd# 安装 NanoMQ Snap 包
sudo snap install nanomq
方法3:通过源码编译安装
# 安装编译依赖
sudo apt install -y git cmake build-essential# 克隆源码
git clone https://github.com/nanomq/nanomq.git
cd nanomq# 编译并安装
mkdir build && cd build
cmake -G Ninja ..
ninja
sudo ninja install
方法4:Docker 安装
# 拉取镜像
sudo docker pull emqx/nanomq:latest# 运行容器(映射端口和配置)
sudo docker run -d \-p 1883:1883 \-v /path/to/nanomq.conf:/etc/nanomq/nanomq.conf \emqx/nanomq:latest
二、基础配置
1. 修改配置文件
默认路径:/etc/nanomq/nanomq.conf
编辑配置文件(示例配置):
# 监听 TCP 和 WebSocket
listeners {tcp {bind = "0.0.0.0:1883"max_connections = 1024}ws {bind = "0.0.0.0:8083"}
}# 启用基础认证
auth {allow_anonymous = falseusers = [{ username = "admin", password = "public" }]
}
2. 启动服务
# 指定配置文件启动
sudo nanomq start --conf /etc/nanomq/nanomq.conf# 查看运行状态
sudo nanomq_ctl status
三、进阶配置场景
场景1:启用 TLS 加密
-
生成证书:
sudo apt install openssl openssl req -x509 -newkey rsa:4096 -nodes -days 365 \-keyout /etc/nanomq/server-key.pem \-out /etc/nanomq/server-cert.pem \-subj "/CN=nanomq-server"
-
配置 TLS:
listeners.ssl {bind = "0.0.0.0:8883"tls {cert = "/etc/nanomq/server-cert.pem"key = "/etc/nanomq/server-key.pem"} }
场景2:桥接到云端 MQTT 服务
bridges.mqtt.cloud {server = "mqtts://broker.emqx.io:8883"clientid = "ubuntu-edge-001"username = "admin"password = "public"forwards = ["edge/# -> cloud/edge/#"]
}
四、服务管理
1. 使用 Systemd 托管服务
创建服务文件 /etc/systemd/system/nanomq.service
:
[Unit]
Description=NanoMQ MQTT Broker
After=network.target[Service]
ExecStart=/usr/bin/nanomq start --conf /etc/nanomq/nanomq.conf
Restart=on-failure
User=root[Install]
WantedBy=multi-user.target
启用并启动服务:
sudo systemctl daemon-reload
sudo systemctl enable nanomq
sudo systemctl start nanomq
2. 常用命令
# 启动/停止/重启
sudo systemctl start nanomq
sudo systemctl stop nanomq
sudo systemctl restart nanomq# 查看日志
journalctl -u nanomq -f
五、测试连接
1. 使用 nanomq_cli
工具
# 订阅主题
nanomq_cli sub -t "test/ubuntu" -q 1# 发布消息(新终端)
nanomq_cli pub -t "test/ubuntu" -m "Hello Ubuntu" -q 1
2. 使用 MQTTX 客户端
- 安装 MQTTX:
sudo snap install mqttx
- 连接至
mqtt://localhost:1883
,输入用户名密码(如admin/public
)。
六、常见问题
1. 端口冲突
# 检查端口占用
sudo lsof -i :1883# 终止占用进程(替换 <PID>)
sudo kill -9 <PID>
2. 证书权限错误
sudo chmod 644 /etc/nanomq/server-cert.pem
sudo chmod 600 /etc/nanomq/server-key.pem
3. 配置文件未生效
# 检查配置语法
nanomq check --conf /etc/nanomq/nanomq.conf# 热重载配置
sudo systemctl restart nanomq
七、卸载 NanoMQ
# APT 安装方式
sudo apt remove nanomq# 源码编译安装
sudo ninja uninstall # 在源码 build 目录执行# 清除残留文件
sudo rm -rf /etc/nanomq /var/lib/nanomq
通过以上步骤,您可以在 Ubuntu 系统上快速搭建一个高性能的 MQTT 消息代理,适用于物联网边缘计算、数据采集等场景。如需更多高级功能(规则引擎、集群模式),请参考 NanoMQ 官方文档。
fedora安装部署NanoMQ
以下是 Fedora 系统 上安装和部署 NanoMQ 的详细指南,涵盖多种安装方式和配置场景:
一、安装方法
方法1:通过 RPM 包安装
-
下载 RPM 包
访问 NanoMQ Releases 页面,下载适用于 Fedora 的 RPM 包(如nanomq-0.15.0-el8.x86_64.rpm
)。 -
安装 RPM 包
sudo dnf install ./nanomq-0.15.0-el8.x86_64.rpm
-
验证安装
nanomq --version
方法2:通过源码编译安装
-
安装依赖
sudo dnf install -y git cmake gcc make openssl-devel
-
克隆源码并编译
git clone https://github.com/nanomq/nanomq.git cd nanomq mkdir build && cd build cmake -G Ninja .. ninja sudo ninja install
方法3:使用 Docker 部署
-
安装 Docker
sudo dnf install docker sudo systemctl start docker sudo systemctl enable docker
-
运行 NanoMQ 容器
sudo docker run -d \-p 1883:1883 \-v /path/to/nanomq.conf:/etc/nanomq/nanomq.conf \emqx/nanomq:latest
二、基础配置
1. 配置文件路径
- 默认路径:
/etc/nanomq/nanomq.conf
编辑配置文件(示例配置):listeners.tcp {bind = "0.0.0.0:1883"max_connections = 1024 }auth {allow_anonymous = falseusers = [{ username = "admin", password = "public" }] }
2. 启动服务
# 指定配置文件启动
sudo nanomq start --conf /etc/nanomq/nanomq.conf# 验证运行状态
sudo nanomq_ctl status
三、进阶配置场景
场景1:启用 TLS 加密
-
生成自签名证书
sudo dnf install openssl openssl req -x509 -newkey rsa:4096 -nodes -days 365 \-keyout /etc/nanomq/server-key.pem \-out /etc/nanomq/server-cert.pem \-subj "/CN=nanomq-fedora"
-
配置 TLS 监听
在nanomq.conf
中添加:listeners.ssl {bind = "0.0.0.0:8883"tls {cert = "/etc/nanomq/server-cert.pem"key = "/etc/nanomq/server-key.pem"} }
场景2:桥接至云端 MQTT 服务
bridges.mqtt.cloud {server = "mqtts://broker.emqx.io:8883"clientid = "fedora-edge-001"username = "admin"password = "public"forwards = ["fedora/sensor/# -> cloud/sensor/#"]
}
四、服务管理
1. 使用 Systemd 托管服务
创建服务文件 /etc/systemd/system/nanomq.service
:
[Unit]
Description=NanoMQ MQTT Broker
After=network.target[Service]
ExecStart=/usr/bin/nanomq start --conf /etc/nanomq/nanomq.conf
Restart=on-failure
User=root[Install]
WantedBy=multi-user.target
启用并启动服务:
sudo systemctl daemon-reload
sudo systemctl enable nanomq
sudo systemctl start nanomq
2. 常用命令
# 启动/停止/重启
sudo systemctl start nanomq
sudo systemctl stop nanomq
sudo systemctl restart nanomq# 查看日志
journalctl -u nanomq -f
五、防火墙配置
开放 MQTT 端口:
sudo firewall-cmd --permanent --add-port=1883/tcp
sudo firewall-cmd --reload
六、测试连接
1. 使用 nanomq_cli
工具
# 订阅主题
nanomq_cli sub -t "fedora/test" -q 1# 发布消息(新终端)
nanomq_cli pub -t "fedora/test" -m "Hello Fedora" -q 1
2. 使用 MQTTX 客户端
- 安装 MQTTX(Snap 方式):
sudo dnf install snapd sudo ln -s /var/lib/snapd/snap /snap sudo snap install mqttx
- 连接至
mqtt://localhost:1883
,使用用户名admin
和密码public
。
七、常见问题
1. 端口冲突
# 查找占用端口的进程
sudo ss -tulnp | grep :1883# 终止进程(替换 <PID>)
sudo kill -9 <PID>
2. SELinux 权限问题
临时禁用 SELinux(仅用于测试):
sudo setenforce 0
或添加策略规则:
sudo ausearch -c 'nanomq' --raw | audit2allow -M my-nanomq
sudo semodule -i my-nanomq.pp
3. 证书路径错误
确保证书路径正确且权限开放:
sudo chmod 644 /etc/nanomq/server-cert.pem
sudo chmod 600 /etc/nanomq/server-key.pem
八、卸载 NanoMQ
RPM 包安装方式
sudo dnf remove nanomq
sudo rm -rf /etc/nanomq /var/lib/nanomq
源码编译安装方式
# 在源码 build 目录执行
sudo ninja uninstall
通过以上步骤,您可以在 Fedora 系统上快速部署一个高性能的 MQTT 代理,适用于物联网边缘计算或本地开发测试。如需更多高级功能(如规则引擎、集群模式),请参考 NanoMQ 官方文档。
NanoMQ 对比 EMQX , mosquitto
以下是 NanoMQ、EMQX 和 Mosquitto 三款主流 MQTT Broker 的对比分析,涵盖架构设计、性能、功能特性、适用场景及社区生态等方面:
1. 架构设计与性能
特性 | NanoMQ | EMQX | Mosquitto |
---|---|---|---|
架构 | 基于 NNG 的异步 I/O 多线程模型,支持 Actor 线程模型,充分利用多核 CPU | 分布式架构,基于 Erlang/OTP,支持 masterless 集群和高可用性 | 单线程设计,依赖 epoll 实现高效事件循环 |
性能 | 高吞吐(10 倍于 Mosquitto)、低延迟,支持边缘端多协议转换 | 企业级高性能,支持百万级并发连接,低延迟 | 轻量级,低资源占用(内存 <1MB),但扩展性有限(<10 万连接) |
资源占用 | 约 2MB 内存启动,适合资源受限的边缘设备 | 约 50MB 内存启动,适合云端和资源丰富的场景 | 内存占用最低(<1MB),适合嵌入式设备 |
2. 功能特性
特性 | NanoMQ | EMQX | Mosquitto |
---|---|---|---|
协议支持 | MQTT 3.1.1/5.0、MQTT over QUIC、WebSocket、DDS/NNG/ZeroMQ 协议桥接 | MQTT 3.1.1/5.0、MQTT-SN、MQTT over QUIC、CoAP 等 | MQTT 3.1.1/5.0、WebSocket、TLS/SSL |
扩展功能 | 规则引擎、HTTP API、WebHook、消息持久化(SQLite/MySQL) | 企业级功能:数据集成(Kafka、数据库)、集群、双向 SSL、商业支持 | 基础功能完善,但缺乏高级管理功能(如 Dashboard) |
安全特性 | TLS/SSL、用户名密码认证、ACL 权限控制 | 多层级安全机制(LDAP、JWT、双向 TLS)、企业级认证集成 | TLS/SSL、基础 ACL 支持 |
3. 适用场景
场景 | NanoMQ | EMQX | Mosquitto |
---|---|---|---|
边缘计算 | 工业物联网边缘网关、机器人、车联网(支持多协议转换) | 云端大规模数据聚合、车联网平台、智慧城市 | 低功耗传感器、嵌入式设备、小型工业网关 |
扩展性需求 | 单节点高性能,支持 QUIC 桥接至云端 | 分布式集群,支持水平扩展和高可用性 | 单节点部署,无集群支持 |
开发复杂度 | 配置灵活,适合有经验的开发者 | 安装配置复杂,需专业运维 | 配置简单,适合快速部署 |
4. 社区与生态
维度 | NanoMQ | EMQX | Mosquitto |
---|---|---|---|
社区活跃度 | 新兴项目(2020 年启动),代码提交频繁,发展势头强劲 | 最活跃(GitHub 11.5k Stars),企业级支持完善 | 成熟稳定(GitHub 7.2k Stars),社区支持广泛 |
开源协议 | MIT 许可证 | Apache License 2.0 | EPL/EDL 许可证 |
文档与工具 | 提供 CLI 工具和性能测试模块 | 文档详尽,提供商业版和云服务(EMQX Cloud) | 文档完善,配套 mosquitto_pub/sub 命令行工具 |
5. 核心优势与局限性
-
NanoMQ
- 优势:轻量高性能、多协议桥接、QUIC 支持,适合边缘复杂场景。
- 局限:不支持集群,社区生态尚在发展中。
-
EMQX
- 优势:分布式架构、企业级功能、高扩展性,适合云端大规模部署。
- 局限:资源消耗较高,学习成本较高。
-
Mosquitto
- 优势:极简设计、低资源占用,适合嵌入式设备和快速验证场景。
- 局限:单线程架构限制扩展性,缺乏高级功能。
总结与选型建议
- 边缘计算与高性能需求:选择 NanoMQ,尤其需要多协议转换或 QUIC 支持时。
- 企业级云端部署:选择 EMQX,适用于高并发、高可用性和复杂集成的场景。
- 嵌入式设备与快速验证:选择 Mosquitto,适合资源受限环境和简单消息代理需求。
三者可协同使用(如边缘用 NanoMQ,云端用 EMQX),构建统一的物联网数据管道。如需进一步测试,可使用 MQTTX 或 NanoMQ CLI 工具进行验证。
WebSocker 连接 NanoMQ
以下是 通过 WebSocket 连接 NanoMQ 的完整指南,包含服务端配置、客户端连接方法和常见问题排查:
一、NanoMQ 服务端配置
1. 启用 WebSocket 监听器
编辑 NanoMQ 配置文件(默认路径 /etc/nanomq/nanomq.conf
):
listeners {ws {bind = "0.0.0.0:8083" # WebSocket 默认端口path = "/mqtt" # WebSocket 路径(可选)max_connections = 1024 # 最大连接数}
}
2. 启用 WebSocket over TLS (WSS)
listeners.wss {bind = "0.0.0.0:8084"tls {cert = "/path/to/server-cert.pem" # 证书路径key = "/path/to/server-key.pem" # 私钥路径}
}
3. 重启服务使配置生效
nanomq stop && nanomq start --conf /etc/nanomq/nanomq.conf
二、客户端连接方法
1. JavaScript 客户端(浏览器)
使用 MQTT.js 库:
const mqtt = require('mqtt');// 连接参数
const client = mqtt.connect('ws://your-nanomq-ip:8083/mqtt', {username: 'admin', // 认证信息(若启用)password: 'public',clientId: 'web-client-' + Math.random().toString(16).substr(2, 8)
});// 订阅主题
client.on('connect', () => {client.subscribe('web/data', (err) => {if (!err) client.publish('web/data', 'Hello from Browser!');});
});// 接收消息
client.on('message', (topic, message) => {console.log(`Received: ${message.toString()} on ${topic}`);
});
2. 使用 MQTTX 工具
- 下载 MQTTX 客户端。
- 新建连接,选择 WebSocket 协议:
- Host:
ws://your-nanomq-ip:8083
- Path:
/mqtt
(与配置一致) - Client ID: 自定义(如
mqttx-web-client
) - 填写认证信息(若启用)
- Host:
三、高级配置场景
场景1:跨域访问支持
在配置文件中添加 HTTP 服务配置:
http_server {port = 8080allow_cors = true # 启用跨域支持cors_headers = "*" # 允许所有域名
}
场景2:调整 WebSocket 消息大小限制
listeners.ws {bind = "0.0.0.0:8083"max_packet_size = "1MB" # 最大消息大小(默认 1MB)
}
四、连接验证
1. 检查 WebSocket 端口监听
netstat -tuln | grep 8083
# 预期输出:LISTEN 0 1024 0.0.0.0:8083
2. 使用在线工具测试
访问 WebSocket 在线测试工具,输入地址:
ws://your-nanomq-ip:8083/mqtt
五、常见问题排查
1. 连接被拒绝
- 检查防火墙:
sudo ufw allow 8083/tcp # Ubuntu/Debian sudo firewall-cmd --add-port=8083/tcp --permanent # CentOS/Fedora
- 验证服务日志:
tail -f /var/log/nanomq/nanomq.log | grep "WebSocket"
2. WebSocket 握手失败
- 路径不匹配:确保客户端连接的路径与配置中的
path
一致。 - 协议头错误:客户端需发送标准的 WebSocket 协议头,附加 MQTT 子协议:
Sec-WebSocket-Protocol: mqtt
3. 消息丢失或延迟
- 调整 QoS 等级:在客户端发布消息时指定 QoS(如 QoS 1):
client.publish('topic', 'message', { qos: 1 });
- 检查网络带宽:WebSocket 长连接对网络稳定性要求较高。
六、性能优化建议
-
启用压缩(若传输 JSON/文本):
listeners.ws {bind = "0.0.0.0:8083"compress = true # 启用 permessage-deflate 压缩 }
-
调整线程池大小:
system {num_taskq_threads = 4 # 建议等于 CPU 核心数 }
通过以上步骤,您可以快速实现浏览器、移动端或其他 WebSocket 客户端与 NanoMQ 的高效通信,适用于实时监控、即时聊天等场景。如需更多高级功能(如规则引擎处理 WebSocket 数据),请参考 NanoMQ 文档。
相关文章:
NanoMQ ds笔记250306
NanoMQ多版本下载地址 https://www.emqx.com/zh/downloads/nanomq NanoMQ官方文档 https://nanomq.io/docs/zh/latest/ NanoMQ 是一个专为物联网边缘计算设计的轻量级、高性能 MQTT 消息代理(Message Broker),由中国的开源物联网公司 EMQ 开…...
sqlmap:从基础用法到漏洞利用实战
1. sqlmap基础认知 sqlmap是一款开源的渗透测试工具,能自动检测和利用SQL注入漏洞,支持MySQL、Oracle、PostgreSQL等多种数据库管理系统。其设计旨在简化SQL注入检测流程,助力安全人员在复杂网络环境中快速定位与评估漏洞风险。它通过发送精…...
DFS学习笔记
题目描述 X 国王有一个地宫宝库。是 nm 个格子的矩阵。每个格子放一件宝贝。每个宝贝贴着价值标签。 地宫的入口在左上角,出口在右下角。 小明被带到地宫的入口,国王要求他只能向右或向下行走。 走过某个格子时,如果那个格子中的宝贝价值…...
C++ STL string容器全解析
一、引言 在 C 编程的广阔领域中,字符串处理是一项极为基础且频繁的操作。从简单的文本解析,到复杂的文件读取与处理,字符串几乎无处不在。而 C 中的 string 容器,就像是一把瑞士军刀,为我们处理字符串提供了强大而便…...
React基础之项目创建
项目创建 create-react-app 项目名(小写) 运行 pnpm run start 在React中,使用的语法格式是jsx,也就是js与html相结合的形式 import logo from ./logo.svg; import ./App.css; function App() { return ( <div className"App"> <head…...
迷你世界脚本道具接口:Item
道具接口:Item 彼得兔 更新时间: 2023-04-26 10:26:18 继承自 Actor 具体函数名及描述如下: 序号 函数名 函数描述 1 getItemName(...) 获取道具名称 2 getItemId(...) 获取actor对应的道具ID,如球类等 3 getDropItemNum(...) …...
Unity摄像机跟随物体
功能描述 实现摄像机跟随物体,并使物体始终保持在画面中心位置。 实现步骤 创建脚本:在Unity中创建一个新的C#脚本,命名为CameraFollow。 代码如下: using UnityEngine;public class CameraFollow : MonoBehaviour {public Tran…...
计算机毕业设计SpringBoot+Vue.js青年公寓服务平台(源码+文档+PPT+讲解)
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
vue实现日历签到效果
在工作任务进行时,有一个签到日历的功能需求要实现,经过文档查询和样式优化实现了需求,在此记录一下。 技术背景:vue2vant(样式控件) less 一个公共样式文件 html实现部分: <div class"calenderB…...
(十 八)趣学设计模式 之 观察者模式!
目录 一、 啥是观察者模式?二、 为什么要用观察者模式?三、 观察者模式的实现方式四、 观察者模式的优缺点五、 观察者模式的应用场景六、 总结 🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方式,…...
笔记:在Git中.gitmodules文件的功能和作用和如何使用
一、目的:简单介绍下在Git中.gitmodules文件的功能和作用已经 .gitmodules 文件是 Git 子模块(submodule)功能的一部分,用于管理和配置子模块。子模块允许一个 Git 仓库包含另一个 Git 仓库作为其子目录,这对于管理依赖…...
Swift 常量
Swift 常量 引言 Swift 是一种由苹果公司开发的编程语言,主要用于 iOS、macOS、watchOS 和 tvOS 等平台的应用开发。在 Swift 中,常量是一种不可变的变量,它用于存储固定不变的值。了解和使用常量是 Swift 编程的基础,本文将详细介绍 Swift 常量的概念、类型、声明以及使…...
Ubuntu20.04双系统安装及软件安装(七):Anaconda3
Ubuntu20.04双系统安装及软件安装(七):Anaconda3 打开Anaconda官网,在右侧处填写邮箱(要真实有效!),然后Submit。会出现如图示的Success界面。 进入填写的邮箱,有一封Ana…...
Google AI概览升级,AI模式全新登场!
每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...
【智能体架构:Agent】LangChain智能体类型ReAct、Self-ASK的区别
1. 什么是智能体 将大语言模型作为一个推理引擎。给定一个任务, 智能体自动生成完成任务所需步骤, 执行相应动作(例如选择并调用工具), 直到任务完成。 2. 先定义工具:Tools 可以是一个函数或三方 API也…...
nginx 配置403页面(已亲测)
问题:GET请求访问漏洞url即可看到泄露的内网ip 解决方式: 1.配置nginx 不显示真实Ip 2.限制接口只能是POST请求 具体配置: 编写一个403.html 在nginx的配置文件中,配置location参数: location /api/validationCode…...
安卓基础组件Looper - 02 native层面的剖析
文章目录 native使用使用总结创建Looper构造函数创建(不推荐)使用举例源代码 Looper::prepare 获取Looper可忽略初始化Looper主动休眠 pollAll主动唤醒 wake 发送消息 sendMessage轮询消息 native使用 Android Native Looper 机制 - 掘金 (juejin.cn) /system/core/libutils/…...
nodejs关于后端服务开发的探究
前提 在当前的环境中关于web server的主流开发基本上都是java、php之类的,其中java spring系列基本上占了大头,而python之流也在奋起直追,但别忘了nodejs也是可以做这个服务的,只是位置有点尴尬,现在就来探究下nodejs…...
QTday4
1:是进度条通过线程自己动起来 mythread.h #ifndef MYTHREAD_H #define MYTHREAD_H #include <QThread>class mythread : public QThread {Q_OBJECT public:mythread(QObject* parent nullptr); protected:virtual void run() override; private: signals:virtual voi…...
服务器时间同步
方法一 [rootbogon hwh-ansible]# cat time-sync.sh #!/bin/bash # NTP 服务器信息 NTP_SERVER"192.168.42.12" PASSWORD"123456" # 多个 IP 地址 HOSTS("192.168.42.8" "192.168.42.9" "192.168.42.10" "192.168.42…...
蓝桥杯备赛日记【day1】(c++赛道)
一、裁纸刀问题(2022、规律、思维、省赛) 解法思路: 参考题目给出的例子发现。不管要裁剪多少次。最外围的四次是固定的。然后通过观察发现,我们的行的裁剪次数为(m-1) 次,而每行都需要裁剪列数…...
DeepSeek大模型 —— 全维度技术解析
DeepSeek大模型 —— 全维度技术解析 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家!点我试试!! 文章目录 DeepSeek大模型 —— 全维度技术解析一、模型架构全景解析1.1…...
嵌入式开发:傅里叶变换(5):基于STM32,实现CMSIS中的DSP库
目录 步骤 1:准备工作 步骤 2:创建 Keil 项目,并配置工程 步骤 3:在MDK工程上添加 CMSIS-DSP 库 步骤 5:编写代码 步骤 6:配置时钟和优化 步骤 7:调试与验证 步骤 8:优化和调…...
Ubuntu 24.04 配置ODBC连接ORACLE 11G数据库
1. 安装必要工具和驱动 1.1 安装unixODBC和依赖库 # apt update # apt install unixodbc unixodbc-dev libaio1 执行失败,报错 libaio1包找不到,先跳过,安装其他两个。 # apt install unixodbc unixodbc-dev 安装成功 1.2 下载Oracle…...
upload-labs靶场 1-21通关
目录 1.Pass-01 前端绕过 分析 解题 2.Pass-02 服务器端检测--修改IMME 分析 解题 3.Pass-03 黑名单绕过 分析 解题 4.Pass-04 .htaccess绕过 分析 解题 5.Pass-05 . .绕过和.user.ini绕过 分析 解题 6.Pass-06 大小写绕过 分析 解题 7.Pass-07 空格绕过 分…...
Docker新手入门(持续更新中)
一、定义 快速构建、运行、管理应用的工具。 Docker可以帮助我们下载应用镜像,创建并运行镜像的容器,从而快速部署应用。 所谓镜像,就是将应用所需的函数库、依赖、配置等应用一起打包得到的。 所谓容器,为每个镜像的应用进程创建…...
c语言笔记 指针篇(上)
1.指针 在计算的存储器中有很多的存储单元,我们的操作系统把这些存储单元以字节为单位进行编号,也就是每个存储单元(字节),都有编码。这些编码在我们内存中就称为地址。一个字节有八位,位是存储信息的最小单…...
要查看 SQLite 数据库中的所有表,可以通过查询 SQLite 的系统表 sqlite_master
要查看 SQLite 数据库中的所有表,可以查询 SQLite 的系统表 sqlite_master。 每个 SQLite 数据库都包含一个名为 sqlite_master 的系统表。该表定义了数据库的模式,存储了数据库中所有表、索引、视图和触发器等对象的信息。 通过查询 sqlite_master&am…...
C#释放内存空间的方法
目录 前言释放 C# 对象内存的六种方法1、手动释放内存空间2、使用 Using 语句3、使用 垃圾回收器4、GC.Collect() 方法5、GC.WaitForPendingFinalizers() 方法6、WeakReference 类 注意 前言 当不再需要对象时释放内存空间对于防止内存泄漏和提高应用程序性能至关重要。C# 提供…...
mapbox基础,使用点类型geojson加载symbol符号图层,用于标注文字
👨⚕️ 主页: gis分享者 👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性1.3 ☘️symbol符号图层样式二、🍀使用点类型…...
Java数组详解/从JVM理解数组/数组反转/随机排名/数组在计算机如何存储
本文详细讲解了数组的定义、数组的访问方法、数组的遍历、静态数组和动态数组、以及数组中的自动类型转换、引用类型指向数组的地址、以及从JVM理解数组、空指针异常、数组反转、随机排名的案例。 数组是存放在连续内存空间上的相同类型数据的集合。 数组可以方便的通过下标索…...
网络安全wireshark题目
一、填空题: 网络安全的目标是在计算机网络的信息传输、存储与处理的整个过程中,提高 物理逻辑上 的防护、监控、反应恢复和 对抗 的能力。SSL协议是在网络传输过程中,提供通信双方网络信息 保密性 和 可靠性 。TCP/IP网络安全管理…...
TomcatServlet
https://www.bilibili.com/video/BV1UN411x7xe tomcat tomcat 架构图,与 jre,应用程序之前的关系 安装使用 tomcat 10 开始,api 从 javax.* 转为使用 jakarta.*,需要至少使用 jdk 11 cmd 中默认 gbk 编码,解决控制…...
Seurat - Guided Clustering Tutorial官方文档学习及复现
由于本人没有使用过Seurat4.0,而是直接使用的最新版。所以本文都是基于Seurat5.2.0(截止2025/3/6)来进行撰写。 参考的官方教程来进行学习(上图中的 Guided tutorial-2.700 PBMCs),肯定没有官方文档那么全面…...
Python数据分析面试题及参考答案
目录 处理 DataFrame 中多列缺失值的 5 种方法 批量替换指定列中的异常值为中位数 使用正则表达式清洗电话号码格式 合并两个存在部分重叠列的 DataFrame 将非结构化 JSON 日志转换为结构化表格 处理日期列中的多种非标准格式(如 "2023 年 12 月 / 05 日") 识…...
极狐GitLab 正式发布安全版本17.9.1、17.8.4、17.7.6
本分分享极狐GitLab 补丁版本 17.9.1、17.8.4、17.7.6 的详细内容。这几个版本包含重要的缺陷和安全修复代码,我们强烈建议所有私有化部署用户应该立即升级到上述的某一个版本。对于极狐GitLab SaaS,技术团队已经进行了升级,无需用户采取任何…...
【JavaSE-7】方法的使用
1、方法的概念和使用 1.1、什么是方法 方法(method)是程序中最小的执行单元,类似于 C语言中的函数,方法存在的意义: 是能够模块化的组织代码(当代码规模比较复杂的时候).做到代码被重复使用, 一份代码可以在多个位置…...
阿里推出全新推理模型(因果语言模型),仅1/20参数媲美DeepSeek R1
阿里Qwen 团队正式发布了他们最新的研究成果——QwQ-32B大语言模型!这款模型不仅名字萌萌哒(QwQ),实力更是不容小觑!😎 QwQ-32B 已在 Hugging Face 和 ModelScope 开源,采用了 Apache 2.0 开源协议。大家可通过 Qwen C…...
C语言笔记(通讯录)
目录 1.通讯录的架构 2.通讯录的功能 3.实现静态通讯录的功能步骤 3.1.创建通讯录数组 3.2.显示功能菜单 3.3.初始化通讯录 3.4.添加联系人的信息 3.5.显示联系人的信息 3.6.查找某个人的信息 3.7.删除某一个联系人信息 3.8.修改某一联系人的信息 3.9.按名字对联系…...
【Manus资料合集】激活码内测渠道+《Manus Al:Agent应用的ChatGPT时刻》(附资源)
DeepSeek 之后,又一个AI沸腾,冲击的不仅仅是通用大模型。 ——全球首款通用AI Agent的破圈启示录 2025年3月6日凌晨,全球AI圈被一款名为Manus的产品彻底点燃。由Monica团队(隶属中国夜莺科技)推出的“全球首款通用AI…...
Python 面向对象高级编程-定制类
目录 __str__ __iter__ __getitem__ __getattr__ __call__ 小结 看到类似__slots__这种形如__xxx__的变量或者函数名就要注意,这些在Python中是有特殊用途的。 __slots__我们已经知道怎么用了,__len__()方法我们也知道是为了能让class作用于len()…...
安装remixd,在VScode创建hardhat
在终端,以管理员身份,cmd 需要科学上网 npm install -g remix-project/remixd 在vscode插件中,安装solidity插件,是暗灰色那款 1.将nodeJs的版本升级至18以上 2.在vscode打开一个新的文件,在终端输入 npx hardhat 3.…...
开发环境搭建-02.后端环境搭建-熟悉项目结构
一.后端环境搭建...
Linux(Centos 7.6)命令详解:vi
1.命令作用 vi/vim 是Linux 系统内置不可或缺的文本编辑命令,vim 是vi 的加强版本,兼容vi 的所有指令,不仅能编辑文本,而且还具有shell 程序编辑的功能,可以不同颜色的字体来辨别语法的正确性。 2.命令语法 usage: …...
Ubuntu 20.04下配置VSCode以支持Eigen库开发
这里写目录标题 1. 安装Eigen库2. 配置VSCode的C开发环境3. 配置c_cpp_properties.json4. 编写代码并测试5. 配置tasks.json(可选)6. 运行程序总结 在VSCode中配置Eigen库(用于线性代数、矩阵和向量运算的C库)的步骤如下ÿ…...
正点原子[第三期]Arm(iMX6U)Linux移植学习笔记-2.1 uboot简介
前言: 本文是根据哔哩哔哩网站上“Arm(iMX6U)Linux系统移植和根文件系统构键篇”视频的学习笔记,在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。 引用: …...
Android14 OTA差分包升级报kPayloadTimestampError (51)
由于VF 架构, 所以镜像的打包时间可能存在偏差, 如 boot.img 和 客制化的一些镜像打包 可能会在 vendor 侧进行打包。 而 与system 侧进行merge 时,时间戳比较乱,为了解决这个问题,让时间戳进行统一。 使用adb方式验证…...
PPT 技能:巧用 “节” 功能,让演示文稿更有序
在制作PPT时,你是否遇到过这样的情况:幻灯片越来越多,内容越来越杂,找某一页内容时翻得眼花缭乱?尤其是在处理大型PPT文件时,如果没有合理的结构,编辑和调整都会变得非常麻烦。这时候࿰…...
Mysql创建库、表练习
创建库 #创建 create database gc_novels default charsetutf8mb4;#default charsetutf8mb4 指定编码为utf-8#使用 use gc_novels#查看当前所在位置 select database(); 结果: 创建表 #创建 create table heros(-> id int,-> name varchar(50),-&…...
【原创】Ollama Test API For Linux/MacOS/Unix
安装Json解析工具 Linux/Unix sudo apt-get install jq -yMacOS brew install jq -y设置环境变量 export IP"192.168.250.229" export PORT"8080" export MODEL"deepseek-r1:7b"检查Ollama版本 curl http://"$IP":"$PORT&qu…...