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

上次更新时间:2022 年 6 月 22 日

我使用自定义域配置了 Amazon CloudFront 分配。在通过 CloudFront 请求备用规范名称记录 (CNAME) 域时,我收到 502 错误响应,其消息为“无法满足请求”。 如何对此错误进行故障排除?

简短描述

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

解决方案

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

默认情况下,CloudFront 通过端口 80(对于 HTTP)和端口 443(对于 HTTPS)连接到源。如果源不允许通过这些端口的流量,或者阻止 CloudFront IP 地址的连接,则 TCP 连接将失败并产生 502 错误。要解决此问题,请确认 CloudFront 分配的协议设置已设置为 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 证书必须包含或涵盖以下域名之一:

  • 证书的公用名字段或主题替代名称字段中的源域名。
  • 如果传入的查看器主机标头转发到 CloudFront 分配中的源,则源证书必须包含或涵盖主机标头的域。

要检查证书中的公用名主题替代名称,请运行以下命令:

$ 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 附带 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 函数


这篇文章对您有帮助吗?


您是否需要账单或技术支持?