504 錯誤怎麼辦?一次搞懂 504 Gateway Timeout 原因與解決方法

你有沒有遇過這種情況,活動剛上線、廣告剛開跑、流量正衝高,畫面卻突然整片白底黑字:
504 Gateway Timeout
那種崩潰感真的會讓人血壓飆升。
其實 504 通常不是「網站壞掉」,而是「等太久等不到回應」。
尤其在高峰期,當流量暴增、第三方服務延遲、資料庫查詢變慢時,就很容易出現 504 Gateway Timeout。
這篇文章會帶你:
-
搞懂 504 是什麼
-
一步步定位是哪一層出問題
-
建立排障 SOP,避免下次再當無頭蒼蠅
如果你是網頁新手,或最近正被 504 搞到懷疑人生,這篇會很實用,記得收藏唷!
504 是什麼?用白話搞懂 504 Gateway Timeout

504 Gateway Timeout 是一種 HTTP 狀態碼。
意思是:
「網關(Gateway)或代理伺服器,在規定時間內,等不到上游伺服器回應。」
簡單說明請求流程:
使用者 → CDN / 反向代理 → 應用伺服器 → 資料庫
504 發生的位置,通常是「中間那層」在等待「後端」,但後端遲遲沒有回應。
504 常見原因有哪些?最容易踩到的 7 種情境一次看
當你看到 504 Gateway Timeout,先不要急著怪主機商。
多數時候,它其實是在告訴你:「後端某一段卡住了。」

