該如何透過 Classic Load Balancer 發出請求時收到的 HTTP 502 錯誤進行疑難排解?
上次更新日期:2022 年 8 月 29 日
在我的用戶端透過 Classic Load Balancer (CLB) 向網站發出請求時,我看到 HTTP 502 錯誤。如何對此進行疑難排解?
簡短描述
HTTP 502 (錯誤閘道) 錯誤可能由下列其中一種原因導致:
- 在 EC2 執行個體上執行的 Web 伺服器或關聯的後端應用程式伺服器傳回一則訊息,而 Classic Load Balancer 無法剖析。
- Web 伺服器或關聯的後端應用程式伺服器傳回自己的 502 錯誤訊息。
若要找到這些 502 錯誤的來源,請執行下列動作:
- 在 Classic Load Balancer 上開啟 Elastic Load Balancing (ELB) 存取日誌,以查看各個請求的後端和 ELB 回應代碼。存取日誌項目包含兩個欄位:elb_status_code 和 backend_status_code。使用這些代碼確定 502 錯誤的來源。
- 檢視負載平衡器 Amazon CloudWatch 指標,以了解 HTTPCode_Backend_5XX 指標下顯示的後端產生的 502 錯誤。ELB 產生的 502 錯誤顯示在 HTTPCode_ELB_5XX 指標下。
如果後端回應是 ELB 502 錯誤的來源,則問題可能是由下列原因造成的:
- 回應的各個標頭間包含多個 CRLF。
- 回應包含一個含有非整數的內容長度標頭。
- 回應主體中的位元組數超過內容長度標頭值。
如果 502 錯誤由後端伺服器產生,請聯絡您的應用程式擁有者。如果 502 錯誤由 Classic Load Balancer 產生,則來自後端的 HTTP 回應格式不正確。請依照下列步驟對 ELB 產生的 502 錯誤進行疑難排解:
解決方案
1. 檢查後端應用程式傳回的回應主體是否符合 HTTP 規格。請參閱 RFC 編輯器中的以下文件:
RFC 7230 – HTTP/1.1:訊息語法和路由
RFC 7231 – HTTP/1.1:語義和內容
RFC 7232 – HTTP/1.1:條件請求
RFC 7233 – HTTP/1.1:範圍請求
RFC 7234 – HTTP/1.1:快取
RFC 7235 – HTTP/1.1:身分驗證
2. 確認回應標頭的語法正確無誤:一個金鑰和值,例如 Content-Type:text。確保 HTTP 回應標頭中不缺少內容長度或傳輸編碼。如需有關 Web 伺服器 HTTP 標頭欄位的詳細資訊,請參閱 HTTP 標頭欄位中的 Internet Assigned Numbers Authority 文件。執行類似下列命令的命令以檢查傳回的 HTTP 回應:
curl -vko /dev/null server_instance_IP
3. 檢查 ELB 存取日誌是否存在重複的 HTTP 502 錯誤。elb_status_code 和 backend_status_code 的 502 錯誤都表示一或多個 Web 伺服器執行個體存在問題。識別哪個 Web 伺服器執行個體存在問題,然後檢查後端 Web 伺服器執行個體的 Web 伺服器日誌。請查看下列適用於部分常用 Web 伺服器和作業系統的日誌位置:
Apache 日誌
- CentOS、RHEL、Fedora 和 Amazon Linux 的 Web 伺服器日誌位於 /var/log/httpd/ 目錄下。
- Debian 和 Ubuntu Linux 的 Web 伺服器日誌位於 /var/log/apache2 和 /var/log/lighthttpd/ 目錄下。
NGINX 日誌
- 在 nginx.conf 檔案中定義 NGINX 存取日誌位置:access_log /path/to/access.log
- 預設位置為 /var/log/nginx/access.log
IIS 日誌
Windows IIS 7、IIS 7.5 和 IIS 8.0 的 Web 伺服器日誌存放在 inetpub\logs\Logfiles 目錄中。如需有關 Internet Information Server (IIS) 日誌的詳細資訊,請參閱 IIS 7.0 和更新版本中的 HTTP 狀態碼的 Microsoft 文件。如果您已確認 502 錯誤由 ELB 產生,而且後端回應符合 RFC 慣例,請聯絡 AWS Support。