我使用自定义域配置了 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,请输入传入的主机标头值。
如果满足以下条件,则将缓存策略或源请求策略配置为包含主机标头:
- SSL 证书的公用名或存储区域网络(SAN)包括查看器主机标头值。
- 主机标头未转发到源。
源证书已过期、不可信或自签名
自定义源的安装证书必须由受信任的证书颁发机构签名。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 函数。