🌙

MQTT生产环境配置

pid_file /var/run/mosquitto.pid
#关闭数据持久化
persistence false
persistence_location /var/lib/mosquitto/
log_dest file /var/log/mosquitto/mosquitto.log
include_dir /etc/mosquitto/conf.d
# mqtt 协议配置
listener 1883 0.0.0.0
socket_domain ipv4
protocol mqtt
# 开启websocket
# websocket 协议配置
listener 9001 0.0.0.0
protocol websockets
socket_domain ipv4

 

我来逐行解释这个 Mosquitto 配置文件,并指出其中的一些注意事项。


一、文件整体概览

这是一个 Mosquitto MQTT Broker 的配置文件,主要做了以下几件事:

  1. 指定 PID 文件位置

  2. 关闭数据持久化(重点)

  3. 配置日志输出

  4. 设置包含目录

  5. 配置两个监听器:标准 MQTT(1883端口)+ WebSocket(9001端口)


二、逐行详解

1. PID 文件配置

pid_file /var/run/mosquitto.pid
项目说明
作用 指定 Mosquitto 进程的 PID(进程ID)文件存放位置
用途 系统管理工具(如 systemd)通过读取这个文件获取 Mosquitto 的进程号,用于停止、重启、状态检查等操作
路径 /var/run/ 是 Linux 标准目录,存放临时运行时文件,系统重启后会清空
注意 Mosquitto 需要有权限在 /var/run/ 目录下创建文件(通常 mosquitto 用户有权限)

2. 数据持久化配置(已关闭)

#关闭数据持久化
persistence false
persistence_location /var/lib/mosquitto/
配置项说明
persistence false 关闭持久化。Mosquitto 不会将内存中的消息保存到磁盘
persistence_location /var/lib/mosquitto/ 指定持久化文件的存储目录(但由于 persistence false,这个配置实际无效)

关闭持久化的影响:

场景持久化开启持久化关闭(你的配置)
MQTT Broker 重启 QoS 1/2 消息会恢复,继续发送 所有未发送的消息全部丢失
保留消息(Retain) 重启后保留 重启后全部丢失
会话状态 持久会话恢复 所有客户端必须重新订阅
内存占用 较高 较低(适合内存受限设备)

适用场景判断:

  • 适合关闭:测试环境、消息不重要、设备频繁上下线、内存受限的嵌入式设备

  • 不适合关闭:生产环境、需要保证消息不丢失、有保留消息需求


3. 日志配置

log_dest file /var/log/mosquitto/mosquitto.log
项目说明
作用 将日志输出到指定文件
路径 /var/log/mosquitto/mosquitto.log
注意 这个配置只指定了输出目标,但没有指定日志级别

未配置的日志级别: 如果不指定 log_type,Mosquitto 会使用默认级别(通常是 errorwarningnoticeinformation 的某些组合)。

建议补充:

# 补充日志级别配置
log_type error      # 错误信息
log_type warning    # 警告信息
log_type notice     # 普通通知
log_type information # 详细信息(调试用)
log_type debug      # 调试信息(开发环境)

4. 包含目录配置

include_dir /etc/mosquitto/conf.d
项目说明
作用 加载 /etc/mosquitto/conf.d/ 目录下所有.conf 文件
用途 模块化配置,将不同功能的配置拆分成多个文件
加载顺序 按文件名字母顺序加载,如果有冲突,后加载的会覆盖先加载的

目录结构示例:

/etc/mosquitto/conf.d/
├── auth.conf     # 认证配置
├── acl.conf       # 权限控制
├── bridge.conf   # 桥接配置
└── custom.conf   # 自定义配置

5. MQTT 协议配置(标准端口)

# mqtt 协议配置
listener 1883 0.0.0.0
socket_domain ipv4
protocol mqtt
配置项说明
listener 1883 0.0.0.0 监听端口 1883(MQTT 标准端口),绑定到所有 IPv4 地址
socket_domain ipv4 强制使用 IPv4 协议栈(不监听 IPv6)
protocol mqtt 这个监听器使用原生 MQTT 协议

0.0.0.0 的含义:

  • 监听所有可用的网络接口(eth0、wlan0、lo 等)

  • 其他设备可以通过服务器的任意 IP 地址访问

