如何排查使用应用程序负载均衡器时返回的 504 错误?

上次更新日期:2022 年 4 月 25 日

我在应用程序负载均衡器访问日志、Amazon CloudWatch 指标中或通过应用程序负载均衡器连接到我的服务时发现 HTTP 504 错误。如何解决此问题?

简短描述

HTTP 504 错误是一个 HTTP 状态代码,表示网关或代理已超时。

在以下情况下,可能会出现 Application Load Balancer HTTP 504 错误:

  • 负载均衡器未能在连接超时到期(10 秒)之前建立与目标的连接。
  • 负载均衡器建立了与目标的连接,但是目标没有在达到空闲超时期限之前响应。
  • 子网 (ACL) 不允许将流量从目标传送到负载均衡器节点的临时端口 (1024-65535)。
  • 目标返回一个大于实体主体的内容长度标头值。负载均衡器在等待缺少的字节时超时。
  • 目标是 AWS Lambda 函数,并且该服务在连接超时到期之前没有响应。

解决方法

检查负载均衡器的空闲超时,然后在必要时进行修改

如果后端实例未在配置的空闲超时期限内响应请求,则可能会发生负载均衡器 HTTP 504 错误。默认情况下,Application Load Balancer 的空闲超时时间为 60 秒。

如果启用了 CloudWatch 指标,请检查 Application Load Balancer的 CloudWatch 指标HTTPCode_ELB_5XX 指标表示 504 错误源于负载均衡器。如果没有任何 HTTPCode_ELB_504_Count 指标数据点,则 504 错误是由您的应用程序服务器返回的,而非负载均衡器。

查看 CloudWatch 指标 TargetResponseTime 的最大值和平均值。超时值可能表示自目标收到负载均衡器请求后的时间。

要解决此错误:

修改负载均衡器的空闲超时,以便 HTTP 请求在空闲超时期限内完成。

-或者-

修改应用程序以更快地响应 HTTP 请求。确保应用程序的响应时间不会超过配置的空闲超时。

(可选)在后端 Web 服务器应用程序日志中添加以下自定义筛选条件,以帮助确定响应时间缓慢的原因:

Apache Web 服务器

a- Apache : %D in log format
b- Nginx: $request_time and $upstream_response_timein log format
c- IIS: “time-taken” in log format
d- Apache Tomcat Access logs: %D in log format

确保您的负载均衡器允许具有已注册目标的流量

确认与负载均衡器和后端目标关联的网络安全组在流量和运行状况检查端口上允许来自彼此的双向流量。子网的 (ACL) 不允许将流量从目标传送到临时端口 (1024-65535)的负载均衡器节点上。

注意:最佳实践是为您的应用程序负载均衡器使用以下安全组规则

如果您使用总和统计数据查看 CloudWatch 指标 TargetConnectionErrorCount,您很可能会看到正数据点。例如,负载均衡器和目标之间未成功建立的连接数。

有关更多信息,请参阅使用控制台配置空闲超时

确保您的 Lambda 函数在连接超时到期之前做出响应

如果您的目标是 Lambda 函数,请使用最大统计数据检查性能指标持续时间,以验证事件处理的时间。有关更多信息,请参阅使用性能指标