以下是最常見導致 504 的幾種原因:
上游伺服器處理太慢(最常見)
這是 504 的頭號兇手。
所謂「上游伺服器」,指的是在 CDN 或反向代理後面的應用伺服器。
如果它處理請求太慢(例如超過 30 秒),前面的網關等不到回應,就會直接回傳 504。
常見原因包括:
-
流量突然暴增
-
伺服器 CPU 滿載
-
程式進入無限迴圈
-
I/O 操作卡住
愛立歐小提醒:
簡單來說,就是「車子塞住了」,前面的人等太久,只好宣布逾時。
資料庫慢查詢或鎖表
很多 504 問題,其實根本不是網站壞掉,而是資料庫在拖後腿。
例如:
-
沒加索引的大型查詢
-
一次撈幾十萬筆資料
-
資料表被鎖住
-
連線池滿了
當資料庫回應變慢,應用程式就會卡住,最後導致 504。
愛立歐小提醒:
這種情況在高峰期特別容易發生唷!
應用程式執行緒耗盡
每個應用程式都有「處理名額」。
如果同時間太多人進來:
-
執行緒池滿了
-
佇列堆積
-
worker 不夠
新的請求就只能排隊。
排太久,前面的代理層等不到,就出現 504。
愛立歐小提醒:
這種問題常見於沒有做流量控管的網站。
外部 API 回應卡死
現在很多網站都依賴第三方服務:
-
金流
-
物流
-
驗證 API
-
外部資料接口
如果第三方 API 變慢或沒有回應,而你的系統又沒有設計「降級機制」,整個請求就會被拖住。
結果不是 API 壞,而是你的網站跟著一起被拖垮。
這也是 504 的隱形地雷之一。
DNS 解析異常
有時候問題根本不在程式,而是在「找不到人」。
例如:
-
DNS 解析錯誤
-
TTL 設定不當
-
解析到舊 IP
-
跨區延遲過高
當代理層找不到正確的上游 IP,自然也等不到回應。
愛立歐小提醒:
這種問題常發生在搬主機或切流量時。
網路延遲或跨區問題
如果:
-
伺服器在國外
-
CDN 節點距離太遠
-
跨區傳輸延遲
-
封包丟失
都可能造成回應時間拉長。
愛立歐小提醒:
特別是多區架構或雲端跨區部署時,更要留意這點。
逾時(timeout)設定不一致
這是很多新手最容易忽略的問題。
假設:
-
CDN timeout 設 30 秒
-
Nginx 設 60 秒
-
App 設 90 秒
-
資料庫設 120 秒
那 30 秒就會先炸掉。
不是系統真的壞,而是前面等不及了。
愛立歐小提醒:
逾時值一定要「全鏈路對齊」,這是避免 504 的基本功。
504 怎麼排查?新手也能照做的分層定位流程
快速判斷:先區分哪一段超時
你可以把網站想成「接力賽」:
使用者的請求會一路從 邊緣層 → 應用層 → 資料層 → 外部依賴 跑完一圈,任何一段跑太慢,前面的人等不及,就回傳 504。
邊緣層(CDN / WAF / Nginx):先看「門口」是不是卡住
邊緣層就是最靠近使用者的那一層,通常包含 CDN、WAF、防火牆、反向代理(例如 Nginx)。
這層出問題的特徵是:
你甚至還沒打到後端,前面就先說「我等不到」了。
你可以先檢查:
-
查看 CDN 日誌 / 防火牆事件:是否被擋、是否回應逾時
-
檢查 proxy timeout 設定:例如 proxy_read_timeout、proxy_connect_timeout
-
確認邊緣節點是否負載過高:高峰期特別容易發生(尤其活動、廣告剛開跑時)
愛立歐小提醒:
如果你用 Cloudflare 這類 CDN,很多時候錯誤其實會先出現在 CDN 的日誌或事件紀錄裡,別直接跳去看資料庫,會白忙一場。
應用層(App Server):看「後端是不是忙到爆」
如果邊緣層沒問題,那下一步通常就是應用層(你的網站程式、API、後台服務)。
這層出問題的特徵是:
可以連到後端,但後端處理變超慢,慢到前面那層等不下去。
新手可以先看這三個重點:
-
APM 是否顯示 p95 / p99 延遲暴增?
代表大多數使用者還好,但「一部分請求」卡住(通常是某些功能或某些頁面特別慢) -
Thread pool 是否耗盡?
很多框架都有執行緒池,如果池子滿了,新請求只能排隊,排到超時就 504 -
GC 是否頻繁?(Java / JVM 特別常見)
GC 變頻繁常意味記憶體壓力大,會造成整體回應抖動、延遲突然飆高
如果你看到「延遲突然拉高 + 錯誤率增加」,通常就是應用層塞車了。
資料層(Database):最常被低估的「隱形拖油瓶」
很多 504 的根本原因,其實躲在資料庫裡。
資料庫一慢,後端就會等它,後端一等,反向代理就開始倒數計時,最後變成 504。
你要檢查的重點是:
-
是否出現慢查詢?(Slow Query Log)
-
是否鎖表?(Lock / Deadlock)
-
連線池是否滿載? 連線池滿載通常會讓請求「卡在等連線」,不是你程式壞,是你根本拿不到資料庫門票
愛立歐小提醒:
如果 504 只發生在「特定頁面/特定功能」,非常高機率是那條路徑的 SQL 查詢在拖時間。
外部依賴:第三方 API 一慢,你網站就跟著一起慢
現在很多網站都不是自己一個人跑完流程,還會依賴第三方服務:
-
金流
-
物流
-
簡訊 / 驗證
-
外部資料 API
外部依賴的問題是:
不是你能控制的,但你必須有能力「承受它變慢」。
你可以檢查:
-
第三方 API 是否延遲?(對照你自己的請求時間)
-
是否沒有設計 retry 或熔斷?
沒有保護機制時,一旦外部卡住,你的 thread / connection 也會跟著被卡住,最後拖垮整個系統
這也是很多網站高峰期爆 504 的原因:不是你流量太大,是「第三方剛好也在塞車」。
最小可行排障流程(SOP)
如果你希望「有一套照做就不會走偏」的流程,下面這套是實務上很常用的 504 排查 SOP。
先穩定服務(先止血,別硬扛)

