網站又掛了?502 Bad Gateway / 504 Gateway Timeout 終極排雷指南:從 Nginx 到 PHP-FPM 的除錯實戰

2025/12/29 | 技術教學資源, 架構與效能優化

502/504 致命錯誤:Nginx 與 PHP-FPM 通訊障礙專業排除術

厭倦了 WordPress 網站動不動就跳出 502 Bad Gateway 或 504 Timeout 錯誤碼嗎?浪花科技資深工程師 Eric 告訴你,重啟只是延期,真正的解法在於 Nginx 與 PHP-FPM 的配置邏輯。本文帶你深入 Log 檔,精準調校超時設定與緩衝區大小,徹底根除「服務生與廚師」的通訊不良。別再瞎猜參數,從根源解決問題!如果您的高流量網站仍被這些錯誤困擾,請立即聯繫浪花科技,讓我們的專家團隊為您的網站進行專業架構健檢,打造火箭級的高效能服務!

需要專業協助?

聯絡浪花專案團隊 →

嗨,我是 Eric,浪花科技的資深工程師。如果你點進這篇文章,我猜你現在的心情大概跟看到藍白當機畫面一樣絕望。你的 WordPress 網站跳出了 502 Bad Gateway 或是 504 Gateway Timeout,客戶的電話可能已經打爆你的手機了。

先別急著重啟伺服器(雖然我知道你很想),重啟通常只是把問題往後延一小時發生而已。身為工程師,我們解決問題不能靠運氣,要靠邏輯。

這這兩錯誤代碼是 WordPress 架構中最經典的「通訊不良」問題,通常發生在 Nginx(網頁伺服器)PHP-FPM(後端處理器) 之間的溝通破裂。今天這篇,我不講虛的,直接帶你看 Config 檔,從根源解決這些讓人生無可戀的 HTTP 錯誤代碼。

為什麼會發生 502 與 504 錯誤?工程師視角的解讀

在我們動手改 Code 之前,你得先搞懂它們到底在抱怨什麼。現在的 WordPress 高效能架構(例如我們常提到的 Cloudways 或自架 VPS),通常是使用 Nginx 作為反向代理,配合 PHP-FPM 來執行 PHP 程式碼。

  • Nginx 是外場服務生:負責接收訪客的點單(HTTP Request)。
  • PHP-FPM 是內場廚師:負責實際炒菜(執行 WordPress 核心、外掛、佈景主題)。

502 Bad Gateway (錯誤的閘道)

這代表服務生(Nginx)把單子送進廚房,但廚房傳回來的不是菜,而是一個無效的回應,甚至是廚師直接昏倒了(PHP Worker Crash)。這通常意味著 PHP-FPM 進程已死,或者 Nginx 的 Buffer 設定太小,裝不下廚師做好的大拼盤。

504 Gateway Timeout (閘道逾時)

這代表服務生(Nginx)在出菜口等了太久,廚師(PHP-FPM)還沒把菜做好。這通常發生在執行耗時的任務(如匯入大量商品、備份網站、或被爛外掛卡死)時,超過了 Nginx 預設的等待時間。

第一步:別瞎猜,看 Log 才是真理

很多人問我:「Eric,我該調大哪個參數?」我都會回:「你看了 Error Log 沒?」不看 Log 就調參數,跟蒙眼開車沒兩樣。

請進入你的伺服器(SSH),查看 Nginx 的錯誤日誌。通常位於:

/var/log/nginx/error.log

如果你看到類似以下的訊息,那就是我們今天的目標:

  • upstream timed out (110: Connection timed out) while reading response header from upstream → 這是 504,PHP 跑太慢了。
  • recv() failed (104: Connection reset by peer) while reading response header from upstream → 這是 502,PHP-FPM 可能崩潰或重啟了。
  • upstream sent too big header while reading response header from upstream → 這是 502,Nginx 的 Buffer 太小。

實戰一:解決 504 Gateway Timeout (延長等待時間)

如果你的網站是因為匯入資料或執行長任務而掛掉,我們需要告訴 Nginx 和 PHP:「多點耐心,別急著掛電話。」

1. 修改 PHP 設定 (php.ini)

首先,確保 PHP 本身允許跑這麼久。

max_execution_time = 300
max_input_time = 300

2. 修改 PHP-FPM Pool 設定 (www.conf)

如果你用的是 PHP-FPM,還要檢查 request_terminate_timeout。如果這裡設定 30秒,就算你 PHP 設定 300秒,FPM 也會強制殺掉進程,導致 502。

request_terminate_timeout = 300s

3. 修改 Nginx 設定 (nginx.conf 或 server block)

這步最關鍵。你需要告訴 Nginx 願意等 PHP 多久。在你的 location ~ \.php$區塊中加入:

fastcgi_read_timeout 300;
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;

