HTTP 504 状态代码 (Gateway Timeout) - Amazon CloudFront
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

HTTP 504 状态代码 (Gateway Timeout)

HTTP 504 状态码(Gateway Timeout)表示当将请求 CloudFront 转发到源站时(因为请求的对象不在边缘缓存中),发生了以下情况之一:

  • 源站向返回了一个 HTTP 504 状态码。 CloudFront

  • 源在请求过期前未响应。

CloudFront 如果防火墙或安全组阻止了源站的流量,或者无法在互联网上访问源站,则将返回 HTTP 504 状态码。请首先检查是否存在这些问题。然后,如果访问没有问题,请探究应用程序延迟和服务器超时,以帮助您确定并解决问题。

在源站服务器上配置防火墙以允许 CloudFront 流量

如果您的源服务器上的防火墙阻止了 CloudFront 流量,则会 CloudFront 返回 HTTP 504 状态码,因此最好在检查其他问题之前确保这不是问题所在。

您用于确定这是否是与您的防火墙相关的问题的方法取决于源服务器使用的系统:

  • 如果您使用的是 Linux 服务器上的 IPTable 防火墙,则可以搜索帮助您使用 IPTable 的工具和信息。

  • 如果您使用的是 Windows 服务器上的 Windows 防火墙,请参阅 Microsoft 文档中的添加或编辑防火墙规则

在评估源服务器上的防火墙配置时,请根据已发布的 IP 地址范围,寻找任何可阻止来自 CloudFront 边缘位置的流量的防火墙或安全规则。

如果允许 CloudFront IP 地址范围连接到您的源服务器,请务必更新服务器的安全规则以纳入更改。您可以订阅 Amazon SNS 主题并且在更新 IP 地址范围文件时接收通知。收到该通知后,您可以使用代码检索该文件、解析文件并根据您的当地环境做出相应调整。有关更多信息,请参阅 Amazon 新闻博客上的通过 Amazon SNS 订阅 Amazon 公共 IP 地址范围

在源服务器上配置安全组以允许 CloudFront 流量

如果您的源使用 Elastic Load Balancing,请查看 ELB 安全组并确保安全组允许来自 CloudFront的入站流量。

您还可以使用Amazon Lambda自动更新您的安全组,以允许来自的入站流量 CloudFront。

使自定义源服务器在 Internet 上可访问

如果由于您的自定义源服务器未在互联网上公开发布而 CloudFront 无法访问该服务器,则会 CloudFront 返回 HTTP 504 错误。

CloudFront 边缘站点通过互联网连接到源服务器。如果您的自定义来源位于私有网络上,则 CloudFront 无法访问。因此,您不能将私有服务器(包括内部经典负载均衡器)用作原始服务器。 CloudFront

要检查互联网流量是否可以连接到您的源服务器,请运行以下命令(服务器的域名在 OriginDomainName 哪里):

对于 HTTPS 流量:

  • nc-zv 443 OriginDomainName

  • telnet 443 OriginDomainName

对于 HTTP 流量:

  • nc-zv 80 OriginDomainName

  • telnet 80 OriginDomainName

查找并修复源服务器上来自应用程序的延迟响应

服务器超时通常是应用程序响应时间过长或超时值设置得过低的结果。

为了帮助避免 HTTP 504 错误,只需为分发设置一个更高的 CloudFront 超时值即可。但是,我们建议您首先确保解决与应用程序和源服务器相关的任何性能和延迟问题。然后,您可以设置一个合理的超时值,以帮助防止 HTTP 504 错误并向用户提供良好的响应能力。

以下是您要查找性能问题并进行更正可以采取的步骤的概述:

  1. 测量您的 Web 应用程序的典型和高负载延迟 (响应能力)。

  2. 添加其他资源,如 CPU 或内存 (如果需要)。采取解决问题的其他步骤,如优化数据库查询以适应高负载场景。

  3. 如果需要,请调整 CloudFront 分发的超时值。

以下是关于每个步骤的详细信息。

测量典型和高负载延迟

要确定一个或多个后端 Web 应用程序服务器是否遇到高延迟,请在每个服务器上运行以下 Linux curl 命令:

curl -w "Connect time: %{time_connect} Time to first byte: %{time_starttransfer} Total time: %{time_total} \n" -o /dev/null https://www.example.com/yourobject

注意

如果您在服务器上运行的是 Windows,则可以搜索并下载用于 Windows 运行类似命令的 curl。

您在测量并评估在您的服务器上运行的应用程序的延迟时,请注意以下事项:

  • 延迟值是相对于每个应用程序的。但是,合理的做法是第一个字节的时间采用毫秒而不是秒或更大的单位。

  • 如果您在正常负载下测量应用程序延迟且结果正常,请注意查看器在高负载下可能仍会遇到超时。当存在高需求时,服务器可能已延迟响应或根本未响应。为了帮助防止高负载延迟问题,请检查您的服务器的资源,如 CPU、内存和磁盘读写情况,以确保您的服务器具有针对高负载进行扩展的容量。

    您可以运行以下 Linux 命令来检查 Apache 进程所使用的内存:

    watch -n 1 "echo -n 'Apache Processes: ' && ps -C apache2 --no-headers | wc -l && free -m"

  • 服务器上的 CPU 使用率高可能会大幅降低应用程序的性能。如果您将 Amazon EC2 实例用于后端服务器,请查看服务器的 CloudWatch指标以检查 CPU 利用率。有关更多信息,请参阅 Amazon CloudWatch 用户指南。或者,如果您使用的是自己的服务器,请参阅该服务器的有关如何检查 CPU 使用率的说明的帮助文档。

  • 检查在高负载下是否存在其他潜在问题,如存在大量请求时数据库查询运行缓慢。

添加资源并优化服务器和数据库

在您评估应用程序和服务器的响应能力后,请确保您有用于典型流量和高负载情况的足够资源:

  • 如果您有自己的服务器,请确保它具有足够的 CPU、内存和磁盘空间来处理查看器请求 (根据您的评估)。

  • 如果使用 Amazon EC2 实例作为后端服务器,请确保实例类型具有适当的资源来满足传入请求。有关更多信息,请参阅 Amazon EC2 用户指南中的实例类型

此外,请考虑以下帮助避免超时的优化步骤:

  • 如果 curl 命令返回的第一个字节的时间值似乎很高,请采取改进您的应用程序性能的步骤。提高应用程序响应能力反过来将有助于减少超时错误。

  • 优化数据库查询以确保它们可以处理大量请求,而不会降低性能。

  • 在您的后端服务器上设置保持连接 (持久性) 连接。该选项有助于避免在必须为后续请求或用户重新建立连接时发生的延迟。

  • 如果使用 ELB 作为源,请通过查看以下知识中心文章中的建议了解如何减少延迟:如何排查我的 ELB 经典负载均衡器上的高延迟问题?

如果需要,请调整 CloudFront 超时值

如果您已评估并解决低应用程序性能、源服务器容量及其他问题,但查看器仍遇到 HTTP 504 错误,则您应考虑更改在您的分配中为源响应超时指定的时间。要了解更多信息,请参阅响应超时(仅自定义源)