當下最重要的是:先讓使用者不要一直撞牆。
你可以做的快速止血手段包括:
-
開啟快取頁面:讓熱門頁先用快取撐住
-
降級非關鍵功能:例如暫停推薦系統、關閉非必要 API 呼叫
-
切換到備援節點:如果有多台或多區,先切流量
-
擴容實例:短期先把 CPU/RAM/節點數撐起來
愛立歐小提醒:
止血不是作弊,是爭取時間。很多事故就是一開始沒止血,後面越修越炸。
看關鍵指標(用數據決定你要查哪裡)
新手最常犯的錯是「沒看數據就開始改設定」。
建議你先看這幾個指標,快速判斷瓶頸在哪:
-
p95 / p99 延遲(是不是突然暴增)
-
錯誤率(是特定路徑爆?還是全面爆)
-
連線數(有沒有爆量)
-
Queue 長度(請求是不是在排隊)
-
CPU / RAM 使用率(是不是滿載)
看到「延遲暴增 + Queue 變長」通常就代表後端塞車了。
查日誌順序(照順序,別跳著看)
建議順序:
CDN / Nginx → 應用程式 Trace → 資料庫慢查詢 Log
這個順序的好處是:你會先確認「請求到底卡在哪一段」,再往裡面鑽。
真的不要跳著看,會超浪費時間,還可能誤判唷。
對齊逾時值(很多 504 其實是「設定打架」)