Eric 的囉嗦:時間設太長(例如 3600秒)不是好事,這會讓你的 PHP Worker 被佔用無法釋放,如果是被 DDoS 攻擊,你的伺服器很快就會資源耗盡(OOM)。300秒通常是極限了。

實戰二:解決 502 Bad Gateway (Buffer 與 Worker 調校)

如果 Log 顯示 header too big,或是你發現只要頁面稍微複雜一點就掛掉,這通常是 Nginx 的緩衝區(Buffer)不夠大。

1. 加大 Nginx FastCGI Buffer

預設的 Buffer 很小,當 WordPress 吐出巨大的 HTML 或 Header 時(有些 Page Builder 或複雜的主題會這樣),Nginx 會因為裝不下而報錯。請在 Nginx 設定檔加入:

fastcgi_buffer_size 32k;
fastcgi_buffers 16 16k;
fastcgi_busy_buffers_size 64k;

2. 調整 PHP-FPM 的 pm.max_children

如果你的網站流量暴增,現有的 PHP Worker 全部都在忙(Busy),新的請求進來沒人接單,也會導致 502 甚至 504。這時候你需要根據你的記憶體(RAM)來算數。

假設你有 4GB RAM,扣除系統保留,每個 PHP Process 大概吃 60MB-100MB(看外掛多寡)。

pm = dynamic
pm.max_children = 50  ; 不要盲目設大,設太大會記憶體溢出(OOM)導致 MySQL 被殺掉
pm.start_servers = 10
pm.min_spare_servers = 5
pm.max_spare_servers = 20

最新技術趨勢:PHP 8.2+ 與 JIT 的影響

根據 2024-2025 的最新技術趨勢,升級到 PHP 8.2 或 8.3 對於減少 504 錯誤有顯著幫助。PHP 8.x 的運算效率比 7.4 高出許多,這意味著同樣的程式碼,廚師炒菜的速度變快了,自然就不容易超時。

此外,如果你的伺服器負載很高,可以考慮開啟 Opcache JIT (Just-In-Time) 編譯,這對於 CPU 密集型的 WordPress 任務(如圖片處理、複雜計算)能有效降低 CPU 負載,間接減少 502 發生的機率。

Eric 的總結:架構思維大於參數調整

解決 502/504 不只是「把數字調大」這麼簡單。如果你發現調大參數後,網站只是從「馬上掛掉」變成「轉了很久之後掛掉」,那你應該檢查的是程式碼品質。

  • 是不是有外掛在做無限迴圈?
  • 是不是資料庫查詢(SQL Query)沒加索引(Index)?
  • 是不是外部 API(如串接物流或金流)卡住沒回應?

真正的高手,是從 Log 中聽出伺服器的求救訊號,而不是盲目地加大藥量。

推薦閱讀與延伸學習

想更深入了解伺服器架構與排錯?這裡有幾篇我之前寫的深度文章,建議搭配服用:

搞不定這些伺服器設定?讓專業的來!

如果你的網站流量越來越大,502 錯誤頻繁發生,這可能代表你需要更專業的架構優化,而不僅僅是修補設定。浪花科技擁有處理高併發 WordPress 網站的豐富經驗。

別讓技術問題阻礙你的業績成長。

立即聯繫我們,進行網站健檢

常見問題 (FAQ)

Q1: 502 Bad Gateway 和 504 Gateway Timeout 最大的差別是什麼?

簡單來說,504 是「太慢」,Nginx 等不到 PHP 的回應(超時);而 502 是「壞掉」或「無效」,PHP 可能還沒超時就崩潰了,或者回傳了 Nginx 看不懂的資料,甚至是斷開連接。504 通常跟執行時間有關,502 通常跟進程穩定度或緩衝區大小有關。

Q2: 重啟 PHP-FPM 或 Nginx 可以解決問題嗎?

這通常是「治標不治本」。重啟可以清除當前卡死的 Worker,釋放記憶體,讓網站暫時恢復。但如果導致錯誤的根本原因(如程式碼效率低、流量過大、配置不當)沒解決,過一段時間後錯誤還是會再次出現。

Q3: 為什麼我的 WordPress 後台更新外掛時常出現 504?

因為更新外掛需要下載檔案、解壓縮、寫入硬碟,這些都是耗時操作。如果你的伺服器硬碟 I/O 較慢,或者 max_execution_time 設定太短,就容易在更新過程中超時。建議使用 WP-CLI 在指令列進行更新,可以避開 Nginx 的超時限制。

Q4: Cloudflare 的 502/504 錯誤跟伺服器的一樣嗎?

如果你有使用 Cloudflare,看到的 502/504 畫面如果是 Cloudflare 品牌的樣式,通常代表 Cloudflare 連不到你的原始伺服器(Origin Server)。這時候問題還是在你的伺服器端(可能是防火牆擋住了 Cloudflare IP,或是你的伺服器真的掛了),排查方向與本文相同。

 
立即諮詢,索取免費1年網站保固