

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

# HTTP 502 狀態碼 (無效的閘道)
<a name="http-502-bad-gateway"></a>

HTTP 502 狀態碼 (無效的閘道) 表示 CloudFront 無法為請求的物件提供服務，因為它無法連接到原始伺服器。

如果您使用的是 Lambda@Edge，問題可能出自 Lambda 驗證錯誤。如果收到 `NonS3OriginDnsError` 錯誤碼的 HTTP 502 錯誤，表示存在 DNS 組態問題，導致 CloudFront 無法連線到原始伺服器。

**Topics**
+ [CloudFront 與自訂原始伺服器間的 SSL/TLS 溝通失敗](#ssl-negotitation-failure)
+ [原始伺服器無法回應受支援的加密/通訊協定](#origin-not-responding-with-supported-ciphers-protocols)
+ [原始伺服器的 SSL/TLS 憑證已過期、無效、已自我簽署，或憑證鏈順序錯誤](#ssl-certificate-expired)
+ [在原始伺服器設定中原始伺服器無法回應指定的連接埠](#origin-not-responding-on-specified-ports)
+ [Lambda 驗證錯誤](#http-502-lambda-validation-error)
+ [CloudFront 函數驗證錯誤](#http-502-cloudfront-function-validation-error)
+ [DNS 錯誤 (`NonS3OriginDnsError`)](#http-502-dns-error)
+ [Application Load Balancer 原始伺服器 502 錯誤](#cloudfront-alb-502-error)
+ [API Gateway 原始伺服器 502 錯誤](#cloudfront-api-gateway-502-error)

## CloudFront 與自訂原始伺服器間的 SSL/TLS 溝通失敗
<a name="ssl-negotitation-failure"></a>

如果您使用的自訂原始伺服器需要在 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 *[《 使用者指南》中的請求公有憑證](https://docs.aws.amazon.com/acm/latest/userguide/gs-acm-request-public.html)以請求新的憑證。
+ 變更分佈組態，因此 CloudFront 不再嘗試使用 SSL 與您的原始伺服器連線。

### 線上 SSL 檢查
<a name="troubleshooting-ssl-negotiation-failure-online-ssl-checker"></a>

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

### OpenSSL
<a name="troubleshooting-ssl-negotiation-failure-openssl"></a>

若要協助故障診斷來自 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`

## 原始伺服器無法回應受支援的加密/通訊協定
<a name="origin-not-responding-with-supported-ciphers-protocols"></a>

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

## 原始伺服器的 SSL/TLS 憑證已過期、無效、已自我簽署，或憑證鏈順序錯誤
<a name="ssl-certificate-expired"></a>

如果原始伺服器傳回以下內容時，則 CloudFront 失去 TCP 連線，傳回 HTTP 狀態碼 502 (無效的閘道)，且將 `X-Cache` 標頭設定為 `Error from cloudfront`：
+ 過期的憑證
+ 無效的憑證
+ 已自我簽署的憑證
+ 憑證鏈順序錯誤

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

如需有關在自訂原始伺服器上安裝 SSL/TLS 憑證的詳細資訊，請參閱 [要求 CloudFront 與自訂原始伺服器之間的通訊使用 HTTPS](using-https-cloudfront-to-custom-origin.md)。

## 在原始伺服器設定中原始伺服器無法回應指定的連接埠
<a name="origin-not-responding-on-specified-ports"></a>

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

若要故障診斷這些問題，請檢查基礎設施中執行的任何防火牆和驗證它們不會封鎖受支援的 IP 範圍。如需詳細資訊，請參閱《*Amazon VPC 使用者指南*》中的 [AWS IP 位址範圍](https://docs.aws.amazon.com/vpc/latest/userguide/aws-ip-ranges.html)。此外，驗證 Web 伺服器是否可在原始伺服器上執行。

## Lambda 驗證錯誤
<a name="http-502-lambda-validation-error"></a>

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

## CloudFront 函數驗證錯誤
<a name="http-502-cloudfront-function-validation-error"></a>

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

## DNS 錯誤 (`NonS3OriginDnsError`)
<a name="http-502-dns-error"></a>

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

當 CloudFront 收到逾期或不在快取中的物件請求，會向原始伺服器發出請求以取得物件。若要成功向原始伺服器發出請求，則 CloudFront 在原始伺服器網域上執行 DNS 解決方案。您網域的 DNS 服務遇到問題時，CloudFront 無法解決網域名稱以取得 IP 位址，導致 502 錯誤 (`NonS3OriginDnsError`)。若要修正此問題，請聯絡您的 DNS 供應商，或者如果您使用 Amazon Route 53，請參閱[為什麼我無法存取使用 Route 53 DNS 服務的網站？](https://aws.amazon.com/premiumsupport/knowledge-center/route-53-dns-website-unreachable/)

若要進一步疑難排解此問題，請確保原始伺服器根網域的 [authoritative name servers](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/route-53-concepts.html#route-53-concepts-authoritative-name-server) (授權名稱伺服器) 或 Zone Apex (例如 `example.com`) 正確運作。您可以使用以下命令來尋找適用於 apex 原始伺服器的名稱，使用 [dig](https://en.wikipedia.org/wiki/Dig_(command)) 或 [nslookup](https://en.wikipedia.org/wiki/Nslookup) 等工具：

```
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) 概念](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/route-53-concepts.html#route-53-concepts-domain-name-system-dns)。

## Application Load Balancer 原始伺服器 502 錯誤
<a name="cloudfront-alb-502-error"></a>

如果您使用 Application Load Balancer 做為原始伺服器並收到 502 錯誤，請參閱「[如何對 Application Load Balancer HTTP 502 錯誤進行疑難排解？](https://repost.aws/knowledge-center/elb-alb-troubleshoot-502-errors)」。

## API Gateway 原始伺服器 502 錯誤
<a name="cloudfront-api-gateway-502-error"></a>

如果您使用 API Gateway 並收到 502 錯誤，請參閱「[如何透過 Lambda 代理整合解決 API Gateway REST API 的 HTTP 502 錯誤？](https://repost.aws/knowledge-center/malformed-502-api-gateway)」。