HTTP 502 狀態碼 (無效的閘道) - Amazon CloudFront

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

HTTP 502 狀態碼 (無效的閘道)

當 CloudFront 因為無法連線至原始伺服器而無法提供請求的物件時,CloudFront 會傳回 HTTP 502 狀態碼 (無效的閘道)。

如果您使用的是 Lambda@Edge,問題可能是 Lambda 驗證錯誤。如果您收到包含NonS3OriginDnsError錯誤碼的 HTTP 502 錯誤,可能會出現 DNS 組態問題,導致 CloudFront 無法連線至原始伺服器。

CloudFront 與自訂原始伺服器間的 SSL/TLS 溝通失敗

如果您使用在 CloudFront 和原始伺服器之間需要 HTTPS 的自訂原始伺服器,不相符的網域名稱可能會導致錯誤。原始伺服器的 SSL/TLS 憑證必須包含符合您為 CloudFront 分佈指定的原始網域或原始請求標頭Host的網域名稱。

如果網域名稱不符合,則 SSL/TLS 的交握便失敗,且 CloudFront 會傳回 HTTP 狀態碼 502 (無效的閘道) 給檢視器,並將 X-Cache 標頭設定成 Error from cloudfront

若要判斷憑證中的網域名稱是否符合分佈或Host標頭中的原始網域,您可以使用線上 SSL 檢查程式或 OpenSSL。如果網域名稱不相符,您有兩個選項:

  • 取得包括適用的網域名稱的新 SSL/TLS 憑證。

    如果您使用 AWS Certificate Manager (ACM),請參閱AWS Certificate Manager 《 使用者指南》中的請求公有憑證以請求新的憑證。

  • 變更分佈組態,因此 CloudFront 不再嘗試使用 SSL 與您的原始伺服器連線。

線上 SSL 檢查

若要尋找 SSL 測試工具,請搜尋網際網路「線上 ssl 檢查。」 通常需要指定網域名稱,且此工具會傳回有關 SSL/TLS 憑證的各種資訊。確認憑證在 Common Name (通用名稱)Subject Alternative Names (主體別名) 欄位中包含您的網域名稱。

OpenSSL

若要協助故障診斷來自 CloudFront 的 HTTP 502 錯誤,您可以使用 OpenSSL 嘗試與原始伺服器建立 SSL/TLS 連線。如果 OpenSSL 無法建立連線,可能表示原始伺服器的 SSL/TLS 組態發生問題。如果 OpenSSL 能夠建立連線,它會傳回原始伺服器憑證的相關資訊,包括憑證的通用名稱 (Subject CN 欄位) 和主體別名 (Subject Alternative Name 欄位)。

使用下列 OpenSSL 命令來測試與原始伺服器的連線 (以原始伺服器的網域名稱取代原始伺服器網域,例如 example.com):

openssl s_client -connect origin domain name:443

如果下列為真:

  • 原始伺服器支援有多個 SSL/TLS 憑證的多個網域名稱

  • 您的分佈設定為將 Host 標頭轉送至原始伺服器

然後將 -servername 選項新增至 OpenSSL 命令,如下列範例所示 (將 CNAME 取代為您的分佈中設定的 CNAME):

openssl s_client -connect origin domain name:443 -servername CNAME

原始伺服器無法回應受支援的加密/通訊協定

CloudFront 使用密碼加密和通訊協定連線至原始伺服器。如需 CloudFront 支援的密碼加密和通訊協定清單,請參閱 CloudFront 和原始伺服器之間支援的通訊協定和密碼。如果原始伺服器在 SSL/TLS 交換中不回應這些密碼加密或通訊協定的其中之ㄧ,則 CloudFront 連線失敗。您可以使用如 SSL Labs (SSL 實驗室) 等線上工具來驗證原始伺服器是否支援密碼加密和通訊協定。在 Hostname (主機名稱) 欄位中輸入原始伺服器的網域名稱,然後選擇 Submit (提交)。從測試來檢閱 Common names (通用名稱)Alternative names (替代名稱) 欄位,查看它們是否符合原始伺服器的網域名稱。測試完成後,在測試結果中找到 Protocols (通訊協定)Cipher Suites (密碼套件) 區段,查看原始伺服器支援哪些密碼加密或通訊協定。將其與 CloudFront 和原始伺服器之間支援的通訊協定和密碼 的清單進行比較。

原始伺服器的 SSL/TLS 憑證已過期、無效、已自我簽署,或憑證鏈順序錯誤

