跳至內容

如何對 Application Load Balancer HTTP 502 錯誤進行疑難排解?

2 分的閱讀內容
0

我想使​​用 Amazon CloudWatch 指標和存取日誌,對我在使用 Application Load Balancer 時收到的 HTTP 502 "Bad gateway" 錯誤進行疑難排解。

解決方法

確定 HTTP 502 錯誤的來源

HTTP 502: Bad gateway 錯誤。錯誤的來源可能是您的目標或您的負載平衡器。若要確定錯誤來源,請使用 CloudWatch 指標存取日誌

使用 CloudWatch 指標

如果 HTTPCode_ELB_502_Count 指標有資料點,則錯誤來源就是您的負載平衡器。如果 HTTP Code_target_ 5xx\Count 指標有資料點,則錯誤來源就是您的目標。

使用存取日誌

如果 elb_status_code 為 "502",且 target_status_code 為 "-",則錯誤來源就是您的負載平衡器。如果 elb_status_code 為 "502",且 target_status_code 為 "502",則錯誤來源就是您的目標。

對 HTTP 502 錯誤進行疑難排解

若要確定原因,請根據 **elb_status_code = **** 和 **target_status_code"502" 篩選存取日誌。然後,完成您所遇到問題的解決方案。

當負載平衡器嘗試建立連線時,負載平衡器會從目標收到 TCP RST

建立連線時,您可能會收到來自目標的 TCP RST 訊息。當負載平衡器無法與目標建立 TCP 3 向信號交換時,就會出現此訊息。因此,負載平衡器無法將使用者請求轉送到目標。

檢查 TargetConnectionErrorCount 指標中的資料點,這些資料點顯示目標正在使用 TCP RST 拒絕來自負載平衡器的連線。

在存取日誌中,將 request_processing_timetarget_processing_timeresponse_processing_time 欄位設為 -1 值。當您將該值設為 -1 時,負載平衡器無法將請求傳送到目標,因為您必須連接負載平衡器。

以下是將 request_processing_timetarget_processing_timeresponse_processing_time 設定為 -1 的存取日誌項目的範例:

http 2022-04-15T16:52:50.757968Z app/my-loadbalancer/50dc6c495c0c9188 192.168.131.39:2817 10.0.0.1:80 -1 -1 -1 502 - 86 155 "GET http://example.com:80/ HTTP/1.1" "curl/7.51.0" - - arn:aws:elasticloadbalancing:us-east-1:123456789012:targetgroup/my-targets/73e2d6bc24d8a067" Root=1-58337262-36d228ad5d99923122bbe354"

**當負載平衡器嘗試連線時,它會從目標收到未預期的回應,例如 **"ICMP Destination unreachable (Host unreachable)"

將存取日誌中的 request_processing_timetarget_processing_timeresponse_processing_time 欄位設為 -1 值。然後,確認負載平衡器子網路允許流量到達目標連接埠上的目標。

當負載平衡器對目標有未處理的請求時,目標將使用 TCP RST 或 TCP FIN 訊息關閉連線

負載平衡器會接收請求,並將請求轉送至目標。目標開始處理請求,但過早關閉與負載平衡器的連線。當您在目標上設定的保持連線逾時持續時間小於負載平衡器的閒置逾時值時,就會發生這種情況。請確定保持連線逾時的持續時間大於閒置逾時值

目標回應格式錯誤或包含無效的 HTTP 標頭

若要對目標回應進行疑難排解,請在問題發生的時間範圍內對目標執行封包擷取。

若要對 Linux 執行封包擷取,請執行下列命令:

sudo tcpdump -i any -w filename.pcap

重要: 如果目標執行個體有大量流量,則 tcpdump 集合產生的封包擷取 (PCAP) 檔案可能會影響您的磁碟空間。大量的流量也會影響目標執行個體的服務。

對於 Windows,請從 Wireshark 網站下載並使用 Wireshark 應用程式

若要使用 tcpdump 測試封包擷取樣本,請參閱如何透過網際網路閘道,對 Amazon Virtual Private Cloud (Amazon VPC) 中的 Amazon Elastic Compute Cloud (Amazon EC2) Linux 或 Windows 執行個體與內部部署主機之間的網路效能問題進行疑難排解?

負載平衡器在連接到目標時遇到 SSL 信號交換錯誤

從負載平衡器到目標的 HTTPS 接聽程式的 TCP 連線成功,但後續的 SSL 信號交換遇到錯誤。因此,負載平衡器無法將請求轉送到目標。

如果目標群組使用 HTTPS 協議,則在問題發生的時間範圍內對目標執行封包擷取。

您的伺服器必須使用負載平衡器用於後端連線的安全性政策支援的 TLS 密碼套件。

已取消註冊目標管理之請求的取消註冊延遲期

在您的 AWS CloudTrail 事件中,檢查問題發生時間範圍內的 DeregisterTargets API 動作。如果目標過早取消註冊,則會發生 HTTP 502 錯誤。為了解決該問題,請增加取消註冊延遲時間,以便能夠完成較長的作業。

當目標為 Lambda 函數時,檢查 HTTP 502 錯誤

對於 AWS Lambda 函數失敗的請求,請檢查負載平衡器存取日誌的 error_reason 欄位中的 Lambda 錯誤原因代碼

目標是 Lambda 函數,且回應內文超過 1 MB

若要確認問題,請檢查 LambdaUserError 指標是否有資料點。或者,檢查負載平衡器存取日誌中的 error_reason 欄位是否設定為 LambdaResponseTooLarge

若要解決該問題,請更新您的 Lambda 程式碼,並新增錯誤處理邏輯。

目標是 Lambda 函數,在設定的逾時之前未回應

若要確認問題,請檢查 LambdaUserError 指標是否有資料點。或者,檢查負載平衡器存取日誌中的 error_reason 欄位是否設定為 LambdaUnhandled

目標是傳回錯誤的 Lambda 函數,或 Lambda 限流了該函數

若要確認 Lambda 是否限流了該函數,請檢查資料點的 Throttles 指標。如果 Lambda 限制了該函數,則使用 AWS Service Quotas 請求增加 Lambda 並行執行的配額

如需詳細資訊,請參閱了解 Lambda 調用限流限制