Gokul 为您演示如何
排查使用 Classic 负载均衡器遇到的
503 错误

504-error-classic-gokul

我在 Classic 负载均衡器的访问日志、Amazon CloudWatch 指标中或通过 Classic 负载均衡器连接到我的服务时看到 HTTP 504 错误。如何修复此问题?

HTTP 504 错误是一种 HTTP 安全代码,它表示网关或代理超时。在进行问题排查时,请调查下列方面:

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

负载均衡器返回 HTTP 504 错误的最常见原因是对应的后端实例未在当前配置的空闲超时期限内响应请求。Classic 负载均衡器的默认空闲超时设置为 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 httpAcceptFilter https 均设置为 none (无)

(仅适用于 Apache) 禁用 event MPM,最好配置 prefork 和 worker MPM

event MPM 不应用于注册到负载均衡器的后端实例,因为 Apache 后端实例会动态关闭连接,从而导致向客户端发送 HTTP 504 错误。

在使用 preforkworker MPM 时,假设负载均衡器配置为 60 秒空闲超时,请使用下列值以确保最优性能:

 

mod_prefork MPM

mod_worker MPM

 

Timeout

65

65

 

KeepAliveTimeout

65

65

 

KeepAlive

On

On

 

MaxKeepAliveRequests

10000

0

 

AcceptFilter http

none

none

 

AcceptFilter https

none

none

 

此页面对您有帮助吗? |

返回 AWS Support 知识中心

需要帮助? 请访问 AWS 支持中心

发布时间:2016 年 9 月 15 日

更新时间:2018 年 3 月 21 日