排查 Nginx 502 Bad Gateway 的系統方法 文章首圖

排查 Nginx 502 Bad Gateway 的系統方法

排查 Nginx 502 Bad Gateway 的系統方法

在 Linux 伺服器管理中,502 Bad Gateway 是 Nginx 最常見的錯誤之一。當使用者看到這個錯誤時,代表 Nginx 作為反向代理伺服器,成功接收了客戶端的請求,但在嘗試將請求轉發給後端應用程式伺服器(如 PHP-FPM、Node.js 或 Gunicorn)時,卻收到了無效的回應。

對於中階 Linux 使用者而言,盲目重啟服務往往無法解決根本問題。本文將引導你透過系統層面的邏輯排查,快速定位並修復此問題。

第一步:確認後端服務狀態

502 錯誤的核心在於「後端掛了」或「後端無回應」。首先,我們必須確認你的應用程序是否正在運行。假設你使用的是 PHP-FPM,請檢查其服務狀態:

systemctl status php8.1-fpm

如果服務顯示 inactive (dead)failed,請嘗試啟動它:

sudo systemctl start php8.1-fpm
sudo systemctl enable php8.1-fpm

若服務正在運行但狀態異常,請檢查其日誌以獲取更多細節:

journalctl -u php8.1-fpm -n 50 --no-pager

第二步:檢查 Nginx 錯誤日誌

Nginx 的錯誤日誌(通常位於 /var/log/nginx/error.log)是排查 502 錯誤的第一手資料。當 502 發生時,日誌中通常會包含具體的失敗原因,例如「Connection refused」或「No live upstreams」。

使用 tail 命令即時監控日誌變化,然後刷新你的網頁觸發錯誤:

sudo tail -f /var/log/nginx/error.log

常見的关键訊息包括:

  • connect() failed (111: Connection refused):後端服務未監聽在指定端口,或服務未啟動。
  • upstream prematurely closed connection:後端服務崩潰或處理超時。

第三步:驗證 Socket 或端口連接

Nginx 與後端通訊通常透過 Unix Socket 或 TCP 端口。以 PHP-FPM 為例,預設使用 Socket 檔案。請確認 Nginx 配置中的 fastcgi_pass 路徑與 PHP-FPM 產生的 Socket 路徑一致。

檢查 PHP-FPM 是否生成了 Socket 檔案:

ls -l /run/php/php8.1-fpm.sock

如果檔案不存在,可能是權限問題或 PHP-FPM 配置錯誤。若使用 TCP 端口(如 127.0.0.1:9000),則需確認該端口是否被監聽:

ss -tlnp | grep 9000

若無輸出,表示後端未監聽該端口。

第四步:檢查權限與 SELinux/AppArmor

即使服務運行正常,權限問題也會導致 Nginx 無法讀取後端 Socket 或訪問資源。確保 Nginx 使用者(通常是 www-data)對相關目錄和檔案擁有讀取權限。

對於 Ubuntu/Debian 系統,SELinux 預設關閉,但 AppArmor 可能限制 Nginx 的權限。檢查 AppArmor 日誌:

sudo dmesg | grep -i apparmor

若發現拒絕記錄,可能需要調整 AppArmor 配置或使用 aa-complain 模式進行測試。

常見問題

1. 後端服務記憶體不足而崩潰

當後端應用程式(如 Node.js 或 Python 應用)記憶體泄漏時,Linux OOM Killer 可能會終止該進程,導致 Nginx 收到 502。檢查系統日誌:

sudo dmesg | grep -i "out of memory"

若發現 OOM 事件,需優化應用程式記憶體使用或增加伺服器 RAM。

2. 配置錯誤導致無效上游

在 Nginx 配置中,若 upstream 區塊定義錯誤,或 server 指令指向不存在的後端,也會引發 502。檢查 Nginx 配置語法:

sudo nginx -t

若出現 invalid host in upstreamno live upstreams,請修正 nginx.conf 或對應的 site 配置文件。

小結

排查 Nginx 502 Bad Gateway 錯誤,關鍵在於理解其本質是「代理伺服器與後端通訊失敗」。透過檢查後端服務狀態、分析 Nginx 錯誤日誌、驗證連接方式以及確認系統權限,大多數 502 問題都能被快速解決。記住,系統日誌永遠是可靠的線索,善用 journalctldmesg 將助你成為更高效的 Linux 管理員。