cxl
Published on 2025-06-07 / 25 Visits
0
0

MQTT Broker服务器开源利器-EMQX

在物联网的世界里,设备之间的通信至关重要,而 MQTT 协议因其轻量级和高效性成为众多物联网项目的首选。EMQX 作为一款优秀的 MQTT Broker,凭借其强大的功能和出色的性能,成为了连接设备与实现消息传递的关键角色。

简介

EMQX 是基于 Erlang/OTP 平台开发的开源物联网 MQTT 消息服务器,是开源社区中最流行的 MQTT 消息服务器之一。它支持 MQTT V3.1.1/V5.0 协议规范,能够稳定承载大规模的 MQTT 客户端连接,单服务器节点支持 200 万连接,并且支持分布式集群架构,可实现高并发软实时消息路由。EMQX 还支持多种协议的接入,如 MQTT-SN、CoAP、LwM2M、WebSocket 等,满足不同场景下的通信需求。

主要特点

  1. 高性能与可扩展性

    • 基于 Erlang/OTP 平台开发,天生支持分布式和高并发

    • 单节点支持百万级 MQTT 客户端连接

    • 支持集群扩展,轻松应对千万级连接

  2. 丰富的协议支持

    • 全面支持 MQTT v3.1、v3.1.1 和 v5.0 协议

    • 支持 MQTT over TCP、TLS、WebSocket、HTTP 等多种传输方式

    • 兼容 CoAP、LwM2M 等物联网协议

  3. 灵活的认证与授权

    • 支持用户名 / 密码认证、TLS 证书认证

    • 支持基于 LDAP、MySQL、PostgreSQL、Redis 等外部数据源的认证

    • 细粒度的主题访问控制

  4. 强大的消息路由与桥接

    • 基于主题的消息发布 / 订阅模式

    • 支持规则引擎,实现消息过滤、转换和转发

    • 支持与外部系统(如 Kafka、RabbitMQ、HTTP 服务)的桥接

  5. 企业级功能

    • 监控与统计:提供详细的连接、流量、消息统计

    • 日志与告警:完善的日志系统和告警机制

    • 安全加固:支持 TLS/DTLS 加密、IP 访问控制

安装与部署

目前EMQX最新稳定版本是5.9.0,点击跳转官网下载地址

Docker容器化部署

  # 启动容器并挂载目录
  docker run -d --name emqx-enterprise \
  -p 1883:1883 -p 8083:8083 \
  -p 8084:8084 -p 8883:8883 \
  -p 18083:18083 \
  -v $PWD/data:/opt/emqx/data \
  -v $PWD/log:/opt/emqx/log \
  emqx/emqx-enterprise:5.9.0

docker启动容器之后可能报错,我部署时就遇到了 mkdir: cannot create directory ‘/opt/emqx/data/configs’: Permission denied 错误此时别慌,遇事不决问AI呀,再不行就只能啃官方文档或者查github或gitee的issue,还不行就咨询官方客服或开源作者,当然,如果你有个技术前辈带那就最好不过啦!这里我就先给出官方的处理方案了,我这里的解决方案与官方不同,由于是演示环境,我就用root账户运行EMQX了,直接在启动容器命令时加了 --user root 搞定!

Ubuntu部署

  # 下载安装压缩包
  wget https://www.emqx.com/zh/downloads/enterprise/5.9.0/emqx-enterprise-5.9.0-ubuntu22.04-amd64.tar.gz
  # 在当前目录创建emqx目录并解压到emqx目录
  mkdir -p emqx && tar -zxvf emqx-enterprise-5.9.0-ubuntu22.04-amd64.tar.gz -C emqx
  # 启动安装
  ./emqx/bin/emqx start

看到18083端口已经打开,即可访问EMQX的管理后台了,默认账号密码是 admin/public,每次登录后会有相关的license提示,比较烦人,如果密码忘了可以通过 ./bin/emqx ctl admins passwd <Username> <Password> 命令修改,如 ./bin/emqx ctl admins passwd admin public

上面部署方式都是采用单节点的方式,EMQX支持集群部署,而且看文档里部署过程也是比较简单的,直接采用static方式配置一下就差不多了,由于EMQX的集群是需要购买license的,这里就不作演示了,感兴趣的话可以使用docker方式,参考官方文档即可。

EMQX启动成功后会打开几个端口,以下是对应的端口说明:

  • MQTT 协议端口

    • 1883‌: 默认的 MQTT 非加密端口。用于物联网设备、客户端应用程序通过 MQTT 协议与 EMQX Broker 建立明文连接。

    • 8883‌: 默认的 MQTT SSL/TLS 加密端口。用于物联网设备、客户端应用程序通过加密的 MQTT 协议安全地连接至 EMQX Broker 。

  • 管理端口

    • 18083‌: Dashboard 和 REST API 端口。

      • Dashboard‌: 通过浏览器访问 EMQX 的 Web 管理控制台(如 http://localhost:18083),用于用户认证、节点监控、插件配置等管理操作。

      • REST API‌: 提供 HTTP API 接口(如 GET /api/v4/clients),用于编程方式管理和监控 EMQX(如获取客户端列表、管理规则引擎)。

  • MQTT 增强功能端口

    • 8083‌: MQTT over WebSocket 非加密端口。允许浏览器或 Web 应用通过 WebSocket 协议使用 MQTT。

    • 8084‌: MQTT over WebSocket SSL/TLS 加密端口。提供安全的 WebSocket MQTT 连接。

  • 集群通信端口

    • 4370‌: Erlang 分布式协议端口 (EPMD)。用于节点发现和集群组建。

    • 5370‌: Erlang 节点间通信端口 (Distributed Erlang Port)。用于集群节点间的内部通信和数据同步

配置

EMQX提供了丰富的一系列可定制配置,全部都包含在这个配置手册里了,比如基本的端口、节点、集群、安全验证、授权、日志等。配置文件在emqx安装目录下的 etc 目录名叫 emqx.conf 的文件,我们看到默认是配置了当前node节点信息以及集群与控制后台的端口号。

如果需要修改EMQX的监听配置,可以直接编辑 emqx.conf 文件,在后面追加监听内容,如将原先的18083端口改成3333端口:

  dashboard {
    listeners {
        http.bind = 3333
        # http.bind = 18083
        # https.bind = 18084
        https {
            ssl_options {
                certfile = "${EMQX_ETC_DIR}/certs/cert.pem"
                keyfile = "${EMQX_ETC_DIR}/certs/key.pem"
            }
        }
    }
  }
  

保存后,重启EMQX服务

  ./emqx stop
  ./emqx start

总结

EMQX 作为一款开源的 MQTT Broker,凭借其高性能、高并发、灵活的扩展性和强大的管理功能,成为了物联网项目中理想的 MQTT 服务器选择。无论是智能家居、工业自动化还是智慧城市等场景,EMQX 都能够满足设备之间的高效通信需求。通过本文的介绍和教程,相信你已经对 EMQX 有了全面的了解,并掌握了如何安装、配置和使用它来搭建 MQTT 服务器。


Comment