如何排查应用程序负载均衡器 HTTP 502 错误?

2 分钟阅读
0

我的应用程序负载均衡器遇到 HTTP 502 错误。

简短描述

HTTP 502:错误的网关错误有多种可能的原因,可能来源可能是您的目标,也可能是您的应用程序负载均衡器。要确定错误来源,请使用 Amazon CloudWatch 指标访问日志

在对应用程序负载均衡器中的错误进行故障排除之前,请确保启用访问日志记录。要了解访问日志中每个字段的含义,请参阅访问日志条目

如果目标是 AWS Lambda 函数,请参阅“解决方法”部分中的解决目标是 Lambda 函数时的 HTTP 502 错误

解决方法

查找 HTTP 502 错误的来源

使用 CloudWatch 指标

如果数据点出现在 HTTPCode_ELB_502_Count 指标下,则您的负载均衡器是 HTTP 502 错误的来源。如果它们出现在 HTTPCode_Target_5XX_Count 指标下,则您的目标就是来源。

使用访问日志

如果 elb_status_code 为“502”,target_status_code 为“-”,则您的负载均衡器是 HTTP 502 错误的来源。如果 elb_status_code 为“502”,target_status_code 为“502”,则您的目标是错误的来源。

对 HTTP 502 错误进行故障排除

**注意:**请按 elb_status_code = "502"target_status_code 筛选访问日志,以帮助您确定原因。然后,完成您的用例的相关步骤。

当尝试建立连接时,负载均衡器从目标收到了 TCP RST

如果在建立连接时您从目标收到了 TCP RST,则负载均衡器无法与目标建立 TCP 三向握手。因此,负载均衡器无法将用户请求转发到目标。

  • 检查 TargetConnectionErrorCount 指标是否有数据点。此指标表示负载均衡器和目标之间未成功建立的连接数量。
  • 检查访问日志中的 request_processing_timetarget_processing_timeresponse_processing_time 字段是否均设置为值 -1。此值意味着负载均衡器不能将请求分发到目标,因为它需要成功的连接。

以下是访问日志条目的示例:

http 2022-04-15T16:52:50.757968Z app/my-loadbalancer/50dc6c495c0c9188 192.168.131.39:2817 10.0.0.1:80 -1 -1 -1 502 - 86 155 "GET http://example.com:80/ HTTP/1.1"
"curl/7.51.0" - - arn:aws:elasticloadbalancing:us-east-1:123456789012:targetgroup/my-targets/73e2d6bc24d8a067" Root=1-58337262-36d228ad5d99923122bbe354"

**注意:**在此访问日志条目中,request_processing_timetarget_processing_timeresponse_processing_time 均设置为 -1

在尝试建立连接时,负载均衡器从目标收到了意外响应,例如“无法访问 ICMP 目标(无法访问主机)”

  • 检查访问日志中的 request_processing_timetarget_processing_timeresponse_processing_time 字段是否都设置为值 -1
  • 检查是否允许流量从负载均衡器子网流向目标端口上的目标。

目标关闭了与 TCP RST 或 TCP FIN 的连接,而负载均衡器具有发往目标的未完成请求

负载均衡器接收请求并将其转发到目标。目标接收请求并开始处理请求,但过早关闭了与负载均衡器的连接。这通常发生在目标的保持活动超时持续时间小于负载均衡器的空闲超时值时。确保保持活动超时的持续时间大于空闲超时值

检查 request_processing_timetarget_processing_timeresponse_processing_time 字段的值。

请参阅以下示例访问日志条目:

http 2022-04-15T16:52:50.757968Z app/my-loadbalancer/50dc6c495c0c9188 192.168.131.39:2817 10.0.0.1:80 0.001 4.205 -1 502 - 94 326 "GET http://example.com:80 HTTP/1.1" "curl/7.51.0" - - arn:aws:elasticloadbalancing:us-east-1:123456789012:targetgroup/my-targets/73e2d6bc24d8a067 "Root=1-58337262-36d228ad5d99923122bbe354"

**注意:**在此访问日志条目中,request_processing_time0.001target_processing_time4.205response_processing_time-1

目标响应格式错误或包含无效的 HTTP 标头

在问题发生期间对目标执行数据包捕获以了解目标响应。

负载均衡器在连接到目标时遇到了 SSL 握手错误或 SSL 握手超时(10 秒)

从负载均衡器到目标的 HTTPS 侦听器的 TCP 连接成功,但随后的 SSL 握手超时。因此,负载均衡器无法将请求转发到目标。

检查目标组是否使用 HTTPS 协议。如果它未使用 HTTPS 协议,则 SSL 握手超时不是问题的原因。如果目标组正使用 HTTPS 协议,请检查以下几点:

  • 检查访问日志中的 request_processing_timetarget_processing_timeresponse_processing_time 字段是否都设置为值 -1
  • 检查 TargetTLSNegotiationErrorCount 指标是否有数据点。
  • 在问题发生期间对目标执行数据包捕获,以验证问题是否与 SSL 握手有关。如果是,则完成执行数据包捕获部分中的步骤。
  • 检查密码或协议是否不匹配。

由已注销的目标处理的请求的注销延迟期已过

在您的 CloudTrail 事件中,检查问题发生期间是否有对 DeregisterTargets 操作的 API 调用。如果在问题发生期间发生了对 DeregisterTargets 的 API 调用,则错误是由过早注销的目标引起的。如需解决此问题,请延长注销延迟时间,以便长时间操作可以顺利完成。

解决目标是 Lambda 函数时的 HTTP 502 错误

**注意:**对于失败的 Lambda 函数请求,负载均衡器将 Lambda 特定的错误原因代码存储在访问日志的 error_reason 字段中。

目标是 Lambda 函数,响应正文超过 1 MB

  • 检查 LambdaUserError 指标是否有数据点。
  • 检查负载均衡器访问日志中的 error_reason 字段是否设置为 LambdaResponseTooLarge

目标是 Lambda 函数,在达到其配置的超时时间之前没有响应

  • 检查 Lambda 函数超时配置。
  • 检查 LambdaUserError 指标是否有数据点。
  • 检查负载均衡器访问日志中的 error_reason 字段是否设置为 LambdaUnhandled

目标是返回错误的 Lambda 函数,或者该函数被 Lambda 服务限制

联系 AWS Support 获取有关服务限制的指导。

执行数据包捕获

对于 Linux,请使用以下命令:

sudo tcpdump -i any -w filename.pcap

对于 Microsoft Windows,请下载并使用 Wireshark 应用程序(来自 Wireshark 网站)。

有关更多详细信息,请参阅如何排查 VPC 中的 EC2 Linux 或 Windows 实例与本地主机之间通过互联网网关通信时的网络性能问题?请参阅使用 tcpdump 测试数据包捕获示例抓取数据包部分。

AWS 官方
AWS 官方已更新 1 年前
没有评论