如果原始伺服器傳回以下內容時,則 CloudFront 失去 TCP 連線,傳回 HTTP 狀態碼 502 (無效的閘道),且將 X-Cache 標頭設定為 Error from cloudfront

  • 過期的憑證

  • 無效的憑證

  • 已自我簽署的憑證

  • 憑證鏈順序錯誤

注意

若完整的憑證鏈結 (包含中繼憑證) 不存在,CloudFront 便會卸除 TCP 連線。

如需有關在自訂原始伺服器上安裝 SSL/TLS 憑證的詳細資訊,請參閱 需要 HTTPS 才能在 CloudFront 與您的自訂原始伺服器之間進行通訊

在原始伺服器設定中原始伺服器無法回應指定的連接埠

當您在 CloudFront 分佈上建立原始伺服器時,可以設定 CloudFront 用於連線至原始伺服器以傳送 HTTP 和 HTTPS 流量的連接埠。根據預設,這些都是 TCP 80/443。您可以選擇修改這些連接埠。如果原始伺服器為了任何原因拒絕這些連接埠上的流量,或者如果後端伺服器沒有回應連接埠,則 CloudFront 連線失敗。

若要故障診斷這些問題,請檢查基礎設施中執行的任何防火牆和驗證它們不會封鎖受支援的 IP 範圍。如需詳細資訊,請參閱《Amazon VPC 使用者指南》中的 AWS IP 地址範圍。此外,驗證 Web 伺服器是否可在原始伺服器上執行。

Lambda 驗證錯誤

如果您使用 Lambda@Edge,HTTP 502 狀態碼可能表示您的 Lambda 函數回應的格式不正確或包含無效的內容。如需針對 Lambda@Edge 錯誤進行故障診斷的詳細資訊,請參閱測試和偵錯 Lambda@Edge 函數

CloudFront 函數驗證錯誤

如果您使用的是 CloudFront 函數,HTTP 502 狀態碼可以表示 CloudFront 函數正在嘗試新增、刪除或變更唯讀標頭。此錯誤不會在測試期間顯示,但會在您部署函數並執行請求後顯示。若要解決此錯誤,請檢查並更新您的 CloudFront 函數。如需詳細資訊,請參閱更新 函數

DNS 錯誤 (NonS3OriginDnsError)

具有 NonS3OriginDnsError 錯誤碼的 HTTP 502 錯誤表示存在 DNS 組態問題,導致 CloudFront 無法連線到原始伺服器。如果您從 CloudFront 收到此錯誤訊息,請確定原始伺服器的 DNS 組態正確且正常運作。

當 CloudFront 收到逾期或不在快取中的物件請求,會向原始伺服器發出請求以取得物件。為了成功請求原始伺服器,CloudFront 會對原始網域執行 DNS 解析。您網域的 DNS 服務遇到問題時,CloudFront 無法解決網域名稱以取得 IP 地址,導致 502 錯誤 (NonS3OriginDnsError)。若要修正此問題,請聯絡您的 DNS 供應商,或者如果您使用 Amazon Route 53,請參閱為什麼我無法存取使用 Route 53 DNS 服務的網站?

若要進一步疑難排解此問題,請確保原始伺服器根網域的 authoritative name servers (授權名稱伺服器) 或 Zone Apex (例如 example.com) 正確運作。您可以使用以下命令來尋找適用於 apex 原始伺服器的名稱,使用 dignslookup 等工具:

dig OriginAPEXDomainName NS +short
nslookup -query=NS OriginAPEXDomainName

當您有名稱伺服器的名稱時,請使用下列命令針對他們的原始伺服器的網域名稱做查詢,以確保每個回應都有一個答案:

dig OriginDomainName @NameServer
nslookup OriginDomainName NameServer
重要

請務必使用連線至公用網際網路的電腦執行此 DNS 疑難排解。CloudFront 會使用網際網路上的公有 DNS 解析原始網域,因此在類似的內容中進行疑難排解非常重要。

如果您的原始網域是一個子網域,其 DNS 授權委派給與根網域不同的名稱伺服器,請確定該子網域的名稱伺服器 (NS) 和授權開始 (SOA) 記錄已正確設定。您可以使用類似上述範例的命令來檢查這些記錄。

如需 DNS 的詳細資訊,請參閱 Amazon Route 53 說明文件中的網域名稱系統 (DNS) 概念

Application Load Balancer 原始伺服器 502 錯誤

如果您使用 Application Load Balancer 做為原始伺服器並收到 502 錯誤,請參閱如何疑難排解 Application Load Balancer HTTP 502 錯誤?

API Gateway 原始伺服器 502 錯誤

如果您使用 API Gateway 並收到 502 錯誤,請參閱如何透過 Lambda 代理整合從 API Gateway REST APIs解決 HTTP 502 錯誤?