前陣子一台放在反向代理後面的 LibreNMS 突然出問題:用對外網址打開,畫面只剩 logo 和一串沒有樣式的文字選單,CSS、JS 全都沒有載入。前幾天都還好好的,設定也沒人動過。
追下去才發現,是 LibreNMS 在 2026/05/05 改了 APP_TRUSTED_PROXIES 的預設值。只要反向代理不在同一台主機上、又沒有自己設定這個參數,更新後都會遇到一樣的狀況,這篇把排除過程記錄下來。
環境
架構很單純,外部連線先進反向代理,再轉給後端的 LibreNMS:
| 角色 | 位址 | 說明 |
|---|---|---|
| 對外網址 | https://mon.example.com | 使用者實際開啟的網址 |
| 反向代理 | 192.168.10.10 | nginx,負責 HTTPS 憑證,vhost 在 /etc/nginx/vhost/mon.example.com.conf |
| 後端 LibreNMS | 192.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,它們也都有對應的信任代理設定。
參考資料
- LibreNMS 文件:Environment Variables
https://docs.librenms.org/Support/Environment-Variables/ - LibreNMS PR #19537:Change default APP_TRUSTED_PROXIES to 127.0.0.1
https://github.com/librenms/librenms/pull/19537 - Laravel 文件:Configuring Trusted Proxies
https://laravel.com/docs/requests#configuring-trusted-proxies - MDN:Mixed content
https://developer.mozilla.org/en-US/docs/Web/Security/Mixed_content



