我想对我在应用程序负载均衡器访问日志或 Amazon CloudWatch 指标中收到的 ELB_504 错误进行故障排除。或者,对通过应用程序负载均衡器连接到我的服务时收到的 HTTP 504 错误进行故障排除。
简短描述
网关或代理超时时出现 HTTP 504 错误。应用程序负载均衡器 HTTP 504 错误可能由于以下原因引起:
- 在 10 秒的连接超时到期之前,负载均衡器未能与目标建立连接。
- 负载均衡器在连接到目标时遇到 SSL 握手超时。
**注意:**您无法调整 10 秒的 SSL 握手超时时间。
- 负载均衡器与目标建立了连接,但在空闲超时时间结束之前,目标没有响应。
- 目标返回的内容长度标头值大于实体正文,负载均衡器超时。
- 高流量导致目标的响应速度变慢。
- 目标是 AWS Lambda 函数,在连接超时到期之前,该服务没有响应。
解决方法
检查您的负载均衡器是否允许来自注册目标的流量
使用 Sum(总和)统计数据查看 TargetConnectionErrorCount CloudWatch 指标。如果您看到的是正数据点而不是 0,则表示负载均衡器与目标之间存在连接问题。
要解决这些问题,请检查与负载均衡器和后端目标关联的网络安全组。确保网络安全组允许流量和运行状况检查端口上负载均衡器和目标之间的双向流量。确认子网的网络访问控制列表允许在临时端口 (1024-65535) 上从目标到负载均衡器节点的流量。
**注意:**最佳做法是对应用程序负载均衡器使用特定安全组规则。
查看负载均衡器指标
要确定为何您的目标被标记为 Unhealthy(不正常),请检查应用程序负载均衡器的 CloudWatch 指标。如果没有 HTTPCode_ELB_504_Count 指标数据,则您的应用程序服务器返回的是 504 错误,而不是负载均衡器。检查 TargetResponseTime 指标的最大值是否经常超过超时值,因为此配置可能导致 504 错误。
此外,根据资源类型检查目标中的以下 CPU 和内存利用率指标:
- 对于 Amazon Elastic Compute Cloud (Amazon EC2),请查看 CPUUtilization 指标。默认情况下,EC2 实例不向 CloudWatch 发送内存指标,但您可以发送自定义内存指标。
- 对于 Amazon ECS 任务,请检查 CPUUtilization 和 MemoryUtilization 指标。如果任一的值为 1 (100%),则任务将变得无响应。
- 对于 Lambda 函数,请查看 Duration 指标。如果 Duration 的持续时间超过负载均衡器的空闲超时值,则会收到 Gateway timeout(网关超时)错误。
提高资源可用性
如果您的目标的 CPU 使用率很高,它们可能会变得无响应。
要解决此问题,请为您的目标增加以下资源:
- 对于 Amazon EC2,增加实例大小以允许目标使用更多计算资源。
- 对于 Amazon ECS 任务,在 Amazon ECS 任务定义中增加 CPU 和内存配额。
- 对于 Lambda 函数,增加其内存以更改资源容量。
**注意:**您分配给该函数的 CPU 和内存量是成比例的。
更新应用程序的代码,使其在响应 HTTP 请求时更加高效。确保应用程序的响应时间不会超过配置的空闲超时时间。默认情况下,应用程序负载均衡器的空闲超时时间为 60 秒。如果需要,请增加负载均衡器的空闲超时时间。
**注意:**最佳做法是仅在目标需要完成大量计算操作时才增加空闲超时值。否则,最佳做法是改为优化目标中的资源使用情况。
根据您的需求扩展目标
要根据您的需求扩展目标,请对您的配置执行以下操作:
**注意:**当您调用 Lambda 函数时,该函数会自动扩展。
检查您的外部依赖关系
当应用程序使用微服务架构时,外部依赖关系(例如数据库或 API)会影响目标响应时间。
检查以下常见的外部依赖关系是否存在问题:
- 对于 Amazon Relational Database Service (Amazon RDS) 数据库,请检查 ReadLatency、WriteLatency 和 DatabaseConnections CloudWatch 指标。
- 对于 Amazon Simple Queue Service (Amazon SQS) 队列,请检查 ApproximateAgeOfOldestMessage 和 NumberOfMessagesDelayed CloudWatch 指标。
- 对于 Amazon Simple Storage Service (Amazon S3) 存储桶,请检查 FirstByteLatency、TotalRequestLatency、4xxErrors 和 5xxErrors CloudWatch 指标。
- 对于 Amazon Cognito 身份验证服务,请检查 TokenRefreshSuccesses CloudWatch 指标,并检查是否存在 ThrottlingException 错误。
要确定性能瓶颈的来源,请执行以下操作:
使用 Compute Optimizer 避免将来出现问题
使用 AWS Compute Optimizer 了解 Amazon EC2、Amazon ECS 和 Lambda 资源的使用情况。Compute Optimizer 会检测您的资源使用率何时过高,以帮助您避免超时。它还提供了有关如何优化工作负载的最佳实践。
相关信息
HTTP 504: 网关超时
如何排查弹性负载均衡中应用程序负载均衡器的高延迟问题?
如何排查应用程序负载均衡器中的身份验证问题?
如何排查使用经典负载均衡器时返回的 504 错误?