我在 Application Load Balancer 存取記錄、Amazon CloudWatch 指標或透過 Application Load Balancer 連線至我的服務時發現 HTTP 504 錯誤。我要如何修正此問題?
簡短描述
HTTP 504 錯誤是指示閘道或 Proxy 已逾時的 HTTP 狀態代碼。
若出現以下情況,可能會發生 Application Load Balancer HTTP 504 錯誤:
- 在連線逾時 (10 秒) 之前,負載平衡器未能建立與目標的連線。
- 負載平衡器建立了與目標的連線,但目標在閒置逾時期限過去之前未回應。
- 子網路的網路 ACL 不允許從目標到臨時連接埠 (1024-65535) 上的負載平衡器節點的流量。
- 目標傳回大於實體主體的「內容長度」標頭值。負載平衡器等待遺失的位元組逾時。
- 目標是 AWS Lambda 函數,該服務在連線逾時過期之前未回應。
解決方案
檢查您的負載平衡器是否閒置逾時,並根據需要進行修改
如果後端執行個體在設定的閒置逾時期限內未回應請求,則可能會發生負載平衡器 HTTP 504 錯誤。預設情況下,Application Load Balancer 的閒置逾時為 60 秒。
如果啟用了 CloudWatch 指標,請檢查 Application Load Balancer 的 CloudWatch 指標。HTTPCODE_ELB_5XX 指標指示 504 錯誤源於負載平衡器。如果沒有任何 HTTPCode_ELB_504_count 指標資料點,則應用程式伺服器 (而不是負載平衡器) 會傳回 504 錯誤。
檢查 CloudWatch 指標 TargetResponseTime 的最大值和平均值。逾時值可能表示從目標接收負載平衡器請求後所用的時間。
若要解決此問題:
修改負載平衡器的閒置逾時,以便 HTTP 請求可在閒置逾時期限內完成。
修改應用程式以更快地回應 HTTP 請求。請確認應用程式的回應時間不會超過設定的閒置逾時。
(可選) 在後端 Web 伺服器應用程式日誌上新增以下自訂篩選條件,以協助確定回應時間緩慢的原因:
Apache Web 伺服器
a- Apache : %D in log format
Nginx Web 伺服器
b- Nginx: $request_time and $upstream_response_timein log format
IIS Web 伺服器
c- IIS: “time-taken” in log format
Apache Tomca Web 伺服器
d- Apache Tomcat Access logs: %D in log format
請確認您的負載平衡器允許具有已註冊目標的流量
驗證與負載平衡器和後端目標關聯的網路安全群組是否允許流量和運作狀態檢查連接埠上的雙向流量。請確認子網路的網路 ACL 允許從目標到臨時連接埠 (1024-65535) 上的負載平衡器節點的流量。
**注意:**最佳實務是使用以下適用於 Application Load Balancer 的安全群組規則。
如果您檢閱 CloudWatch 指標 TargetConnectionErrorCount 的統計數字加總,則可能會看到正資料點。例如,負載平衡器和目標之間未成功建立的連線數。
如需詳細資訊,請參閲使用主控台設定閒置逾時。
請確認您的 Lambda 函數會在連線逾時到期之前回應
如果您的目標是 Lambda 函數,請使用最大統計數字檢查效能指標持續時間,以驗證事件處理的時間量。如需詳細資訊,請參閲運用效能指標。
相關資訊
HTTP 504:閘道逾時
如何對 Application Load Balancer 的高延遲進行疑難排解?
如何對在 Application Load Balancer 設定身分驗證的問題進行疑難排解?
如何對使用 Classic Load Balancer 時傳回的 504 錯誤進行疑難排解?