Kong reload 後設定沒有恢復:從 .kong_env 合併機制理解註解與明確設定
前言 最近在調整 Kong Data Plane 的回應標頭時,遇到一個讓我有點困惑的現象: 同樣修改 kong.conf,restart 後符合預期,reload 卻像是沒有吃到設定。 一開始以為是 reload 沒有成功,後來才發現,問題不是「新設定沒有讀到」,而是「我沒有明確提供新值」。 發現問題:註解掉 off,卻沒有恢復 我的環境是安裝在 VM 上的 Kong Data Plane。 當時為了關閉 Kong 回應標頭,在 kong.conf 加入: headers = off 需要恢復時,我的操作很直覺:把這行註解掉。 # headers = off 我原本的理解是: 不再指定 off,應該就會恢復預設值。 但執行 reload 後,透過 Postman 呼叫 API,仍然沒有看到預期恢復的 Via 標頭;改用 restart,結果才符合預期。 排查:明確指定值,reload 就生效了 排查過程中,我也嘗試在 Postman 請求加入 Connection: close,但沒有改變測試結果。 真正的轉折,是不再透過註解切換,而是明確寫入: headers = server_tokens, latency_tokens, X-Kong-Request-Id 再次 reload,Via 就恢復了。 這讓問題變得更明確: reload 可以套用明確指定的新值,但將設定註解掉,並沒有清除先前的值。 原始碼線索:舊設定加上新設定 接著查看 Kong 官方 reload.lua 原始碼,其中有一段合併設定的邏輯: local kong_env = assert(pl_file.read(args.conf)) if pl_path.exists(new_config.kong_env) then kong_env = assert(pl_file.read(new_config.kong_env)) .. "\n" .. kong_env end 這段程式不是先逐項比較設定,而是把兩份檔案的文字接起來: ...