Amazon CloudFront
开发人员指南 (API 版本 2016-09-29)
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

HTTP 502 状态代码 (Bad Gateway)

HTTP 502 状态代码 (Bad Gateway) 指示 CloudFront 因无法连接至源服务器而无法提供请求的对象。

重要

如果您是尝试访问网站或应用程序的客户,且收到了此错误,则表示网站流量可能异常高。请稍等,然后尝试重新访问网站(或运行应用程序)。如果您仍然收到错误,请直接联系网站或应用程序经销商以获取支持。

为何此错误来自于 CloudFront?通过将副本存储在全球各地的服务器中,CloudFront 帮助网站加速向客户传送图像或网页等内容。但当网站的 Internet 流量过高且网站的运行速度滞后时,系统就会在用户尝试访问网站时返回错误。当 CloudFront 无法访问您从网站请求的内容时,便会传递您尝试使用的网站或应用程序的错误。

CloudFront 与自定义源服务器之间的 SSL/TLS 协商失败

如果您使用自定义源并将 CloudFront 配置为要求在 CloudFront 和源之间使用 HTTPS,则问题可能是域名不匹配。在源上安装的 SSL/TLS 证书在公用名字段中包含一个域名,并且可能在使用者备用名称字段中包含更多域名。(CloudFront 支持在证书域名中使用通配符。) 证书中必须有一个域名与下面的一个或两个值匹配:

  • 您为分配中适用源的源域名指定的值。

  • Host 标头的值(如果配置 Host 以将 CloudFront 标头转发到源)。有关将 Host 标头转发到源的更多信息,请参阅根据请求标头缓存内容

如果域名不匹配,SSL/TLS 握手将失败,CloudFront 返回 HTTP 状态代码 502 (Bad Gateway) 并将 X-Cache 标头设置为 Error from cloudfront

要确定证书中的域名是否与分配或 Host 标头中的 Origin Domain Name 匹配,可以使用在线 SSL 检查程序或 OpenSSL。如果域名不匹配,则有两个选项:

  • 获取包含相应域名的新 SSL/TLS 证书。

    如果您使用 AWS Certificate Manager (ACM),请参阅 AWS Certificate Manager 用户指南 中的请求证书以请求新证书。

  • 更改分配配置,以使 CloudFront 不再尝试使用 SSL 来连接源。

在线 SSL 检查程序

要查找 SSL 测试工具,请在 Internet 上搜索“在线 ssl 检查程序。” 通常情况下,您指定域名,该工具将返回有关 SSL/TLS 证书的各种信息。确认在证书的公用名使用者备用名称字段中包含您的域名。

OpenSSL

要确定 CloudFront 是否能够与源建立连接,可以使用 OpenSSL 尝试创建与源之间的 SSL/TLS 连接,并验证源中的证书配置是否正确。如果 OpenSSL 能够建立连接,则会返回有关源服务器上的证书的信息。

您使用的命令取决于您使用的客户端是否支持 SNI (服务器名称指示)

客户端支持 SNI

openssl s_client -connect domainname:443 -servername domainname

客户端不支持 SNI

openssl s_client –connect domainname:443

domainname 替换为相应的值:

  • 如果不将 Host 标头转发到源 – 将 domainname 替换为源的域名。

  • 如果将 Host 标头转发到源 – 将 domainname 替换为用于 CloudFront 分配的 CNAME。

源没有使用支持的密码/协议进行响应

CloudFront 使用密码和协议连接到源服务器。有关 CloudFront 支持的密码和协议列表,请参阅支持的密码和协议。如果源在 SSL/TLS 交换中不用这些密码或协议之一进行响应,则 CloudFront 无法连接。可以使用 SSL Labs 验证源是否支持密码和协议:

  • SSL Labs

    Hostname 字段中键入源的域名,然后选择 Submit。查看测试中的 Common namesAlternative names 字段,以确定它们是否与源的域名匹配。

    测试完成后,在测试结果中查找 ProtocolsCipher Suites 部分,以确定源支持的密码和协议。将其与支持的密码和协议列表进行比较。

注意

如果您使用的是 Elastic Load Balancing,请参阅 Elastic Load Balancing 用户指南 中的适用于 Elastic Load Balancing 的 SSL 安全策略以了解如何设置密码和协议。使用预定义的安全策略 ELBSecurityPolicy-2016-08 可以为 CloudFront 授予弹性负载均衡器的访问权限。如果您要使用自定义策略对其做进一步限制,则必须允许 CloudFront 支持的密码。

源中的 SSL/TLS 证书已过期、无效、为自签名或证书链的顺序错误

如果源服务器返回以下内容,CloudFront 将中断 TCP 连接,返回 HTTP 状态代码 502 (Bad Gateway) 并将 X-Cache 标头设置为 Error from cloudfront

  • 过期的证书

  • 无效的证书

  • 自签名证书

  • 证书链的顺序错误

注意

如果不存在完整的证书链 (包括中间证书),CloudFront 将中断 TCP 连接。

有关在自定义源服务器中安装 SSL/TLS 证书的信息,请参阅要求 CloudFront 和自定义源之间使用 HTTPS 进行通信

在“Origin Settings”中的指定端口上源没有响应

在 CloudFront 分配中创建源时,您可以为 HTTP 和 HTTPS 流量设置 CloudFront 用于连接到源的端口。默认情况下,这些端口为 TCP 80/443。您可以选择修改这些端口。如果源出于任何原因拒绝这些端口上的流量,或者后端服务器在这些端口上无响应,CloudFront 将无法连接。

要解决这些问题,请检查您的基础设施中运行的任何防火墙并确认它们未阻止支持的 IP 范围。有关更多信息,请参阅 Amazon Web Services 一般参考 中的 AWS IP 地址范围。此外,还要验证您的 Web 服务器是否正在源中运行。

由于 DNS 问题,CloudFront 无法解析源域

当 CloudFront 收到针对已过期或未在缓存中存储的对象的请求时,它会向源发出请求,以获取更新后的对象。为了成功向源发出请求,CloudFront 会对源域名执行 DNS 解析。但当托管域的 DNS 服务出现问题时,CloudFront 将无法解析域名以获取 IP 地址,从而导致 502 错误。要解决该问题,请与 DNS 提供商联系;或者,如果您使用的是 Amazon Route 53,请参阅 Amazon Route 53 DNS

要进一步解决该问题,请确保源的根域或顶级域(如 example.com)的权威名称服务器运行正常。然后,权威名称服务器会接收请求并返回与域关联的 IP 地址,权威名称服务器与您用于设置 CloudFront 分配的 DNS 服务器相同。使用以下命令查找顶级域的名称服务器:

dig OriginAPEXDomainName NS +short nslookup –query=NS OriginAPEXDomainName

如果您有名称服务器的名称,请使用以下命令针对这些名称查询源的域名,以确保每个查询都会得到响应:

dig OriginDomainName @NameServerFromAbove nslookup OriginDomainName NameServerFromAbove

与您的分配关联的 Lambda 函数包含执行错误

在 Lambda@Edge 函数出现执行错误时,CloudFront 可能会返回 HTTP 502 错误。

要解决该问题,请检查访问日志以查找 Lambda 函数返回的错误。确保您查看执行该函数的区域中的日志文件。有关更多信息,请参阅 Lambda 函数的 CloudWatch 指标和 CloudWatch Logs