3. EMQX配置文件与启动参数

EMQX 的配置体系并不是“一个文件说了算”。同一项参数,可能同时出现在 emqx.conf、容器环境变量、命令行启动参数里。如果不知道谁覆盖谁,就会出现“明明改了配置文件却不生效”的典型问题。本节先讲清三者的优先级关系,再落到核心配置项的修改与热重载操作。

一、三层配置来源与优先级

EMQX 5.x 的配置来源可以理解为三层,优先级由低到高依次为:

  1. 配置文件 emqx.conf:持久化的基础配置,通常位于 /etc/emqx/emqx.conf,是集群部署时最常用的配置入口。
  2. 环境变量:以 EMQX_ 为前缀,例如 EMQX_NODE__NAME、EMQX_LISTENERS__TCP__DEFAULT__BIND。容器化部署(Docker、K8s)几乎全靠它注入配置。
  3. 命令行参数:启动时通过 emqx start 或 emqx foreground 附加的参数,优先级最高,常用于临时覆盖或调试。

覆盖规则是“高优先级覆盖低优先级”,且是按配置项逐项覆盖,不是整份文件替换。也就是说,环境变量只覆盖它声明的那一项,其余项仍以 emqx.conf 为准。理解这一点,才能解释为什么“只加了一个环境变量,其他配置没丢”。

EMQX 配置优先级与生效路径 低优先级 → 高优先级,逐项覆盖 ① emqx.conf /etc/emqx/emqx.conf 持久化基础配置 · 优先级最低 ② 环境变量 EMQX_ 前缀 · 双下划线分层 容器/K8s 注入 · 优先级居中 ③ 命令行参数 emqx start 附加参数 临时覆盖 · 优先级最高 逐项合并 · 生成运行时配置 未覆盖项保留低优先级取值 最终生效配置 emqx ctl conf show 可查看 示例:同一项 listeners.tcp.default.bind 的三层取值 emqx.conf:listeners.tcp.default.bind = "0.0.0.0:1883" 环境变量:EMQX_LISTENERS__TCP__DEFAULT__BIND = "0.0.0.0:1884" 命令行:--listeners.tcp.default.bind "0.0.0.0:1885" → 最终生效 1885

二、环境变量的命名转换规则

环境变量不是随便起名,它遵循“配置路径 → 大写 + 双下划线”的转换规则。以配置项 listeners.tcp.default.bind 为例:

  • 把点号 . 替换为双下划线 __;
  • 整体转为大写;
  • 加上 EMQX_ 前缀。

于是得到 EMQX_LISTENERS__TCP__DEFAULT__BIND。注意是双下划线,单下划线会被当作名称的一部分,写错就不会生效。这条规则是排查“环境变量没起作用”的第一检查点。

三、核心配置项修改示例

下面给出一份可直接参考的 emqx.conf 片段,覆盖监听端口、节点名、认证与日志四类高频配置:

node {
  name = "emqx@10.0.0.11"
  cookie = "emqx_secret_cookie"
}

listeners.tcp.default {
  bind = "0.0.0.0:1883"
  max_connections = 102400
}

listeners.ssl.default {
  bind = "0.0.0.0:8883"
  ssl_options {
    certfile = "/etc/emqx/certs/server.crt"
    keyfile  = "/etc/emqx/certs/server.key"
  }
}

log.console.level = warning
log.file.level = info

修改后不要直接重启,先做配置校验:

emqx conf check
# 输出 ok 表示语法与取值合法

如果校验报错,EMQX 会指出具体路径,例如 listeners.ssl.default.ssl_options.certfile 文件不存在。先修文件路径,再谈重载。

四、热重载:哪些能热更,哪些必须重启

热重载的价值在于不中断现有连接。EMQX 支持通过 emqx ctl conf reload 重新加载配置文件,但并非所有配置项都能热生效。判断依据是:该配置是否影响进程启动参数或底层资源绑定。

配置类别典型配置项是否支持热重载
日志级别log.console.level支持,立即生效
认证与授权authentication、authorization支持,新连接按新规则
监听端口listeners.tcp.default.bind不支持,需重启
节点名与 Cookienode.name、node.cookie不支持,需重启
限流与连接数max_connections部分支持,视版本而定

热重载的标准操作流程如下:

  1. 编辑 emqx.conf,只改动支持热更的项;
  2. 执行 emqx conf check 校验语法;
  3. 执行 emqx ctl conf reload 触发重载;
  4. 用 emqx ctl conf show log.console.level 确认新值已生效;
  5. 观察日志与连接数,确认无异常断开。
热重载只重新读取配置文件,不会重新读取环境变量。如果某项是通过环境变量注入的,改环境变量后必须重启容器或进程,重载命令对它无效。

五、优先级冲突的排查方法

当“改了配置却不生效”时,按以下顺序定位:

  • 先用 emqx ctl conf show <配置路径> 查看运行时实际值,而不是看文件;
  • 若运行时值与文件不一致,检查是否存在同名环境变量;
  • 再检查启动命令是否带了覆盖参数;
  • 确认修改的是当前节点实际加载的配置文件路径,而非备份文件。
不要用“重启大法”掩盖优先级问题。重启只能让低优先级配置重新参与合并,若高优先级来源仍在,问题会原样复现。先查来源,再决定改哪一层。

掌握这三层来源与覆盖顺序后,配置修改就从“碰运气”变成“可推理”:先确定目标项属于哪一层,再判断它能否热更,最后用运行时查询验证结果。这套方法在单机、Docker 与 K8s 部署中同样适用。