效果:

  • 设备(如你的 LoRa 基站、后端服务)可以使用 tcp://服务器IP:1883 连接


6. WebSocket 协议配置

# 开启websocket
# websocket 协议配置
listener 9001 0.0.0.0
protocol websockets
socket_domain ipv4
配置项说明
listener 9001 0.0.0.0 监听端口 9001,绑定到所有 IPv4 地址
protocol websockets 这个监听器使用 WebSocket 协议
socket_domain ipv4 强制 IPv4

WebSocket 的用途:

  • 浏览器端 JavaScript 可以直接通过 MQTT over WebSocket 连接

  • 替代 AJAX 轮询,实现真正的实时推送

浏览器连接示例:

// 浏览器中直接使用 MQTT.js 库连接
const client = mqtt.connect('ws://服务器IP:9001/mqtt');
client.subscribe('sensor/#');
client.on('message', (topic, msg) => {
console.log('收到实时数据:', msg.toString());
});

端口选择说明:

  • 1883:原生 MQTT 协议(设备、后端服务使用)

  • 9001:WebSocket 协议(浏览器使用)

  • 常见替代端口:80838084 也常用作 WebSocket


三、发现的问题和优化建议

❗ 问题 1:socket_domain 配置重复且位置错误

listener 1883 0.0.0.0
socket_domain ipv4 # ❌ 这个位置不对

问题:socket_domain 应该紧跟在对应的 listener 后面,不能写在中间。

正确写法:

listener 1883 0.0.0.0
protocol mqtt
socket_domain ipv4

❗ 问题 2:缺少关键配置

缺少的配置建议补充
认证配置 allow_anonymous true/false
日志级别 log_type error warning notice
用户/权限 user mosquitto(运行用户)

✅ 优化后的完整配置

# ========== 基础配置 ==========
pid_file /var/run/mosquitto.pid
user mosquitto # 以 mosquitto 用户身份运行

# ========== 持久化配置 ==========
persistence false # 关闭持久化
persistence_location /var/lib/mosquitto/

# ========== 日志配置 ==========
log_dest file /var/log/mosquitto/mosquitto.log
log_type error
log_type warning
log_type notice
# log_type information # 开发环境可开启
connection_messages true # 记录连接/断开事件

# ========== 包含目录 ==========
include_dir /etc/mosquitto/conf.d

# ========== MQTT 协议配置(端口 1883)==========
listener 1883 0.0.0.0
protocol mqtt
socket_domain ipv4

# ========== WebSocket 协议配置(端口 9001)==========
listener 9001 0.0.0.0
protocol websockets
socket_domain ipv4

# ========== 安全配置(根据需求选择)==========
# 允许匿名连接(测试环境)
allow_anonymous true

# 生产环境建议:
# allow_anonymous false
# password_file /etc/mosquitto/pwfile
# acl_file /etc/mosquitto/aclfile

四、配置生效和验证

1. 检查配置语法

mosquitto -c /etc/mosquitto/mosquitto.conf -t

2. 重启服务

sudo systemctl restart mosquitto

3. 验证监听端口

# 查看 1883 端口(MQTT)
sudo netstat -tlnp | grep 1883

# 查看 9001 端口(WebSocket)
sudo netstat -tlnp | grep 9001

期望输出:

tcp6   0   0 :::1883    :::*    LISTEN   1234/mosquitto
tcp6   0   0 :::9001   :::*   LISTEN   1234/mosquitto

4. 测试连接

测试 MQTT(端口 1883):

mosquitto_sub -h 127.0.0.1 -p 1883 -t "test" -v

测试 WebSocket(端口 9001):可以使用在线工具或浏览器控制台:

// 在浏览器控制台运行(需先引入 mqtt.js)
const client = mqtt.connect('ws://127.0.0.1:9001');
client.on('connect', () => console.log('WebSocket 连接成功'));

五、配置总结

