第2章 Mosquitto搭建:从零开始部署你的第一个MQTT Broker
好,咱们直接进入正题。上一章聊了MQTT的理论,这一章咱们动手干点实在的——把Mosquitto搭起来。我个人觉得,Mosquitto是入门MQTT Broker最好的选择,没有之一。为什么?轻量、稳定、社区活跃,而且它几乎就是MQTT协议的参考实现。
2.1 Mosquitto简介
Mosquitto,全称Eclipse Mosquitto,是Eclipse基金会下的一个开源项目。它用C语言写的,资源占用极低,在树莓派这种小玩意儿上都能跑得飞起。我最早接触它是在一个智能家居项目里,当时需要在几十个传感器节点和一个中央控制器之间传数据,Mosquitto完美胜任。
它支持MQTT 3.1、3.1.1和5.0三个版本。嗯,这里要注意,5.0版本增加了一些新特性,比如用户属性、会话过期等,但如果你刚开始学,用3.1.1就足够了,兼容性最好。
核心特点:
- 完全开源,Apache 2.0许可证
- 支持MQTT所有QoS级别(0、1、2)
- 支持TLS/SSL加密通信
- 支持WebSocket(需要额外编译)
- 提供动态安全插件
- 有完善的日志和调试功能
2.2 Linux环境安装
说实话,我建议所有初学者都在Linux上学习Mosquitto。Windows版本虽然能用,但生产环境99%都是Linux。我自己平时开发用Ubuntu,部署用CentOS,咱们两个都讲一下。
2.2.1 Ubuntu/Debian系列
这个最简单,一行命令搞定:
sudo apt-get update
sudo apt-get install mosquitto mosquitto-clients
安装完成后,Mosquitto会自动启动。你可以检查一下:
sudo systemctl status mosquitto
如果看到绿色的"active (running)",恭喜你,Broker已经在跑了。我曾经遇到过一个问题,安装后怎么都连不上,后来发现是防火墙把1883端口给拦了。所以记得检查端口:
sudo ufw allow 1883/tcp
2.2.2 CentOS/RHEL系列
CentOS稍微麻烦一点,需要先添加EPEL源:
sudo yum install epel-release
sudo yum install mosquitto mosquitto-clients
启动方式一样:
sudo systemctl start mosquitto
sudo systemctl enable mosquitto # 设置开机自启
小技巧: 如果你在CentOS 7上遇到依赖问题,试试先更新系统:sudo yum update。我踩过这个坑,新装的系统直接装Mosquitto会报错,更新一下就好了。
2.3 Windows环境安装
Windows安装其实更简单,但说实话,我很少在Windows上跑生产环境的Broker。不过做测试或者学习的话,Windows完全够用。
去官网下载安装包:https://mosquitto.org/download/,选择Windows版本。安装时一路Next就行,记得勾上"Service"选项,这样Mosquitto会作为Windows服务运行。
安装完成后,打开服务管理器(services.msc),找到"Mosquitto Broker",启动它。或者你也可以用命令行:
net start mosquitto
注意: Windows版本的Mosquitto默认不会创建配置文件。你需要手动在安装目录下创建mosquitto.conf。我第一次用Windows版时就卡在这儿了,服务启动不了,日志里啥也没有。后来才发现是配置文件缺失。
2.4 基础配置与启动
好,安装完了,咱们来配置。Mosquitto的配置文件默认在/etc/mosquitto/mosquitto.conf(Linux)或安装目录下(Windows)。
2.4.1 最简单的配置
一个最基础的配置,只需要几行:
# 监听端口
listener 1883
# 允许匿名连接
allow_anonymous true
# 日志配置
log_dest file /var/log/mosquitto/mosquitto.log
log_type all
注意,allow_anonymous true意味着任何人都可以连接你的Broker。这在测试环境没问题,但生产环境一定要关掉。我曾经在一个演示项目里忘了关,结果被同事的测试脚本连上来乱发消息,排查了半天。
2.4.2 配置详解
| 配置项 | 说明 | 示例 |
|---|---|---|
| listener | 监听端口,可以多个 | listener 1883 |
| allow_anonymous | 是否允许匿名连接 | allow_anonymous false |
| password_file | 密码文件路径 | password_file /etc/mosquitto/passwd |
| log_dest | 日志输出目标 | log_dest file /var/log/mosquitto.log |
| persistence | 是否持久化消息 | persistence true |
| persistence_location | 持久化文件目录 | persistence_location /var/lib/mosquitto/ |
2.4.3 启动与测试
配置完成后,重启Mosquitto:
sudo systemctl restart mosquitto
然后咱们用客户端工具测试一下。打开两个终端:
终端1(订阅者):
mosquitto_sub -h localhost -t "test/topic" -v
终端2(发布者):
mosquitto_pub -h localhost -t "test/topic" -m "Hello MQTT"
如果终端1收到了"Hello MQTT",说明你的Broker工作正常。我第一次成功时还挺激动的,虽然只是几行命令,但那种"通了"的感觉,嗯,你试试就知道了。
避坑指南:
- 我曾经遇到过Mosquitto启动失败,检查日志发现是端口被占用。用
netstat -tulpn | grep 1883查一下谁在用端口。 - 配置文件语法错误也会导致启动失败。Mosquitto对配置格式很敏感,比如等号两边不能有空格?其实可以有,但建议统一风格。
- 如果使用密码认证,记得用
mosquitto_passwd工具生成密码文件,别手写。
2.4.4 生产环境建议配置
最后,给一个我常用的生产环境配置模板:
# 监听1883端口(非加密)
listener 1883
# 监听8883端口(TLS加密)
listener 8883
certfile /etc/mosquitto/certs/server.crt
keyfile /etc/mosquitto/certs/server.key
# 关闭匿名连接
allow_anonymous false
password_file /etc/mosquitto/passwd
# 开启持久化
persistence true
persistence_location /var/lib/mosquitto/
# 日志配置
log_dest file /var/log/mosquitto/mosquitto.log
log_type error
log_type warning
log_type notice
# 连接限制
max_connections 1000
这个配置我用了好几年,稳定得很。当然,具体参数要根据你的业务场景调整。比如物联网设备多的话,max_connections要设大一些。
好了,这一章就到这儿。下一章咱们聊聊如何配置用户认证和权限控制,这可是生产环境的重头戏。你先把Mosquitto跑起来,有问题随时翻翻日志,日志是最好的老师。