NanoMQ多版本下载地址 https://www.emqx.com/zh/downloads/nanomq
NanoMQ官方文档 https://nanomq.io/docs/zh/latest/
NanoMQ 是一个专为物联网边缘计算设计的轻量级、高性能 MQTT 消息代理(Message Broker),由中国的开源物联网公司 EMQ 开发并维护。它专注于在资源受限的边缘设备上提供高效的 MQTT 消息通信能力,同时支持与云端服务的无缝集成。
轻量高效
协议支持
灵活扩展
边缘-云协同
NanoMQ 采用 事件驱动模型 和 异步 I/O 设计,最大化利用硬件资源:
安装
# 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 + 扩展 |
适用场景 | 边缘计算 | 轻量级通用代理 | 企业级云端部署 |
NanoMQ 是边缘计算场景下理想的 MQTT 消息中间件,凭借其极致的轻量化与高性能,填补了传统代理在资源受限环境中的空白。对于需要在边缘端实现高效数据汇聚、协议转换并连接云端的物联网系统,NanoMQ 是值得优先考虑的选择。
以下是 NanoMQ 的安装与部署指南,涵盖多种操作系统和场景:
# 下载最新版本(以 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
# 下载 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 版
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
nanomq-0.15.0-windows-amd64.zip
。bin
目录,双击运行 nanomq.exe
(默认监听 0.0.0.0:1883
)。适用于自定义功能或开发环境:
# 安装依赖
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
# 拉取镜像
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
创建服务文件 /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
发布消息,观察云端是否收到。
修改配置文件中的 bind
端口,或终止占用进程:
sudo lsof -i :1883 # 查看占用进程
kill -9 <PID> # 终止进程
确保证书路径正确且权限允许:
chmod 644 /path/to/cert.pem
chmod 600 /path/to/key.pem
检查云端 MQTT 服务的地址、端口、用户名和密码是否正确,确保网络可达。
通过以上步骤,您可以快速完成 NanoMQ 的安装、配置与基础验证。如需高级功能(如规则引擎、插件扩展),请参考 官方文档。
以下是 NanoMQ 的详细配置指南,涵盖核心功能模块和实际场景示例:
默认配置文件路径:/etc/nanomq.conf
采用 HOCON 格式(类 JSON 语法),支持嵌套和注释。
核心模块包括:
定义 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" # 私钥路径
}
}
}
将边缘数据转发至云端 MQTT 服务:
bridges {
mqtt {
# 桥接名称(例如云端服务商名称)
aws_iot {
server = "mqtts://your-iot-endpoint.amazonaws.com:8883" # 云端地址
clientid = "edge-device-001" # 客户端 ID
username = "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
}
]
}
}
}
启用安全通信:
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 # 是否拒绝无证书的连接
}
auth {
# 用户名密码认证
user {
username = "admin"
password = "public" # 支持明文或 bcrypt 哈希
}
# 匿名访问控制
allow_anonymous = false # 禁止匿名连接
}
acl {
# 规则语法:允许/拒绝 用户/IP 发布/订阅 主题
rules = [
"allow user admin pub/sub #", # 管理员拥有全部权限
"allow ip 192.168.1.0/24 sub sensor/#", # 允许子网订阅传感器主题
"deny all sub $SYS/#" # 禁止所有人订阅系统主题
]
}
配置消息存储(防止断电丢失):
persistence {
enabled = true # 启用持久化
mode = "queue" # 存储模式:队列/内存
max_mqueue_len = 10000 # 最大队列长度
path = "/var/lib/nanomq" # 存储路径
}
调整日志级别和输出:
log {
level = info # 日志级别:debug, info, warn, error
dir = "/var/log/nanomq" # 日志目录
file = "nanomq.log" # 日志文件名
rotation {
size = "10MB" # 单个日志文件大小
count = 5 # 保留的历史日志文件数
}
}
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/#"]
}
}
}
web_hook {
url = "http://localhost:8080/webhook" # 接收端 URL
headers = { "Content-Type" = "application/json" }
rules = [
{
event = "message.publish" # 触发事件(消息发布)
topics = ["sensor/#"] # 匹配主题
}
]
}
rule {
sql = "SELECT payload.temp FROM 'sensor/#' WHERE payload.temp > 50"
actions = ["mqtt://topic/alarm"] # 触发告警主题
}
nanomq check --conf /etc/nanomq.conf
nanomq reload # 不重启服务加载新配置
nanomq start --conf /etc/nanomq.conf --log-level debug
--conf
指定。listener
vs listeners
)。sudo chown -R nanomq:nanomq /var/lib/nanomq /var/log/nanomq
keepalive
和 retry_interval
参数:bridges.mqtt.cloud {
keepalive = 30
retry_interval = 10s # 重试间隔
}
system {
num_taskq_threads = 4 # 任务线程数(建议 CPU 核心数)
max_taskq_size = 1024 # 任务队列容量
parallel = 256 # 并行处理数
tcp {
nodelay = true # 禁用 Nagle 算法
send_timeout = "5s" # 发送超时
}
}
通过灵活组合这些配置项,您可以实现从轻量级边缘消息代理到复杂数据路由网关的功能扩展。建议参考 NanoMQ 官方文档 获取最新配置选项说明。
以下是 NanoMQ 配置文件 的详细说明,涵盖核心配置项和实用示例,帮助您快速掌握关键参数的使用方法。
/etc/nanomq.conf
(Linux)或解压目录下的 etc/nanomq.conf
(Windows)#
开头)nanomq reload
)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 # 是否验证客户端证书
}
}
}
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
}
]
}
}
}
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/#" # 禁止系统主题访问
]
}
}
persistence
)配置消息持久化策略:
persistence {
enabled = true # 启用持久化
mode = "queue" # 存储模式:queue(队列)或 memory(内存)
path = "/var/lib/nanomq" # 数据存储路径
max_mqueue_len = 10000 # 最大队列长度
flush_interval = "10s" # 刷盘间隔
}
log
)调整日志输出行为:
log {
level = "info" # 日志级别:debug | info | warn | error
dir = "/var/log/nanomq" # 日志目录
file = "nanomq.log" # 日志文件名
rotation {
size = "10MB" # 单个文件最大大小
count = 5 # 保留的历史文件数
}
}
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"
}
}
web_hook {
url = "http://192.168.1.100:8080/webhook"
headers = { "Content-Type" = "application/json" }
rules = [
{
event = "message.publish" # 触发事件:客户端发布消息时
topics = ["sensor/#"] # 匹配主题过滤器
}
]
}
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 pull emqx/nanomq:latest
# 默认监听 1883(MQTT)和 8083(WebSocket)
docker run -d \
--name nanomq \
-p 1883:1883 \ # MQTT TCP 端口
-p 8083:8083 \ # WebSocket 端口
emqx/nanomq:latest
创建本地配置文件 nanomq.conf
,然后挂载至容器:
docker run -d \
--name nanomq \
-p 1883:1883 \
-v $(pwd)/nanomq.conf:/etc/nanomq/nanomq.conf \ # 挂载配置文件
emqx/nanomq:latest
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" # 容器内日志级别调至调试模式
}
docker run -d \
--name nanomq \
-p 1883:1883 \
-v $(pwd)/nanomq_data:/var/lib/nanomq \ # 持久化存储路径
emqx/nanomq:latest
在 nanomq.conf
中添加:
persistence {
enabled = true
path = "/var/lib/nanomq" # 与挂载目录一致
}
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
nanomq.conf
内容:
listeners.ssl {
bind = "0.0.0.0:8883"
tls {
cert = "/etc/nanomq/cert.pem" # 容器内路径
key = "/etc/nanomq/key.pem"
}
}
创建 docker-compose.yml
:
version: '3.8'
services:
nanomq:
image: emqx/nanomq:latest
container_name: nanomq
ports:
- "1883:1883"
- "8083:8083"
- "8883:8883"
volumes:
- ./nanomq.conf:/etc/nanomq/nanomq.conf
- ./tls:/etc/nanomq/tls
- ./nanomq_data:/var/lib/nanomq
restart: unless-stopped
启动服务:
docker-compose up -d
docker logs nanomq --tail 100 -f # 实时查看最后100行日志
docker exec -it nanomq /bin/sh
docker restart nanomq
# 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"
}
}
通过环境变量注入 Redis 地址:
docker run -d \
--name nanomq \
-e REDIS_HOST=192.168.1.100 \ # 假设插件需要该变量
emqx/nanomq:latest
# 检查端口占用
netstat -tunlp | grep 1883
# 修改容器映射端口
docker run -d -p 1884:1883 ... # 主机端口:容器端口
确保挂载目录有写入权限:
chmod -R 777 ./nanomq_data # 开发环境临时方案
检查容器内路径是否匹配:
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 的完整指南,包含基础配置、自定义扩展和实用场景示例:
mkdir nanomq-docker && cd nanomq-docker
mkdir -p {conf,data,tls} # 配置文件、数据持久化、证书目录
docker-compose.yml
version: '3.8'
services:
nanomq:
image: emqx/nanomq:latest # 使用官方镜像
container_name: nanomq
restart: unless-stopped # 异常退出自动重启
ports:
- "1883:1883" # MQTT TCP
- "8083:8083" # WebSocket
- "8883:8883" # MQTT over TLS
volumes:
- ./conf/nanomq.conf:/etc/nanomq/nanomq.conf # 挂载配置文件
- ./data:/var/lib/nanomq # 持久化数据目录
- ./tls:/etc/nanomq/tls # TLS证书目录
networks:
- mqtt_net
networks:
mqtt_net: # 创建专用网络(可选)
driver: bridge
创建 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 = true
path = "/var/lib/nanomq"
}
docker-compose up -d # 后台运行
docker-compose logs -f # 查看实时日志
修改 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"
}
}
web_hook {
url = "http://webhook-server:8080/callback"
headers = { "X-Auth-Token" = "your_token" }
rules = [
{
event = "message.publish"
topics = ["sensor/#"]
}
]
}
# 生成 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
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: nanomq
ports:
- "1883:1883"
- "8083:8083"
- "8883:8883"
volumes:
- ./conf/nanomq.conf:/etc/nanomq/nanomq.conf
- ./data:/var/lib/nanomq
- ./tls:/etc/nanomq/tls
environment:
- NANOMQ_LOG_LEVEL=debug # 环境变量覆盖日志级别
networks:
- mqtt_net
# 可选:搭配 MQTT 客户端测试服务
mqtt-client:
image: eclipse-mosquitto:latest
command: sh -c "sleep 10 && mosquitto_sub -h nanomq -t test"
depends_on:
- nanomq
networks:
- mqtt_net
networks:
mqtt_net:
driver: bridge
# 设置证书目录权限
chmod 644 tls/*.pem
chmod 600 tls/*-key.pem
# 进入容器测试网络连通性
docker-compose exec nanomq ping broker.emqx.io
docker-compose exec nanomq openssl s_client -connect broker.emqx.io:8883
# 确保配置文件中启用动态加载
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: 30s
timeout: 10s
retries: 3
通过以上配置,您可以快速搭建一个高可用、安全的 MQTT 边缘消息枢纽。根据实际需求扩展桥接规则、安全策略和集成组件,实现完整的物联网数据管道。
以下是 Kubernetes (k8s) 上部署 NanoMQ 的完整指南,包含集群化部署、持久化存储和监控集成方案:
NodePort
/LoadBalancer
暴露 MQTT 端口nanomq.conf
配置文件# nanomq-namespace.yaml
apiVersion: v1
kind: Namespace
metadata:
name: nanomq
# nanomq-configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: nanomq-config
namespace: nanomq
data:
nanomq.conf: |
listeners.tcp {
bind = "0.0.0.0:1883"
}
persistence {
enabled = true
path = "/var/lib/nanomq"
}
# nanomq-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nanomq
namespace: nanomq
spec:
replicas: 2
selector:
matchLabels:
app: nanomq
template:
metadata:
labels:
app: nanomq
annotations:
prometheus.io/scrape: "true" # 启用监控
spec:
containers:
- name: nanomq
image: emqx/nanomq:0.15.0
ports:
- containerPort: 1883
name: mqtt
volumeMounts:
- name: config-volume
mountPath: /etc/nanomq/nanomq.conf
subPath: nanomq.conf
- name: data
mountPath: /var/lib/nanomq
livenessProbe:
exec:
command: ["nanomq", "ping"]
initialDelaySeconds: 30
readinessProbe:
tcpSocket:
port: 1883
volumes:
- name: config-volume
configMap:
name: nanomq-config
- name: data
emptyDir: {} # 生产环境建议使用 PVC
# nanomq-service.yaml
apiVersion: v1
kind: Service
metadata:
name: nanomq
namespace: nanomq
spec:
type: LoadBalancer
ports:
- name: mqtt
port: 1883
targetPort: 1883
selector:
app: nanomq
# nanomq-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: nanomq-data
namespace: nanomq
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
storageClassName: standard # 根据集群调整
修改 Deployment 挂载:
volumes:
- name: data
persistentVolumeClaim:
claimName: nanomq-data
# 在 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: tls
mountPath: /etc/nanomq/tls
volumes:
- name: tls
secret:
secretName: nanomq-tls
在 nanomq.conf
中添加:
prometheus {
enable = true
port = 9283
}
# nanomq-servicemonitor.yaml
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: nanomq-monitor
namespace: nanomq
spec:
endpoints:
- port: prometheus
interval: 15s
selector:
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
resources:
limits:
cpu: "2"
memory: "512Mi"
requests:
cpu: "500m"
memory: "256Mi"
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchExpressions:
- key: app
operator: In
values: [nanomq]
topologyKey: kubernetes.io/hostname
kubectl describe pod -n nanomq <pod-name> # 查看事件日志
kubectl logs -n nanomq <pod-name> --previous # 查看前一个容器的日志
kubectl -n nanomq run net-tools --image=nicolaka/netshoot -it --rm
curl telnet://nanomq:1883 # 测试集群内访问
通过以上配置,您可以在 Kubernetes 集群中快速部署高可用、可扩展的 NanoMQ 消息服务,满足物联网边缘计算场景下的 MQTT 通信需求。
以下是 Windows 系统 上安装和部署 NanoMQ 的详细指南,涵盖从基础安装到高级配置的完整流程:
nanomq-0.15.0-windows-amd64.zip
)。将压缩包解压到目标目录(如 C:\nanomq
),目录结构如下:
nanomq/
├── bin/
│ ├── nanomq.exe # 主程序
│ └── nanomq_cli.exe # 客户端工具
├── etc/
│ └── nanomq.conf # 配置文件
└── logs/ # 日志目录
将 bin
目录加入系统 PATH,以便全局调用:
Path
,点击 编辑,添加 NanoMQ 的 bin
目录路径(如 C:\nanomq\bin
)。# 进入 NanoMQ 目录
cd C:\nanomq
# 启动服务(默认加载当前目录的 etc/nanomq.conf)
bin\nanomq.exe start
打开浏览器访问 http://localhost:8081
(默认 Web 仪表盘端口),或查看日志文件 logs\nanomq.log
。
编辑 etc\nanomq.conf
(示例配置):
listeners {
tcp {
bind = "0.0.0.0:1883"
}
ws {
bind = "0.0.0.0:8083"
}
}
# 启用基础认证
auth {
allow_anonymous = false
users = [
{ username = "admin", password = "public" }
]
}
bin\nanomq.exe start --conf "C:\nanomq\etc\nanomq.conf"
nssm.exe
复制到 C:\Windows\System32
。# 以管理员身份运行 CMD
nssm install NanoMQ
# 设置服务参数:
- Path: C:\nanomq\bin\nanomq.exe
- Startup Directory: C:\nanomq
- Arguments: start --conf "C:\nanomq\etc\nanomq.conf"
nssm start NanoMQ # 启动服务
nssm stop NanoMQ # 停止服务
nssm remove NanoMQ # 删除服务
使用 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"
修改 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"
}
}
nanomq_cli
工具# 订阅主题(新窗口)
nanomq_cli.exe sub -t "test" -q 1
# 发布消息
nanomq_cli.exe pub -t "test" -m "Hello Windows" -q 1
localhost:1883
,输入用户名密码(如 admin/public
)。# 查找占用端口的进程
netstat -ano | findstr :1883
# 终止进程(替换 )
taskkill /PID /F
C:\\nanomq\\certs\\cert.pem
)。安装 Visual C++ Redistributable。
nssm stop NanoMQ
。nssm remove NanoMQ
。C:\nanomq
。通过以上步骤,您可以在 Windows 系统上快速搭建一个高性能的 MQTT 消息代理,满足边缘计算或本地测试需求。如需更多功能(如规则引擎、数据桥接),请参考 NanoMQ 官方文档。
以下是 Ubuntu 系统 上安装和部署 NanoMQ 的完整指南,涵盖多种安装方式和配置场景:
# 添加 NanoMQ 官方仓库
curl -sSL https://repo.emqx.io/nanomq/install.sh | sudo bash
# 更新软件包列表
sudo apt update
# 安装 NanoMQ
sudo apt install nanomq
# 验证安装
nanomq --version
# 安装 Snap(如未安装)
sudo apt install snapd
# 安装 NanoMQ Snap 包
sudo snap install nanomq
# 安装编译依赖
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
# 拉取镜像
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
默认路径:/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 = false
users = [
{ username = "admin", password = "public" }
]
}
# 指定配置文件启动
sudo nanomq start --conf /etc/nanomq/nanomq.conf
# 查看运行状态
sudo nanomq_ctl status
生成证书:
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"
}
}
bridges.mqtt.cloud {
server = "mqtts://broker.emqx.io:8883"
clientid = "ubuntu-edge-001"
username = "admin"
password = "public"
forwards = ["edge/# -> cloud/edge/#"]
}
创建服务文件 /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
# 启动/停止/重启
sudo systemctl start nanomq
sudo systemctl stop nanomq
sudo systemctl restart nanomq
# 查看日志
journalctl -u nanomq -f
nanomq_cli
工具# 订阅主题
nanomq_cli sub -t "test/ubuntu" -q 1
# 发布消息(新终端)
nanomq_cli pub -t "test/ubuntu" -m "Hello Ubuntu" -q 1
sudo snap install mqttx
mqtt://localhost:1883
,输入用户名密码(如 admin/public
)。# 检查端口占用
sudo lsof -i :1883
# 终止占用进程(替换 )
sudo kill -9 <PID>
sudo chmod 644 /etc/nanomq/server-cert.pem
sudo chmod 600 /etc/nanomq/server-key.pem
# 检查配置语法
nanomq check --conf /etc/nanomq/nanomq.conf
# 热重载配置
sudo systemctl restart nanomq
# APT 安装方式
sudo apt remove nanomq
# 源码编译安装
sudo ninja uninstall # 在源码 build 目录执行
# 清除残留文件
sudo rm -rf /etc/nanomq /var/lib/nanomq
通过以上步骤,您可以在 Ubuntu 系统上快速搭建一个高性能的 MQTT 消息代理,适用于物联网边缘计算、数据采集等场景。如需更多高级功能(规则引擎、集群模式),请参考 NanoMQ 官方文档。
以下是 Fedora 系统 上安装和部署 NanoMQ 的详细指南,涵盖多种安装方式和配置场景:
下载 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
安装依赖
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
安装 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
/etc/nanomq/nanomq.conf
listeners.tcp {
bind = "0.0.0.0:1883"
max_connections = 1024
}
auth {
allow_anonymous = false
users = [
{ username = "admin", password = "public" }
]
}
# 指定配置文件启动
sudo nanomq start --conf /etc/nanomq/nanomq.conf
# 验证运行状态
sudo nanomq_ctl status
生成自签名证书
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"
}
}
bridges.mqtt.cloud {
server = "mqtts://broker.emqx.io:8883"
clientid = "fedora-edge-001"
username = "admin"
password = "public"
forwards = ["fedora/sensor/# -> cloud/sensor/#"]
}
创建服务文件 /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
# 启动/停止/重启
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
nanomq_cli
工具# 订阅主题
nanomq_cli sub -t "fedora/test" -q 1
# 发布消息(新终端)
nanomq_cli pub -t "fedora/test" -m "Hello Fedora" -q 1
sudo dnf install snapd
sudo ln -s /var/lib/snapd/snap /snap
sudo snap install mqttx
mqtt://localhost:1883
,使用用户名 admin
和密码 public
。# 查找占用端口的进程
sudo ss -tulnp | grep :1883
# 终止进程(替换 )
sudo kill -9 <PID>
临时禁用 SELinux(仅用于测试):
sudo setenforce 0
或添加策略规则:
sudo ausearch -c 'nanomq' --raw | audit2allow -M my-nanomq
sudo semodule -i my-nanomq.pp
确保证书路径正确且权限开放:
sudo chmod 644 /etc/nanomq/server-cert.pem
sudo chmod 600 /etc/nanomq/server-key.pem
sudo dnf remove nanomq
sudo rm -rf /etc/nanomq /var/lib/nanomq
# 在源码 build 目录执行
sudo ninja uninstall
通过以上步骤,您可以在 Fedora 系统上快速部署一个高性能的 MQTT 代理,适用于物联网边缘计算或本地开发测试。如需更多高级功能(如规则引擎、集群模式),请参考 NanoMQ 官方文档。
以下是 NanoMQ、EMQX 和 Mosquitto 三款主流 MQTT Broker 的对比分析,涵盖架构设计、性能、功能特性、适用场景及社区生态等方面:
特性 | NanoMQ | EMQX | Mosquitto |
---|---|---|---|
架构 | 基于 NNG 的异步 I/O 多线程模型,支持 Actor 线程模型,充分利用多核 CPU | 分布式架构,基于 Erlang/OTP,支持 masterless 集群和高可用性 | 单线程设计,依赖 epoll 实现高效事件循环 |
性能 | 高吞吐(10 倍于 Mosquitto)、低延迟,支持边缘端多协议转换 | 企业级高性能,支持百万级并发连接,低延迟 | 轻量级,低资源占用(内存 <1MB),但扩展性有限(<10 万连接) |
资源占用 | 约 2MB 内存启动,适合资源受限的边缘设备 | 约 50MB 内存启动,适合云端和资源丰富的场景 | 内存占用最低(<1MB),适合嵌入式设备 |
特性 | 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 支持 |
场景 | NanoMQ | EMQX | Mosquitto |
---|---|---|---|
边缘计算 | 工业物联网边缘网关、机器人、车联网(支持多协议转换) | 云端大规模数据聚合、车联网平台、智慧城市 | 低功耗传感器、嵌入式设备、小型工业网关 |
扩展性需求 | 单节点高性能,支持 QUIC 桥接至云端 | 分布式集群,支持水平扩展和高可用性 | 单节点部署,无集群支持 |
开发复杂度 | 配置灵活,适合有经验的开发者 | 安装配置复杂,需专业运维 | 配置简单,适合快速部署 |
维度 | 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 命令行工具 |
NanoMQ
EMQX
Mosquitto
三者可协同使用(如边缘用 NanoMQ,云端用 EMQX),构建统一的物联网数据管道。如需进一步测试,可使用 MQTTX 或 NanoMQ CLI 工具进行验证。
以下是 通过 WebSocket 连接 NanoMQ 的完整指南,包含服务端配置、客户端连接方法和常见问题排查:
编辑 NanoMQ 配置文件(默认路径 /etc/nanomq/nanomq.conf
):
listeners {
ws {
bind = "0.0.0.0:8083" # WebSocket 默认端口
path = "/mqtt" # WebSocket 路径(可选)
max_connections = 1024 # 最大连接数
}
}
listeners.wss {
bind = "0.0.0.0:8084"
tls {
cert = "/path/to/server-cert.pem" # 证书路径
key = "/path/to/server-key.pem" # 私钥路径
}
}
nanomq stop && nanomq start --conf /etc/nanomq/nanomq.conf
使用 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}`);
});
ws://your-nanomq-ip:8083
/mqtt
(与配置一致)mqttx-web-client
)在配置文件中添加 HTTP 服务配置:
http_server {
port = 8080
allow_cors = true # 启用跨域支持
cors_headers = "*" # 允许所有域名
}
listeners.ws {
bind = "0.0.0.0:8083"
max_packet_size = "1MB" # 最大消息大小(默认 1MB)
}
netstat -tuln | grep 8083
# 预期输出:LISTEN 0 1024 0.0.0.0:8083
访问 WebSocket 在线测试工具,输入地址:
ws://your-nanomq-ip:8083/mqtt
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"
path
一致。Sec-WebSocket-Protocol: mqtt
client.publish('topic', 'message', { qos: 1 });
启用压缩(若传输 JSON/文本):
listeners.ws {
bind = "0.0.0.0:8083"
compress = true # 启用 permessage-deflate 压缩
}
调整线程池大小:
system {
num_taskq_threads = 4 # 建议等于 CPU 核心数
}
通过以上步骤,您可以快速实现浏览器、移动端或其他 WebSocket 客户端与 NanoMQ 的高效通信,适用于实时监控、即时聊天等场景。如需更多高级功能(如规则引擎处理 WebSocket 数据),请参考 NanoMQ 文档。