配置项当前值建议
持久化 关闭 测试环境 OK,生产环境建议开启
MQTT 端口 1883 ✅ 标准配置
WebSocket 端口 9001 ✅ 常用端口
认证 未配置 缺少(当前默认 allow_anonymous true
日志级别 未配置 建议至少配置 errorwarning

一句话总结: 这是一个适合测试环境的配置,关闭了持久化节省内存,开启了 WebSocket 支持浏览器连接,但缺少认证配置,如果暴露在公网会有安全风险。

 

 

Mosquitto 的用户名密码认证TLS/SSL 加密配置。

我会分两部分讲解,并给你一份完整的安全配置示例。


一、用户名密码认证配置

1. 生成密码文件

使用 Mosquitto 自带的 mosquitto_passwd 命令创建密码文件。

# 创建密码文件并添加第一个用户
sudo mosquitto_passwd -c /etc/mosquitto/passwd admin

# 按提示输入两次密码(例如:123456)

# 添加更多用户(不需要 -c 参数,-c 会覆盖文件)
sudo mosquitto_passwd /etc/mosquitto/passwd device_001
sudo mosquitto_passwd /etc/mosquitto/passwd backend_server

# 删除用户
sudo mosquitto_passwd -D /etc/mosquitto/passwd device_001

# 查看密码文件内容(密码是加密的)
sudo cat /etc/mosquitto/passwd

2. 配置 ACL(访问控制列表)

ACL 文件用于控制每个用户可以订阅/发布的主题

创建 ACL 文件:

sudo vim /etc/mosquitto/acl

ACL 文件内容示例:

# ========== 匿名用户权限(如果允许匿名访问)==========
# 如果不允许匿名,这部分无效

# ========== 特定用户权限 ==========
# 用户 admin:全部权限(管理用)
user admin
topic readwrite #

# 用户 device_001:只能发布数据到自己的主题
user device_001
topic write sensors/device_001/#
topic read command/device_001/#

# 用户 device_002:只能发布数据
user device_002
topic write sensors/device_002/temperature
topic write sensors/device_002/humidity

# 用户 backend_server:可以订阅所有传感器数据
user backend_server
topic read sensors/#

# ========== 模式匹配(动态主题)==========
# %u 表示用户名,%c 表示客户端ID
pattern write sensors/%u/data
pattern read command/%u/#

# ========== 发布到以 $SYS 开头的系统主题 ==========
user admin
topic readwrite $SYS/#

# 普通用户只读部分系统主题
user device_001
topic read $SYS/broker/bytes/sent

权限说明:

关键字说明
read 允许订阅该主题
write 允许发布到该主题
readwrite 允许订阅和发布
topic 主题名称(支持 #+ 通配符)
pattern 动态主题模板(%u 替换为用户名)

3. 配置文件中启用认证

/etc/mosquitto/mosquitto.conf 中添加:

# ========== 认证配置 ==========
# 禁止匿名连接(重要:生产环境必须设为 false)
allow_anonymous false

# 指定密码文件路径
password_file /etc/mosquitto/passwd

# 指定 ACL 文件路径(可选,不配置则所有用户有全部权限)
acl_file /etc/mosquitto/acl

# 密码文件格式(默认就是 mosquitto_passwd 生成的格式)
# password_file_format openssl

4. 测试认证是否生效

# 正确用户名密码 - 应该成功连接
mosquitto_sub -h localhost -p 1883 -u admin -P 123456 -t "test" -v

# 错误密码 - 应该连接失败
mosquitto_sub -h localhost -p 1883 -u admin -P wrongpass -t "test" -v

# 无用户名密码 - 应该连接失败(因为 allow_anonymous false)
mosquitto_sub -h localhost -p 1883 -t "test" -v

二、TLS/SSL 加密配置

TLS 可以让 MQTT 通信加密,防止抓包窃听。

1. 生成自签名证书(测试环境)

如果只是测试,可以用自签名证书。生产环境建议用正规 CA 签发的证书。

# 创建证书存放目录
sudo mkdir -p /etc/mosquitto/certs
cd /etc/mosquitto/certs

# 1. 生成 CA 私钥和证书
openssl req -new -x509 -days 3650 -extensions v3_ca -keyout ca.key -out ca.crt \
 -subj "/CN=MQTT CA/C=CN/ST=Beijing/L=Beijing/O=IoT/CN=ca"

# 2. 生成服务器私钥
openssl genrsa -out server.key 2048

# 3. 生成证书签名请求(CSR)
openssl req -new -key server.key -out server.csr \
 -subj "/CN=localhost/C=CN/ST=Beijing/L=Beijing/O=IoT/CN=server"

# 4. 用 CA 签发服务器证书
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial \
 -out server.crt -days 3650

# 5. 设置文件权限(重要:私钥只能 root 可读)
sudo chmod 600 server.key
sudo chmod 644 server.crt ca.crt

# 查看证书内容验证
openssl x509 -in server.crt -text -noout

2. 配置 TLS 监听器

/etc/mosquitto/mosquitto.conf 中添加:

# ========== TLS/SSL 配置 ==========
# TLS 监听端口(标准是 8883)
listener 8883 0.0.0.0
protocol mqtt
socket_domain ipv4

# 证书配置
cafile /etc/mosquitto/certs/ca.crt
certfile /etc/mosquitto/certs/server.crt
keyfile /etc/mosquitto/certs/server.key

# 要求客户端提供证书(双向认证,可选)
# require_certificate true
# use_identity_as_username true

3. 测试 TLS 连接

# 方式1:使用 mosquitto_sub 连接 TLS(忽略证书验证)
mosquitto_sub -h localhost -p 8883 -t "test" \
 --cafile /etc/mosquitto/certs/ca.crt \
 -u admin -P 123456

# 方式2:使用 openssl 测试(手动验证)
openssl s_client -connect localhost:8883 -CAfile /etc/mosquitto/certs/ca.crt

三、WebSocket over TLS(WSS)配置

如果前端浏览器需要通过 WebSocket 安全连接,需要配置 WSS。

# ========== WebSocket over TLS (WSS) ==========
listener 9002 0.0.0.0
protocol websockets
socket_domain ipv4

# 使用相同的证书文件
cafile /etc/mosquitto/certs/ca.crt
certfile /etc/mosquitto/certs/server.crt
keyfile /etc/mosquitto/certs/server.key

浏览器连接 WSS 示例:

// 注意:使用 wss:// 协议,端口 9002
const client = mqtt.connect('wss://your-server-ip:9002/mqtt', {
 username: 'admin',
 password: '123456'
});

四、完整的生产级配置文件

下面是整合了认证 + TLS + WebSocket 的完整配置:

# ========== 基础配置 ==========
pid_file /var/run/mosquitto.pid
user mosquitto
persistence false
persistence_location /var/lib/mosquitto/
include_dir /etc/mosquitto/conf.d

# ========== 日志配置 ==========
log_dest file /var/log/mosquitto/mosquitto.log
log_dest stdout
log_type error
log_type warning
log_type notice
connection_messages true

# ========== 安全认证 ==========
allow_anonymous false
password_file /etc/mosquitto/passwd
acl_file /etc/mosquitto/acl

# ========== MQTT 明文端口(仅内网使用)==========
listener 1883 127.0.0.1          # 只监听本地,不对外暴露
protocol mqtt
socket_domain ipv4

# ========== MQTT over TLS(对外服务)==========
listener 8883 0.0.0.0
protocol mqtt
socket_domain ipv4
cafile /etc/mosquitto/certs/ca.crt
certfile /etc/mosquitto/certs/server.crt
keyfile /etc/mosquitto/certs/server.key
# require_certificate true       # 如需客户端证书认证可开启

# ========== WebSocket(明文,仅内网)==========
listener 9001 127.0.0.1
protocol websockets
socket_domain ipv4

# ========== WebSocket over TLS(对外服务)==========
listener 9002 0.0.0.0
protocol websockets
socket_domain ipv4
cafile /etc/mosquitto/certs/ca.crt
certfile /etc/mosquitto/certs/server.crt
keyfile /etc/mosquitto/certs/server.key

五、ACL 文件完整示例(针对你的架构)

根据你之前描述的 IoT 架构(采集器 → LoRa 基站 → MQTT → 后端 → 浏览器),可以这样配置 ACL:

# /etc/mosquitto/acl

# ========== 管理员权限 ==========
user admin
topic readwrite #

# ========== LoRa 基站(发布传感器数据)==========
user lora_gateway
topic write lorawan/devices/+/up
topic write lorawan/devices/+/join

# ========== 后端服务(订阅数据 + 发布控制命令)==========
user backend
topic read lorawan/#
topic write command/devices/#

# ========== 单个设备(双向通信)==========
user device_A001
topic write sensors/device_A001/data
topic read command/device_A001/#

# ========== 动态模式匹配(推荐:避免为每个设备单独配置)==========
# 设备只能发布自己的数据
pattern write sensors/%u/data
# 设备只能接收发给自己的命令
pattern read command/%u/#
# 后端可以读取所有
user backend
pattern read sensors/+/data

六、客户端连接示例

1. Python 后端(带认证 + TLS)

import paho.mqtt.client as mqtt

client = mqtt.Client()
client.username_pw_set("backend", "password")
client.tls_set("/etc/mosquitto/certs/ca.crt")  # CA 证书
client.connect("mqtt.yourserver.com", 8883, 60)
client.subscribe("lorawan/devices/+/up")

2. 浏览器 JavaScript(WSS + 认证)

<script src="https://unpkg.com/mqtt/dist/mqtt.min.js"></script>
<script>
 const client = mqtt.connect('wss://yourserver.com:9002/mqtt', {
   username: 'backend',
   password: 'password',
   reconnectPeriod: 1000
});
 
 client.on('connect', () => {
   console.log('安全连接成功');
   client.subscribe('sensors/device/+/data');
});
</script>

3. 命令行测试(带认证 + TLS)

# 使用 TLS + 用户名密码
mosquitto_sub -h yourserver.com -p 8883 \
 -u backend -P password \
 --cafile /etc/mosquitto/certs/ca.crt \
 -t "sensors/#" -v

七、安全检查和最佳实践

1. 权限设置

# 密码文件和私钥只能 mosquitto 用户读取
sudo chown mosquitto:mosquitto /etc/mosquitto/passwd
sudo chmod 600 /etc/mosquitto/passwd

sudo chown mosquitto:mosquitto /etc/mosquitto/certs/server.key
sudo chmod 600 /etc/mosquitto/certs/server.key

2. 防火墙配置

# 只开放加密端口
sudo firewall-cmd --permanent --add-port=8883/tcp   # MQTT TLS
sudo firewall-cmd --permanent --add-port=9002/tcp   # WSS
sudo firewall-cmd --reload

# 明文端口 1883/9001 不对外开放(只内网)

3. 定期更换证书

  • 自签名证书有效期不要太长(如 1 年)

  • 生产环境使用 Let's Encrypt 等免费 CA

4. 启用日志审计

# 记录所有连接和认证事件
log_type information
connection_messages true

八、故障排查

问题 1:连接时报 Connection Refused

# 检查端口是否监听
sudo netstat -tlnp | grep 8883

# 检查防火墙
sudo iptables -L -n | grep 8883

问题 2:认证失败

# 查看 Mosquitto 日志
sudo tail -f /var/log/mosquitto/mosquitto.log

# 手动测试密码文件
mosquitto_passwd -U /etc/mosquitto/passwd  # 检查格式

问题 3:TLS 握手失败

# 用 openssl 测试
openssl s_client -connect localhost:8883 -CAfile /etc/mosquitto/certs/ca.crt

# 检查证书权限
ls -la /etc/mosquitto/certs/

总结: 以上配置实现了:

  • 用户名密码认证:防止未授权访问

  • TLS 加密:防止中间人攻击和数据窃听

  • ACL 权限控制:细粒度控制每个用户的主题权限

  • WSS 支持:浏览器也可以安全连接

 

好的,我来逐行解释这个 Mosquitto 配置文件,并指出其中的一些注意事项。
---
## 一、文件整体概览
这是一个 Mosquitto MQTT Broker 的配置文件,主要做了以下几件事:1. 指定 PID 文件位置2. **关闭数据持久化**(重点)3. 配置日志输出4. 设置包含目录5. 配置两个监听器:**标准 MQTT**(1883端口)+ **WebSocket**(9001端口)
---
## 二、逐行详解
### 1. PID 文件配置
```bashpid_file /var/run/mosquitto.pid```
| 项目 | 说明 ||------|------|| **作用** | 指定 Mosquitto 进程的 PID(进程ID)文件存放位置 || **用途** | 系统管理工具(如 systemd)通过读取这个文件获取 Mosquitto 的进程号,用于停止、重启、状态检查等操作 || **路径** | `/var/run/` 是 Linux 标准目录,存放临时运行时文件,系统重启后会清空 || **注意** | Mosquitto 需要有权限在 `/var/run/` 目录下创建文件(通常 mosquitto 用户有权限) |
---
### 2. 数据持久化配置(已关闭)
```bash#关闭数据持久化persistence falsepersistence_location /var/lib/mosquitto/```
| 配置项 | 值 | 说明 ||--------|-----|------|| **persistence** | `false` | **关闭持久化**。Mosquitto 不会将内存中的消息保存到磁盘 || **persistence_location** | `/var/lib/mosquitto/` | 指定持久化文件的存储目录(但由于 `persistence false`,这个配置实际无效) |
**关闭持久化的影响:**
| 场景 | 持久化开启 | 持久化关闭(你的配置) ||------|-----------|----------------------|| **MQTT Broker 重启** | QoS 1/2 消息会恢复,继续发送 | **所有未发送的消息全部丢失** || **保留消息(Retain)** | 重启后保留 | **重启后全部丢失** || **会话状态** | 持久会话恢复 | 所有客户端必须重新订阅 || **内存占用** | 较高 | **较低**(适合内存受限设备) |
**适用场景判断:**- ✅ **适合关闭**:测试环境、消息不重要、设备频繁上下线、内存受限的嵌入式设备- ❌ **不适合关闭**:生产环境、需要保证消息不丢失、有保留消息需求
---
### 3. 日志配置
```bashlog_dest file /var/log/mosquitto/mosquitto.log```
| 项目 | 说明 ||------|------|| **作用** | 将日志输出到指定文件 || **路径** | `/var/log/mosquitto/mosquitto.log` || **注意** | 这个配置**只指定了输出目标**,但没有指定日志级别 |
**未配置的日志级别:** 如果不指定 `log_type`,Mosquitto 会使用默认级别(通常是 `error`、`warning`、`notice`、`information` 的某些组合)。
**建议补充:**```bash# 补充日志级别配置log_type error      # 错误信息log_type warning    # 警告信息log_type notice     # 普通通知log_type information # 详细信息(调试用)log_type debug      # 调试信息(开发环境)```
---
### 4. 包含目录配置
```bashinclude_dir /etc/mosquitto/conf.d```
| 项目 | 说明 ||------|------|| **作用** | 加载 `/etc/mosquitto/conf.d/` 目录下**所有** `.conf` 文件 || **用途** | 模块化配置,将不同功能的配置拆分成多个文件 || **加载顺序** | 按文件名**字母顺序**加载,如果有冲突,后加载的会覆盖先加载的 |
**目录结构示例:**```/etc/mosquitto/conf.d/├── auth.conf      # 认证配置├── acl.conf       # 权限控制├── bridge.conf    # 桥接配置└── custom.conf    # 自定义配置```
---
### 5. MQTT 协议配置(标准端口)
```bash# mqtt 协议配置listener 1883 0.0.0.0socket_domain ipv4protocol mqtt```
| 配置项 | 值 | 说明 ||--------|-----|------|| **listener** | `1883 0.0.0.0` | 监听端口 `1883`(MQTT 标准端口),绑定到所有 IPv4 地址 || **socket_domain** | `ipv4` | 强制使用 IPv4 协议栈(不监听 IPv6) || **protocol** | `mqtt` | 这个监听器使用原生 MQTT 协议 |
**`0.0.0.0` 的含义:**- 监听所有可用的网络接口(eth0、wlan0、lo 等)- 其他设备可以通过服务器的任意 IP 地址访问
**效果:**- 设备(如你的 LoRa 基站、后端服务)可以使用 `tcp://服务器IP:1883` 连接
---
### 6. WebSocket 协议配置
```bash# 开启websocket# websocket 协议配置listener 9001 0.0.0.0protocol websocketssocket_domain ipv4```
| 配置项 | 值 | 说明 ||--------|-----|------|| **listener** | `9001 0.0.0.0` | 监听端口 `9001`,绑定到所有 IPv4 地址 || **protocol** | `websockets` | 这个监听器使用 WebSocket 协议 || **socket_domain** | `ipv4` | 强制 IPv4 |
**WebSocket 的用途:**- 让**浏览器端 JavaScript** 可以直接通过 MQTT over WebSocket 连接- 替代 AJAX 轮询,实现真正的实时推送
**浏览器连接示例:**```javascript// 浏览器中直接使用 MQTT.js 库连接const client = mqtt.connect('ws://服务器IP:9001/mqtt');client.subscribe('sensor/#');client.on('message', (topic, msg) => {    console.log('收到实时数据:', msg.toString());});```
**端口选择说明:**- `1883`:原生 MQTT 协议(设备、后端服务使用)- `9001`:WebSocket 协议(浏览器使用)- 常见替代端口:`8083`、`8084` 也常用作 WebSocket
---
## 三、发现的问题和优化建议
### ❗ 问题 1:`socket_domain` 配置重复且位置错误
```bashlistener 1883 0.0.0.0socket_domain ipv4      # ❌ 这个位置不对```
**问题:** `socket_domain` 应该**紧跟在对应的 `listener` 后面**,不能写在中间。
**正确写法:**```bashlistener 1883 0.0.0.0protocol mqttsocket_domain ipv4```
### ❗ 问题 2:缺少关键配置
| 缺少的配置 | 建议补充 ||-----------|---------|| **认证配置** | `allow_anonymous true/false` || **日志级别** | `log_type error warning notice` || **用户/权限** | `user mosquitto`(运行用户) |
### ✅ 优化后的完整配置
```bash# ========== 基础配置 ==========pid_file /var/run/mosquitto.piduser mosquitto                    # 以 mosquitto 用户身份运行
# ========== 持久化配置 ==========persistence false                 # 关闭持久化persistence_location /var/lib/mosquitto/
# ========== 日志配置 ==========log_dest file /var/log/mosquitto/mosquitto.loglog_type errorlog_type warninglog_type notice# log_type information          # 开发环境可开启connection_messages true         # 记录连接/断开事件
# ========== 包含目录 ==========include_dir /etc/mosquitto/conf.d
# ========== MQTT 协议配置(端口 1883)==========listener 1883 0.0.0.0protocol mqttsocket_domain ipv4
# ========== WebSocket 协议配置(端口 9001)==========listener 9001 0.0.0.0protocol websocketssocket_domain ipv4
# ========== 安全配置(根据需求选择)==========# 允许匿名连接(测试环境)allow_anonymous true
# 生产环境建议:# allow_anonymous false# password_file /etc/mosquitto/pwfile# acl_file /etc/mosquitto/aclfile```
---
## 四、配置生效和验证
### 1. 检查配置语法```bashmosquitto -c /etc/mosquitto/mosquitto.conf -t```
### 2. 重启服务```bashsudo systemctl restart mosquitto```
### 3. 验证监听端口```bash# 查看 1883 端口(MQTT)sudo netstat -tlnp | grep 1883
# 查看 9001 端口(WebSocket)sudo netstat -tlnp | grep 9001```
**期望输出:**```tcp6   0   0 :::1883    :::*    LISTEN   1234/mosquittotcp6   0   0 :::9001    :::*    LISTEN   1234/mosquitto```
### 4. 测试连接
**测试 MQTT(端口 1883):**```bashmosquitto_sub -h 127.0.0.1 -p 1883 -t "test" -v```
**测试 WebSocket(端口 9001):**可以使用在线工具或浏览器控制台:```javascript// 在浏览器控制台运行(需先引入 mqtt.js)const client = mqtt.connect('ws://127.0.0.1:9001');client.on('connect', () => console.log('WebSocket 连接成功'));```
---
## 五、配置总结
| 配置项 | 当前值 | 建议 ||--------|--------|------|| 持久化 | **关闭** | 测试环境 OK,生产环境建议开启 || MQTT 端口 | 1883 | ✅ 标准配置 || WebSocket 端口 | 9001 | ✅ 常用端口 || 认证 | **未配置** | 缺少(当前默认 `allow_anonymous true`) || 日志级别 | **未配置** | 建议至少配置 `error` 和 `warning` |
**一句话总结:** 这是一个适合**测试环境**的配置,关闭了持久化节省内存,开启了 WebSocket 支持浏览器连接,但**缺少认证配置**,如果暴露在公网会有安全风险。
需要我帮你补充认证配置(用户名密码)或 TLS/SSL 加密配置吗?
posted @ 2026-05-25 23:19  星火撩原  阅读(41)  评论(0)    收藏  举报
本站已运行:0
🌙 夜间模式
🌙
🌙