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

2 分钟阅读
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 错误。有关更多信息,请参阅 Apache 网站上的 Apache MPM 事件

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

mod_prefork MPMmod_worker MPM
Timeout6565
KeepAliveTimeout6565
KeepAliveOnOn
MaxKeepAliveRequests100000
AcceptFilter httpnonenone
AcceptFilter httpsnonenone

有关更多信息,请参阅 Apache 网站上的 Apache MPM worker Apache MPM prefork

相关信息

Monitor your Classic Load Balancer

Troubleshoot a Classic Load Balancer: HTTP errors

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

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