如何排查使用经典负载均衡器时返回的 504 错误?

1 分钟阅读
0

我在经典负载均衡器访问日志、Amazon CloudWatch 指标中或通过经典负载均衡器连接到我的服务时看到了 HTTP 504 错误。

解决方法

HTTP 504 错误是一个 HTTP 状态代码,表示网关或代理已超时。进行问题排查时,请调查以下事项:

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

HTTP 504 错误的最常见原因是相应的实例没有在配置的空闲超时内响应请求。默认情况下,经典负载均衡器的空闲超时时间为 60 秒。

如果已开启 CloudWatch 指标,请检查负载均衡器的 CloudWatch 指标。当延迟数据点等于配置的负载均衡器超时值,并且 HTTPCode_ELB_5XX 具有数据点时,至少有一个请求超时。

要解决此问题,您可以执行以下两项操作之一:

  • 修改负载均衡器的空闲超时,以便 HTTP 请求在空闲超时期限内完成。
  • 调整应用程序以更快地响应。

确保您的后端实例保持连接打开

当后端实例在达到空闲超时值之前关闭与负载均衡器的 TCP 连接时,可能会显示 HTTP 504 错误。

要解决此问题,请在后端实例上激活保持活动设置,并将保持活动超时的值设置为大于负载均衡器的空闲超时。

(仅限 Apache)关闭 TCP_DEFER_ACCEPT

当为 Apache 后端实例激活 TCP_DEFER_ACCEPT 时,负载均衡器通过向后端实例发送 SYN 来启动连接。然后,后端实例使用 SYN-ACK 进行响应,负载均衡器向后端实例发送空的 ACK

由于最后一个 ACK 为空,因此后端不接受 ACK,而是向负载均衡器重新发送 SYN-ACK。这可能会导致后续的 SYN 重试超时。如果在后端实例关闭连接之前未发送 FINRST,则负载均衡器认为连接已建立,但事实并非如此。然后,当负载均衡器通过此 TCP 连接发送请求时,后端会以 RST 进行响应,从而生成 504 错误。

要解决此问题,请将 AcceptFilter httpAcceptFilter https 均设置为 none

(仅限 Apache)关闭事件 MPM,并以最佳方式配置 prefork 和 worker MPM

在注册到负载均衡器的后端实例上关闭事件 MPM 是一种最佳做法。由于 Apache 后端会动态关闭连接,因此这些关闭的连接可能会导致 HTTP 504 错误。

为了在使用 preforkworker MPM 时获得最佳性能,并假定负载均衡器配置了 60 秒的空闲超时,请使用以下值:

mod_prefork MPMmod_worker MPM
Timeout6565
KeepAliveTimeout6565
KeepAlive
MaxKeepAliveRequests100000
AcceptFilter httpnonenone
AcceptFilter httpsnonenone

相关信息

监控 Classic Load Balancer

对经典负载均衡器进行问题排查:HTTP 错误

使用 Apache 或 NGINX 作为 ELB 的后端服务器的最佳设置是什么?

AWS 官方
AWS 官方已更新 2 年前