跳到主要內容
節省工具箱Jason Tools
經驗分享

LibreNMS 反向代理後畫面無樣式的修正

Jason Cheng 發布 瀏覽 1 次
LibreNMS 反向代理後畫面無樣式的修正
本文目錄
  1. 環境
  2. 故障現象
  3. 問題定位
  4. 前幾天正常的原因
  5. 修復步驟
  6. 檢查清單
  7. 結論
  8. 參考資料

前陣子一台放在反向代理後面的 LibreNMS 突然出問題:用對外網址打開,畫面只剩 logo 和一串沒有樣式的文字選單,CSS、JS 全都沒有載入。前幾天都還好好的,設定也沒人動過。

追下去才發現,是 LibreNMS 在 2026/05/05 改了 APP_TRUSTED_PROXIES 的預設值。只要反向代理不在同一台主機上、又沒有自己設定這個參數,更新後都會遇到一樣的狀況,這篇把排除過程記錄下來。

環境

架構很單純,外部連線先進反向代理,再轉給後端的 LibreNMS:

角色位址說明
對外網址https://mon.example.com使用者實際開啟的網址
反向代理192.168.10.10nginx,負責 HTTPS 憑證,vhost 在 /etc/nginx/vhost/mon.example.com.conf
後端 LibreNMS192.168.10.20安裝於 /opt/librenms/,nginx 設定在 /etc/nginx/conf.d/librenms.conf,只跑 HTTP

故障現象

  • 直接用後端的 http://192.168.10.20 開啟:正常
  • 透過 https://mon.example.com(反向代理 → 後端)開啟:畫面只有 HTML 結構,沒有 CSS 與 JS
  • 前幾天都正常,某天突然壞掉

問題定位

打開瀏覽器的開發人員工具,Console 出現一大堆這樣的錯誤:

Mixed Content: The page at 'https://mon.example.com/' was loaded over HTTPS,
but requested an insecure stylesheet 'http://mon.example.com/css/...'.
This request has been blocked.

重點在這裡:主機名稱是對的,只有通訊協定從 https 變成了 http。瀏覽器不允許 HTTPS 頁面載入 HTTP 的資源(混合內容,Mixed Content),所以樣式和程式全部被擋掉。

也就是說,LibreNMS(Laravel)在產生資源網址時用了 http,因為它不知道自己前面其實是 HTTPS 的反向代理。

反向代理端設定

先看反向代理的 vhost:

location / {
    proxy_pass http://192.168.10.20;
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_redirect off;
}

X-Forwarded-Proto 有正確帶上,告訴後端原始連線是 https,這一端沒問題。

LibreNMS 端設定

再看後端的 /opt/librenms/.env:

APP_URL=https://mon.example.com
#APP_TRUSTED_PROXIES=

APP_URL 是對的,但 APP_TRUSTED_PROXIES 被註解掉,這就是問題所在。

LibreNMS 的 config/trustedproxy.php 是這樣寫的:

'proxies' => LibreNMS\Util\EnvHelper::parseArray('APP_TRUSTED_PROXIES', '127.0.0.1', ['', '*', '**']),

沒設定 APP_TRUSTED_PROXIES 時,預設只信任 127.0.0.1。從 192.168.10.10 進來的請求不在信任清單裡,Laravel 的 TrustProxies 中介軟體就會直接忽略 X-Forwarded-Proto,改用實際 TCP 連線的通訊協定(http)組網址,結果就是混合內容。

前幾天正常的原因

查了 LibreNMS 的 GitHub,答案很明確:2026/05/05 合併的 PR #19537「Breaking: Change default APP_TRUSTED_PROXIES to 127.0.0.1」,把預設值從 * 改成 127.0.0.1。

版本預設值效果
2026/05/05 以前*信任任何直接連進來的代理,沒設定也能正常運作
2026/05/05 以後(每日版、26.5 月版起)127.0.0.1只信任本機上的代理

官方在 PR 裡也說明了:反向代理在其他主機、又沒有設定 APP_TRUSTED_PROXIES 的使用者會受影響。我這台跑的是每日更新,所以 5/5 之後自動更新就中了。

說實話這個改法是對的,原本的 * 等於誰送來的 X-Forwarded-* 標頭都相信,有心人可以偽造來源 IP 或通訊協定。只是預設行為一改,以前「沒設也會動」的環境就一起出事了。

修復步驟

只要在後端 LibreNMS 上操作,反向代理不用動。

# 1. 指定信任的反向代理位址
sed -i 's|^#APP_TRUSTED_PROXIES=.*|APP_TRUSTED_PROXIES=192.168.10.10|' /opt/librenms/.env

# 2. 確認有改到
grep APP_TRUSTED_PROXIES /opt/librenms/.env

# 3. 清除 Laravel 的設定與快取
sudo -u librenms php /opt/librenms/artisan config:clear
sudo -u librenms php /opt/librenms/artisan cache:clear

瀏覽器按 Ctrl + Shift + R(macOS 是 Cmd + Shift + R)強制重新整理,畫面就恢復正常了。

APP_TRUSTED_PROXIES 可以寫多個位址或 CIDR,用逗號分隔,例如有兩台反向代理做備援時:

APP_TRUSTED_PROXIES=192.168.10.10,192.168.10.11

注意:官方文件明確建議不要設成 *(信任任何代理)或 **(信任整條代理鏈),雖然可以馬上解決問題,但等於又回到原本不安全的狀態。請務必寫實際的反向代理位址。

檢查清單

Laravel 開發的應用程式放在反向代理後面,下面幾項都要確認:

檢查項目設定位置用途
proxy_set_header X-Forwarded-Proto $scheme;反向代理告訴後端原始連線是 HTTPS
proxy_set_header Host $http_host;反向代理保留原始主機名稱
APP_URL=https://<對外網址>LibreNMS .env產生網址的基準
APP_TRUSTED_PROXIES=<反向代理 IP>LibreNMS .env本次重點,不信任代理的話前面的標頭都會被忽略

結論

這次的狀況,反向代理設定沒錯、APP_URL 也沒錯,偏偏少了 APP_TRUSTED_PROXIES 這一行,前面全部白費。以前靠預設值 * 撐著沒發現,官方一收緊就現形。

如果你的 LibreNMS 也是放在另一台反向代理後面,建議現在就去檢查 .env,不要等到畫面壞掉才處理。同樣的觀念也適用於其他 Laravel 系的應用程式,例如 Snipe-IT、BookStack,它們也都有對應的信任代理設定。

參考資料

Jason Cheng

Jason Cheng

企業開源技術顧問,專注架構規劃與實務導入

關於作者 →

延伸閱讀