504 常見地雷是 timeout 設定不一致,例如:
-
CDN timeout 60 秒
-
Nginx timeout 30 秒
-
App timeout 90 秒
結果會變成:
代理層 30 秒就先斷線 → 直接回 504
即使後端 40 秒其實就會成功回來,也來不及了。
所以你要記得:timeout 必須全鏈路對齊(CDN / 代理 / App / DB / 外部 API),才不會某一段先斷。
加保護機制(把「一次事故」變成「可控風險」)
要讓 504 不再一直找上門,最後一定要做保護機制:
-
重試(Retry + 指數退避):不要一秒狂打 10 次,會更炸
-
熔斷(Circuit Breaker):第三方掛了就先暫停呼叫,避免拖垮自己
-
隔離資源池:把「關鍵路徑」跟「非關鍵路徑」分開,不要互相拖累
這些才是把 504 從根本變少的關鍵。
504 元兇對照表:Nginx、App、DB、外部 API 該怎麼解
Nginx upstream 逾時
Nginx 是站在前線的「守門員」。
如果後端(upstream)回應太慢,Nginx 等到 timeout 就會直接回 504。
常見原因
-
proxy timeout 設太短
-
upstream 節點數量不足
-
後端伺服器卡住
-
沒設健康檢查導致流量打到壞節點
如何解決
調整 timeout 設定
proxy_read_timeout 120s;
keepalive_timeout 65;
愛立歐小提醒:
拉長 timeout 只是緩衝,不是根治。
增加 upstream 節點
如果只有一台 App Server,流量一大就爆。
增加 upstream 節點可以分流壓力。
加入健康檢查
壞掉的節點要自動被排除。
否則流量會一直打到已經卡死的後端。
App 卡 I/O 或 CPU
應用層最常見的問題是:
-
同步處理太多事情
-
I/O 阻塞
-
CPU 滿載
-
worker 不夠
當應用層塞車,前面那層自然就等到 timeout。
如何解決
非同步處理
把耗時操作改成 async,避免主流程被卡住。
批次化處理
不要一筆一筆慢慢跑。
例如報表或資料更新,可以改成批次排程。
壓縮回應
大型 JSON 回應沒壓縮會拖時間。
開啟 gzip 或 brotli 可以明顯改善。
增加 worker 數量
如果 CPU 還有空間,可以增加 worker。
但注意:
不要盲目增加,否則可能導致 context switch 變多,反而更慢。
DB 慢查詢
資料庫其實是很多 504 的「幕後黑手」。
常見狀況
-
沒有索引
-
一次撈太多資料
-
鎖表
-
連線池滿載
應用程式其實沒壞,只是在等資料庫。
如何解決
加索引
慢查詢幾乎都能從索引改善。
分頁查詢
不要一次 SELECT 幾十萬筆資料。
重寫 SQL
有時候只是 SQL 寫法太差,EXPLAIN 一下就知道。
調整連線池上限
如果連線池太小,新請求會卡在「等連線」。
但也不要設太大,會把 DB 壓垮。
外部 API 不穩
你依賴的第三方服務:
-
金流
-
物流
-
驗證
-
外部資料 API
一旦變慢,你的 thread 就會被拖住。
如果沒有保護機制,很容易整站一起爆 504。
如何解決
本地快取
常用資料先快取,不要每次都打 API。
回傳預設值(降級)
例如:
- 推薦清單拿不到 → 顯示熱門商品
- 第三方資料失敗 → 回傳預設內容
不要讓整頁因為一個 API 壞掉。
加入 retry + timeout
設合理 timeout,不要無限等。
Retry 要搭配「指數退避」,避免瞬間打爆對方。
封包追蹤網路延遲
用 traceroute / tcpdump 看看是不是網路路徑出問題。
DNS 或網路問題
有時候不是系統慢,是「找不到正確的人」。
例如:
-
DNS 解析錯誤
-
TTL 設太長
-
切主機後還在指向舊 IP
-
跨區延遲高
如何解決
檢查 TTL
切流量或搬主機前,TTL 要先調低。
檢查跨區延遲
跨區部署要確認節點延遲是否合理。
固定 upstream IP
避免 DNS 解析不穩定造成隨機 timeout。
切流量測試
用部分流量測試新節點,不要一次全切。
504 設定範例整理:Node.js、Java、Cloudflare 常用做法
這一段我們會用「可直接拿去用」的方式整理:
你不一定要懂所有細節,但你至少要知道:timeout、retry、fallback 這三個東西是避免 504 的基本功,而且要「全鏈路一致」才有效唷。
Node.js HTTP client(Axios):先把 timeout 設好,再談 retry
很多新手呼叫第三方 API 時,最常犯的錯是「不設 timeout」。
結果對方一慢,你的請求就一直卡著,卡到上游(Nginx / CDN)先斷線,最後變成 504。
設定 timeout(必要)
axios.get(url, {
timeout: 5000
})
-
timeout: 5000 代表 5 秒沒回應就放棄
-
不要讓請求「無限等待」,無限等待就是 504 的溫床
愛立歐小提醒:
timeout 不是越長越好,重點是「合理」,並搭配 fallback 或快取。
加入 retry 機制(建議)
axiosRetry(axios, { retries: 3 });
這代表:失敗時最多重試 3 次。
但要注意喔:retry 不是狂按重送,否則第三方本來只是慢,你會把它打到更慢。
更安全的做法是:
-
重試要加「間隔」
-
最好用「指數退避」(越重試越拉長間隔)
-
只針對「可重試」錯誤(例如網路抖動)重試
Java 連線池設定:避免「連線等不到」造成整串逾時
Java 專案常見的 504 問題,除了程式本身慢,還有一個很常被忽略的原因:
連線池用光了
你想像成餐廳座位:
座位(connection)滿了,客人(request)只能排隊,排到最後就超時。
連線池三個必看設定
-
maxPoolSize:最大連線數
設太小會排隊,設太大會把 DB / 外部服務壓垮 -
idleTimeout:閒置多久回收連線
避免長時間不用的連線佔著位置,造成浪費 -
fallback 機制:真的連不上時要怎麼回應
例如回傳快取、預設值或提示稍後再試
愛立歐小提醒:
Java 的連線池調整要搭配監控看「等待連線時間」與「連線使用率」,不然很容易越調越亂。
Cloudflare:先確認 Edge timeout 上限,再排除 WAF 與快取規則
如果你網站前面有用 Cloudflare(或其他 CDN),那 504 很可能不是你主機直接回的,而是 Edge(邊緣節點)等不到你後端。
檢查 Edge timeout 上限
每家 CDN 對「邊緣等待時間」都有上限。
如果你的後端回應時間超過上限,就算後端最後會成功,CDN 也會先回 504。
所以你要做的不是只拉長後端 timeout,而是:
-
確認 Cloudflare 的等待上限
-
優化後端回應速度(快取、查詢優化、拆解耗時任務)
-
必要時改成非同步流程(例如先回「已收到」再背景處理)
檢查是否被 WAF 擋住
有時候你看到的像 504,但實際是:
-
WAF 規則誤判
-
Bot 防護擋到正常流量
-
特定國家/ASN 被封
建議你看:
-
Cloudflare Security Events
-
Firewall/WAF logs
確認是不是被攔截或挑戰(challenge)造成請求延遲。
測試 bypass cache(排除快取規則干擾)
如果你懷疑快取規則、頁面規則或特定路徑的設定有問題,可以先做「旁路測試」:
-
暫時對該路徑關閉快取或改規則
-
測試是否仍會 504
-
釐清是「快取層」問題,還是「後端回應」問題
504 常見問題 FAQ:你最常卡住的點,這裡一次解答
504 Gateway Timeout 是什麼意思?
504 是一種 HTTP 狀態碼,代表「閘道(Gateway)等不到上游伺服器(upstream server)回應」。
白話來說就是:
中間那層(CDN / Nginx)在等後端,但後端太慢或沒回應,時間到了就回傳 504。
通常不是使用者網路問題,而是伺服器端或架構問題。
504 是不是代表主機壞掉了?
不一定。
504 多半代表:
-
主機太忙
-
資料庫太慢
-
外部 API 卡住
-
Timeout 設定不一致
很多時候只是流量暴增或某個查詢變慢,不是整台主機掛掉。
臨時出現 504,我可以怎麼快速處理?
優先順序建議這樣做:
-
1. 先開啟快取頁面
-
2. 降級非關鍵功能
-
3. 切換到備援節點
-
4. 臨時擴容主機
先止血,再慢慢排查,不要一開始就亂改設定。
為什麼 504 常在流量高峰出現?
因為高峰時:
-
CPU / 記憶體吃滿
-
Thread pool 耗盡
-
連線池爆滿
-
第三方 API 同時塞車
平時看不出來的效能瓶頸,在高峰就會被放大。
這也是為什麼壓力測試很重要。
504 只在特定頁面發生,該怎麼查?
通常是該頁面:
-
SQL 查詢特別慢
-
呼叫特定外部 API
-
Feature Flag 差異
-
某次部署版本改動
建議:
-
用 Trace ID 鎖定該路徑
-
對照慢查詢 log
-
檢查該路徑依賴的服務
504 會影響 SEO 嗎?
會,而且影響很大。
如果 Google 爬蟲多次遇到 504:
-
網頁可能暫時被降權
-
索引會減少
-
排名下滑
搜尋引擎會認為網站不穩定。
穩定性其實就是 SEO 的基礎分數。

504要怎麼從根本避免?
記住這幾個原則:
-
全鏈路 timeout 對齊
-
高峰前壓測與快取預熱
-
慢查詢優化
-
外部 API 加保護機制
-
監控 p95 / p99 延遲
-
事後檢討
504 不是偶發 bug,而是架構健康度的警訊。
遇到 504 Gateway Timeout:
第一步,穩定服務
第二步,用數據定位瓶頸
第三步,從架構與設定消除根因
不要只改 timeout,那只是延後爆炸時間而已。
如果你發現 504 一直反覆發生,很可能是網站架構、伺服器配置或效能設計本身就有問題。
這時候,找專業團隊協助會更有效率。
如果你希望:
-
幫你的團隊建立 504 排障 SOP
-
客製 Nginx / Node / Java 設定範例
-
優化網站架構避免高峰炸裂
-
提升整體網站穩定度與 SEO 表現
可以直接聯繫 愛立歐網路。
我們專注於高穩定網站架構與效能優化的網頁設計服務,協助企業打造能撐住流量高峰的網站。
👉 現在就預約 愛立歐網頁設計 諮詢,讓網站穩定成為你的競爭優勢。
