【三】EMQX的常用配置介绍

1,441 阅读5分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。


在前面两章中分别介绍了MQTT的安装,以及在Java中如何连接使用MQTT进行消息的发布和订阅操作。

因为采用的EMQX作为MQTT的服务,所以本篇将简单介绍一些EMQX常用的配置。

一、topic与通配符

emqx中topic以斜杠(/)划分层级,一个topic必须包含一个斜杠

通配符含义
#匹配1个或多个层级
+匹配1一个层级
${clientid}clientId
${username}username

二、禁用匿名登录

在创建MQTT连接时,有项参数是输入用户名(username)和密码(password),但是emqx默认是可以匿名登录,并且默认没有认证该用户名和密码。

从安全生产出发,在部署环境应当禁止匿名使用,对连接用户等进行基础验证。

禁用方法:在etc/emqx.conf中修改

allow_anonymous=false  # 默认为true

三、用户验证

emqx支持多种用户验证方式,具体可以参考EMQX文档-用户认证

emqx主要支持四种用户认证方式

  1. 内置数据认证
  2. JWT认证
  3. 外部数据库认证
  4. HTTP API认证

这里主要介绍第一种内置数据认证

首先启用插件

emqx_ctl plugins load emqx_auth_mnesia

在配置文件plugins/emqx_auth_mnesia.conf中添加下面配置即可添加一个用户

auth.client.1.clientid = id
auth.client.1.password = passwd

密码的加密方式可以有多种

## Value: plain | md5 | sha | sha256 | sha512
auth.mnesia.password_hash = sha256

注:此配置必须先禁用匿名登录

四、插件的启用与管理

emqx内置的很多功能是以插件形式植入,部分默认启用,大部分默认未启用。

插件查看

emqx_ctl plugins list

image.png

其中active=false即未启用

启用插件

emqx_ctl plugins load plugin_name

注:plugin_name一定是要plugins目录中存在的插件

禁用插件

emqx_ctl plugins unload plugin_name

重新加载插件

emqx_ctl plugins reload plugin_name

注:模块modules与plugins类似,命令

emqx_ctl modules cmd mod_name

五、代理订阅

代理订阅功能可以使连接的client自动订阅某个主题,不需要client主动操作,又emqx服务代为处理。

启用

在命令行执行

emqx_ctl modules load emqx_mod_subscription

配置

## 代理订阅的主题
module.subscription.<number>.topic = <topic>

## 代理订阅的订阅选项:QoS
## 可选值: 0、1、2
## 默认值:1
module.subscription.<number>.qos = <qos>

## 代理订阅的订阅选项:No Local
## 可选值: 0、1
## 默认值:0
module.subscription.<number>.nl = <nl>

## 代理订阅的订阅选项:Retain As Published
## 可选值: 0、1
## 默认值:0
module.subscription.<number>.rap = <rap>

## 代理订阅的订阅选项:Retain Handling
## 可选值: 0、1、2
## 默认值:0
module.subscription.<number>.rh = <rh>

例如

module.subscription.1.topic = client/%c

module.subscription.2.topic = user/%u
module.subscription.2.qos = 2
module.subscription.2.nl  = 1
module.subscription.2.rap = 1
module.subscription.2.rh  = 1

占位符

占位符含义
%cclientId
%uusername

六、延迟发布

延迟发布可以使发布的消息延迟指定的时间后推送

  • 配置

  • 启用命令

    v4.1.0及以上:emqx_ctl modules load emqx_mod_delayed(挂载模块)

    v4.0.0:emqx_ctl plugins load emqx_delayed_publish(挂载插件)

  • 说明

    延迟发布使用主题前缀 $delayed/{DelayInterval}/{TopicName} ,该功能以主题重写为基础,若使用延迟发布主题前缀,则会将该主题重写,并以指定seconds时间后发布消息至指定的主题。

    $delayed: 使用 $delay 作为主题前缀的消息都将被视为需要延迟发布的消息。延迟间隔由下一主题层级中的内容决定。

    {DelayInterval}: 指定该 MQTT 消息延迟发布的时间间隔,单位是秒,允许的最大间隔是 4294967 秒。如果 {DelayInterval} 无法被解析为一个整型数字,EMQX 将丢弃该消息,客户端不会收到任何信息。

    {TopicName}: MQTT 消息的主题名称。

七、订阅系统主题

系统主题是以$SYS开头的主题,默认只允许本机用户订阅,其他用户需要在配置中配置规则允许订阅。

系统主题介绍可参考官方文档:EMQX文档-系统主题

  • 配置

    etc/acl.conf中配置 {allow, {ipaddr, ""}, pubsub, ["$SYS/#", "#"]}.

  • 启用命令

  • 说明

    若emqx非系统服务部署本地,则需要添加此配置信息允许服务所在主机订阅系统主题。

八、消息大小限制

  • 配置

    在etc/emqx.conf中配置zone.external.max_packet_size = 4MB(具体大小根据实际数据而定)

  • 启用命令

  • 说明

    官方文档中指出配置项为mqtt.max_packet_size,经过实测,在版本4.0.0及4.1.0中,需配置zone.external.max_packet_size 而非mqtt.max_packet_size

如果此项配置有错误请指正,谢谢。

九、dashboard配置

  • 配置

    dashboard相关配置在plugins/emqx_dashborad.conf中,dashboard以插件形式存在,默认启动

  • 启用命令

    无(默认启动)

  • 说明

    使用http://localhost:18083 访问dashboard页面,用户名和密码在配置文件中更改,默认账户为u:admin,p:public。

10、消息保留

  • 配置

    在etc/emqx.conf中,修改mqtt.retain_available为true或者false,默认为true,即消息保留。

    该功能由插件emqx_retainer配置管理,该插件默认启动,可以调整 EMQ X 储存保留消息的位置,限制接收保留消息数量和 Payload 最大长度,以及调整保留消息的过期时间。

  • 启用命令

    无(默认启动)

  • 说明

    服务端收到 Retain 标志为 1 的 PUBLISH 报文时,会将该报文视为保留消息,除了被正常转发以外,保留消息会被存储在服务端,每个主题下只能存在一份保留消息,因此如果已经存在相同主题的保留消息,则该保留消息被替换。当客户端建立订阅时,如果服务端存在主题匹配的保留消息,则这些保留消息将被立即发送给该客户端。

  • 注意:若关闭消息保留机制,则在发布消息时retain参数只能传入false,传入true则会异常并断开连接

    建议在客户端中配置使用retain=false字段而非直接关闭消息保留,否则易报异常并断开连接

十、关闭遥测

  • 配置

    在data/loaded_plugins 文件,删除 emqx_telemetry. 这一行数据(注意后面有一个 "." 字符),删除后就表示永远不会启用遥测插件。

  • 说明

    遥测功能用于向EMQ社区通过http请求上报遥测数据,项目中无需此配置,关掉。


有兴趣的小伙伴可以关注公众号【暴走的怪兽君】,常更新Java干货资讯,免费提供大量教程和工具下载。