如何對使用 Classic Load Balancer 時傳回的 504 錯誤進行疑難排解?

2 分的閱讀內容
0

我在 Classic Load Balancer 存取日誌、Amazon CloudWatch 指標中或透過 Classic Load Balancer 連接至我的服務時看到 HTTP 504 錯誤。

解決方案

HTTP 504 錯誤是一個 HTTP 狀態碼,指出閘道或 proxy 已逾時。進行疑難排解時,請調查以下事項:

檢查負載平衡器的閒置逾時,然後根據需要進行修改

HTTP 504 錯誤的最常見原因是相應的執行個體在設定的閒置逾時內未回應請求。依預設,Classic Load Balancer 的閒置逾時為 60 秒。

如果已開啟 CloudWatch 指標,請檢查負載平衡器的 CloudWatch 指標。當延遲資料點等於您設定的負載平衡器逾時值,且 HTTPCode_ELB_5XX 具有資料點時,至少有一個請求已逾時。

若要解決此問題,您可以執行以下兩項操作之一:

  • 修改負載平衡器的閒置逾時,讓 HTTP 請求在閒置逾時期間內完成。
  • 調整應用程式以更快速地回應。

確保後端執行個體保持連線開啟

當後端執行個體在到達其閒置逾時值之前關閉與負載平衡器的 TCP 連線時,可能會顯示 HTTP 504 錯誤。

若要解決此問題,請在後端執行個體上啟用保持連線設定,然後將保持連線逾時設定為大於負載平衡器閒置逾時的值。

(僅適用於 Apache) 關閉 TCP_DEFER_ACCEPT

當 Apache 後端執行個體啟用 TCP_DEFER_ACCEPT 時,負載平衡器會透過將 SYN 傳送至後端執行個體來啟動連線。然後,後端執行個體會使用 SYN-ACK 進行回應,且負載平衡器會向後端執行個體傳送空的 ACK

因為最後一個 ACK 是空的,因此後端不接受 ACK,而是將 SYN-ACK 重新傳送給負載平衡器。這可能會導致後續的 SYN 重試逾時。如果在後端執行個體關閉連線之前未傳送 FINRST,則負載平衡器會認為連線已建立,但事實並非如此。然後,當負載平衡器透過此 TCP 連線傳送請求時,後端會使用 RST 進行回應,從而產生 504 錯誤。

若要解決此問題,請將 AcceptFilter httpAcceptFilter https 設定為 none

(僅適用於 Apache) 關閉 event MPM,並以最佳方式設定 prefork 和 worker MPM

最佳實務是關閉註冊至負載平衡器的後端執行個體上的 event MPM。由於 Apache 後端會動態關閉連線,因此這些關閉的連線可能會導致 HTTP 504 錯誤。

若要在使用 preforkworker MPM 時取得最佳效能,並假設負載平衡器設定 60 秒的閒置逾時,請使用下列值:

mod_prefork MPMmod_worker MPM
Timeout6565
KeepAliveTimeout6565
KeepAliveOnOn
MaxKeepAliveRequests100000
AcceptFilter httpnonenone
AcceptFilter httpsnonenone

相關資訊

監控 Classic Load Balancer

對 Classic Load Balancer 進行疑難排解: HTTP 錯誤

使用 Apache 或 NGINX 作為 ELB 的後端伺服器的最佳設定是什麼?

AWS 官方
AWS 官方已更新 2 年前