第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跑起来,有问题随时翻翻日志,日志是最好的老师。