如何排查来自 CloudFront 的 502:“无法满足请求”错误?

2 分钟阅读
0

我使用自定义域配置了 Amazon CloudFront 分配。在通过 CloudFront 请求备用规范名称记录(CNAME)域时,我收到 502 错误响应,其消息为“The request could not be satisfied”(无法满足请求)。

简短描述

当 CloudFront 无法连接到源时,就会发生 502 错误。有关错误原因以及如何进行故障排除,请参阅以下部分。

解决方案

CloudFront 无法与原始服务器建立 TCP 连接

默认情况下,CloudFront 通过端口 80(对于 HTTP)和端口 443(对于 HTTPS)连接到源。如果源不允许通过这些端口的流量,或者阻止 CloudFront IP 地址的连接,则 TCP 连接将失败。失败会产生 502 错误。要解决此问题,请确认 CloudFront 分配的 Protocol(协议)设置已设置为 HTTP 或 HTTPS 连接的正确端口。

要测试端口连接性,请运行以下命令:

telnet ORIGIN_DOMAIN/ORIGIN_IP PORT

注意:对于 ORIGIN_DOMAIN,请输入您的源域名 ID。对于 ORIGIN_IP,请输入您的源 IP 地址。对于 PORT,请输入用于连接到源的端口号。

与原始服务器的 SSL/TLS 协商失败

如果 SSL/TLS 事务失败,则 CloudFront 和源之间的连接将失败,并产生 502 错误。有关 SSL/TLS 事务失败的原因以及如何解决这些问题,请参阅以下部分。

SSL 证书与域名不匹配

源的 SSL 证书必须包含或涵盖以下域名之一:

  • 证书的 Common Name(公用名)字段或 Subject Alternative Names(主题替代名称)字段中的源域名。
  • 在 CloudFront 分配中转发到源的传入查看器主机标头的主机标头域名。

要检查证书中的 Common Name(公用名)和 Subject Alternative Names(主题替代名称),请运行以下命令:

$ openssl s_client -connect DOMAIN:443 -servername SERVER_DOMAIN | openssl x509 -text | grep -E '(CN|Alternative)' -A 2

注意:对于 DOMAIN,请输入源域名。对于 SERVER_DOMAIN,请输入原始服务器域名。或者,如果查看器主机标头转发到源,则对于 SERVER_DOMAIN,请输入传入的主机标头值。

如果满足以下条件,则将缓存策略或源请求策略配置为包含主机标头:

  1. SSL 证书的公用名或存储区域网络(SAN)包括查看器主机标头值。
  2. 主机标头未转发到源。

源证书已过期、不可信或自签名

自定义源的安装证书必须由受信任的证书颁发机构签名。CloudFront 信任的证书颁发机构可在 Mozilla 网站上的 Mozilla included CA certificate list(Mozilla 附带 CA 证书列表)中找到。

CloudFront 不支持使用源设置的 SSL 的自签名证书。自签名证书由组织自己颁发或在 Web 服务器上本地生成,而不是由受信任的证书颁发机构颁发。

要检查您的源证书是否已过期,请运行以下 OpenSSL 命令。在输出中,找到不在此之前不在之后参数。确认当前日期和时间在证书的有效期内。

$ openssl s_client -connect DOMAIN:443 -servername SERVER_DOMAIN | openssl x509 -text | grep Validity -A 3

注意:对于 DOMAIN,请输入源域名。对于 SERVER_DOMAIN,请输入原始服务器域名。或者,如果查看器主机标头转发到源,则对于 SERVER_DOMAIN,请输入传入的主机标头值。

缺少中间 CA 证书或中间证书的顺序不正确会导致 HTTPS 通信和源之间出现故障。要检查证书链,请运行以下命令。

$ openssl s_client -showcerts -connect DOMAIN:443 -servername SERVER_DOMAIN

注意:对于 DOMAIN,请输入源域名;对于 SERVER_DOMAIN,请输入原始服务器域名。或者,如果查看器主机标头转发到源,则对于 SERVER_DOMAIN,请输入传入的主机标头值。

CloudFront 不支持源的密码套件

如果没有通用的协商密码套件,CloudFront 和源之间的 SSL/TLS 事务将失败。要确认您使用的是正确的密码套件,请参阅 CloudFront 和源之间支持的协议和密码

您还可以使用 SSL 服务器测试工具来检查源域名是否包含在受支持的密码列表中。

CloudFront 无法解析源 IP 地址

如果 CloudFront 无法解析源域,则会返回 502 错误。要解决此问题,请使用 dig/nslookup 命令检查源域是否解析为 IP

Linux:

$ dig ORIGIN_DOMAIN_NAME

Windows:

nslookup ORIGIN_DOMAIN_NAME

注意:对于 **ORIGIN_DOMAIN_NAME,**请输入源域名。

如果成功,该命令将返回源域名的 IP。使用 DNS 检查器工具检查不同地理位置的 DNS 解析。

错误是由上游源造成的

在 CloudFront 分配中定义的自定义源可能是代理、内容分发网络(CDN)主机名或连接到实际源的负载均衡器。如果这些中间服务中的任何一个未能连接到源,则会向 CloudFront 返回 502 错误。要解决此问题,请与您的服务提供商合作。

与 CloudFront 分配关联的 Lambda@Edge 函数未通过验证

如果 Lambda@Edge 函数向 CloudFront 返回无效响应,则 CloudFront 将返回 502 错误。要解决此问题,请检查您的 Lambda@Edge 函数以了解以下常见问题:

  • 返回 JSON 对象
  • 缺少必填字段
  • 响应中的对象无效
  • 添加或更新不允许或只读的标头
  • 超过最大正文大小
  • 字符或值无效

有关更多信息,请参阅测试和调试 Lambda@Edge 函数


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