設定與組態
EMQX 設定與組態:Dashboard 可調設定、EMQX_ 環境變數、設定檔與 Secret 管理,以及 add-on 的 env_vars 用法。
為什麼要學這個
EMQX 的參數散在幾個地方:可以直接在 Dashboard 動態調整的、藏在設定檔的、以及以環境變數覆蓋的。家用場景常會不小心把兩個設定寫到不同層,結果改不動卻又不確定誰贏。
這章把 EMQX 的設定體系講清楚:Dashboard 的 Management 模組先說明,再講設定檔(emqx.conf、HOCON)與 EMQX_ 環境變數的優先權,最後帶到 Secret(敏感值)與 add-on 的 env_vars 用法。讀完,你改任何設定都不會再東猜西猜。
核心概念
EMQX 的設定分「靜態」與「動態」兩類目錄。
- 靜態設定
etc:通常是唯讀,放在主設定檔(例如emqx.conf);主要在部署或升級時改。 - 動態設定
data/configs:可寫,把你從 Dashboard、REST API、CLI 做的變更儲存到cluster.hocon。
優先權從低到高是:base.hocon(5.8.4 起才有)< cluster.hocon < emqx.conf < 環境變數。也就是說,越後面越高。
Dashboard 的 Management 模組就是「動態調整」的入口:Cluster Settings、MQTT Settings、Logging、Monitoring 等都可以在執行中不重啟就套用。
名詞對照
| 英文 | 中文 | 說明 |
|---|---|---|
| Configuration | 設定/組態 | EMQX 的參數集合 |
| HOCON | HOCON | EMQX 使用的可讀設定格式 |
| emqx.conf | 主設定檔 | 靜態設定,優先權高於 cluster.hocon |
| cluster.hocon | 叢集設定檔 | Dashboard 動態變更的落點 |
| Environment Variable | 環境變數 | 最高優先,以 EMQX_ 開頭 |
| Secret | 秘密/敏感值 | 密碼、token 這類不應外洩的值 |
動手做
進 Cluster Settings 看動態設定
左側 Management → Cluster Settings,這裡可調整 MQTT、Listener、Logging 等設定,儲存後立即生效。
用 add-on 的 env_vars 追加環境變數
Home Assistant → 左側 EMQX add-on → 組態(Configuration)。在 env_vars 填
name與value;add-on 只接受以EMQX_開頭的變數名,改完後記得重啟。用環境變數覆蓋一個預設值
例如要改節點名,填
EMQX_NODE__NAME(雙底線代表設定層級)。存檔後重啟 add-on,再看 Dashboard 數值。若需要「靜態」設定檔
進 add-on 的「資料」目錄可以看到 /data/emqx/etc/emqx.conf。除非必要,不手動改,因為 Dashboard 寫的都落在
cluster.hocon。
設定檔:HOCON 與優先權
從 EMQX 5.0 起用 HOCON 格式(是 JSON 的 superset,可用巢狀物件或扁平路徑寫)。
node {
name = "[email protected]"
cookie = "<你的cookie>"
}
也可以寫成扁平:node.name = "[email protected]"。
實際的優先權如果沒特別記,很容易混亂。重點是「後出現優先」與「高層優先」:base.hocon 最弱、環境變數最強。若你在動態調整寫的是 cluster.hocon,但同一項目在 emqx.conf 或環境變數裡另有設定,重啟後可能被改回去。
建議:不要在 emqx.conf 與 cluster.hocon 同時寫同一項目,以免重開後數值回到其中一端。
EMQX_ 環境變數與 add-on env_vars
環境變數與設定檔的轉換規則:
- 設定檔用點(
.)分隔層級,環境變數用雙底線(__)。 - 變數名稱一律以
EMQX_開頭。 - 值會以 HOCON 解析,因此可傳入複雜型態。
Woow EMQX add-on 在 config.yaml 定義了 env_vars 組態。範例:
env_vars:
- name: EMQX_NODE__NAME
value: "[email protected]"
- name: EMQX_LISTENERS__TCP__DEFAULT__MAX_CONNECTIONS
value: "1000000"
存檔後重啟 add-on 才會生效。
Secret 管理:別踩 HOCON 的註解坑
EMQX 的設定有「Secret」型別,用來存密碼與 token 這類敏感值。在 add-on 或 Dashboard 的欄位輸入時,一律以佔位符(例如 <你的密碼>)代替實值,不寫實際秘密。
一個常見的坑:HOCON 裡 `#` 是註解開頭。若密碼含 #,例如 MQtt#123,沒有加引號,解析器會把它當成 MQtt,`#123` 會被當成註解丟掉。要用「HOCON 層級雙引號」把它包起來,才能保留整個字面值:
export EMQX_DASHBOARD__DEFAULT_PASSWORD='"MQtt#123"'
含 : 或 = 的值也要比照。URL 編碼(如 %23)不適用——EMQX 不會解開環境變數的 URL encoding。
故障排除
- 改了設定,重開後又被打回原形:多半是 emqx.conf 或環境變數的優先權較高。把要用的值改到高一層(例如環境變數),把它固定住。
- env_vars 不生效:先確認變數名以
EMQX_開頭且用了雙底線(__);存檔後要重啟 add-on。名字拼錯會在啟動 log 裡看到 warning。 - 密碼含 # 卻被截斷:因為 HOCON 把 # 當註解。把它加上一層雙引號整體存進去(連引號),不要只貼原值。
- 找不到要改的設定:先判斷它是 Dashboard 可動態調、還是在設定檔裡的靜態項目。前者用 Management;後者去 emqx.conf 或用環境變數。
常見問題
Dashboard 改的設定存在哪
Dashboard、REST API、CLI 的動態調整會被寫進 data/configs/cluster.hocon(叢集級)。如果不希望它被改,就去寫更高層的 emqx.conf 或環境變數。
emqx.conf 與 cluster.hocon 誰優先
emqx.conf 優先於 cluster.hocon。不過兩者都不要重疊同一個參數,以免重開後搞不清楚最終值。
同一參數同時寫在環境變數與設定檔呢
環境變數最高。環境變數會蓋過設定檔,但它的值會被當成 HOCON 解析;含特殊字元(#、:、=)時要包 HOCON 雙引號。
add-on 的 env_vars 限哪些變數名
add-on 的 config.yaml 用正表示 `^EMQX_([A-Z0-9_])+$` 校驗環境變數名,所以只能填入以 EMQX_ 開頭的變數名。