我在经典负载均衡器访问日志、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 重试超时。如果在后端实例关闭连接之前未发送 FIN 或 RST,则负载均衡器认为连接已建立,但事实并非如此。然后,当负载均衡器通过此 TCP 连接发送请求时,后端会以 RST 进行响应,从而生成 504 错误。
要解决此问题,请将 AcceptFilter http 和 AcceptFilter https 均设置为 none。
(仅限 Apache)关闭事件 MPM,并以最佳方式配置 prefork 和 worker MPM
在注册到负载均衡器的后端实例上关闭事件 MPM 是一种最佳做法。由于 Apache 后端会动态关闭连接,因此这些关闭的连接可能会导致 HTTP 504 错误。
为了在使用 prefork 和 worker MPM 时获得最佳性能,并假定负载均衡器配置了 60 秒的空闲超时,请使用以下值:
| | |
---|
| mod_prefork MPM | mod_worker MPM |
Timeout | 65 | 65 |
KeepAliveTimeout | 65 | 65 |
KeepAlive | 开 | 开 |
MaxKeepAliveRequests | 10000 | 0 |
AcceptFilter http | none | none |
AcceptFilter https | none | none |
相关信息
监控 Classic Load Balancer
对经典负载均衡器进行问题排查:HTTP 错误
使用 Apache 或 NGINX 作为 ELB 的后端服务器的最佳设置是什么?