HTTP 502 状态代码 (Bad Gateway)
HTTP 502 状态代码(无效网关)指示 CloudFront 因无法连接至源服务器而无法提供请求的对象。
主题
CloudFront 与自定义源服务器之间的 SSL/TLS 协商失败
如果您使用自定义源并将 CloudFront 配置为要求 CloudFront 与源之间使用 HTTPS,则问题可能在于域名不匹配。在源上安装的 SSL/TLS 证书的公用名字段中包含一个域名,使用者备用名称字段中可能包含更多域名。(CloudFront 支持证书域名中的通配符。) 证书中必须有一个域名与下面的一个或两个值匹配:
-
您为分配中适用源的源域名指定的值。
-
如果您将 CloudFront 配置为将
Host
标头转发到您的源,则为该Host
标头的值。有关将Host
标头转发到源的更多信息,请参阅根据请求标头缓存内容。
如果域名不匹配,SSL/TLS 握手将失败,CloudFront 将返回 HTTP 状态代码 502(无效网关)并将 X-Cache
标头设置为 Error from cloudfront
。
要确定证书中的域名是否与分配或 Host
标头中的 Origin Domain Name 匹配,可以使用在线 SSL 检查程序或 OpenSSL。如果域名不匹配,则有两个选项:
获取包含相应域名的新 SSL/TLS 证书。
如果您使用 Amazon Certificate Manager (ACM),请参阅 Amazon Certificate Manager 用户指南中的请求证书来请求新证书。
更改分配配置,以使 CloudFront 不再尝试使用 SSL 来连接源。
在线 SSL 检查程序
要查找 SSL 测试工具,请在 Internet 上搜索“在线 ssl 检查程序。” 通常情况下,您指定域名,该工具将返回有关 SSL/TLS 证书的各种信息。确认在证书的公用名或使用者备用名称字段中包含您的域名。
OpenSSL
要帮助纠正来自 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
源没有使用支持的密码/协议进行响应
CloudFront 使用密码和协议连接到源服务器。有关 CloudFront 支持的密码和协议列表,请参阅 CloudFront 与源之间受支持的协议和密码。如果您的源在 SSL/TLS 交换中不用这些密码或协议之一进行响应,则 CloudFront 无法连接。可以使用 SSL Labs
源中的 SSL/TLS 证书已过期、无效、为自签名或证书链的顺序错误
如果源服务器返回以下内容,CloudFront 将中断 TCP 连接、返回 HTTP 状态代码 502(无效网关),并将 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 General Reference 中的 Amazon IP 地址范围。此外,还要验证您的 Web 服务器是否正在源中运行。
由于 DNS 问题,CloudFront 无法解析源域
当 CloudFront 收到针对已过期或未在缓存中存储的对象的请求时,它会向源发出请求,以获取更新后的对象。为了成功向源发出请求,CloudFront 会对源域名执行 DNS 解析。但当托管域的 DNS 服务出现问题时,CloudFront 将无法解析域名以获取 IP 地址,从而导致 502 错误。要修复此问题,请联系您的 DNS 提供商,或者如果您使用的是 Amazon Route 53,请参阅为什么我无法访问使用 Route 53 DNS 服务的网站?
要进一步解决该问题,请确保源的根域或顶级域(如 example.com
)的权威名称服务器运行正常。然后,权威名称服务器会接收请求并返回与域关联的 IP 地址,权威名称服务器与您用于设置 CloudFront 分配的 DNS 服务器相同。使用以下命令查找顶级域的名称服务器:
dig
OriginAPEXDomainName
NS +short nslookup -query=NSOriginAPEXDomainName
如果您有名称服务器的名称,请使用以下命令针对这些名称查询源的域名,以确保每个查询都会得到响应:
dig OriginDomainName @NameServerFromAbove nslookup OriginDomainName NameServerFromAbove
Lambda @Edge 函数验证错误
如果使用的是 Lambda@Edge,则 HTTP 502 状态代码可能指示未正确设置 Lambda 函数响应格式或包含无效的内容。有关排查 Lambda@Edge 错误的更多信息,请参阅测试和调试 Lambda@Edge 函数。