我想使用 Amazon CloudWatch 指标和访问日志来排查我在应用程序负载均衡器中收到的 HTTP 502"Bad gateway"错误。
解决方法
确定 HTTP 502 错误的来源
出现 HTTP 502: Bad gateway 错误。错误可能来源于您的目标或您的负载均衡器。要确定错误的来源,请使用 CloudWatch 指标或访问日志。
使用 CloudWatch 指标
如果 HTTPCode_ELB_502_Count 指标中存在数据点,则错误来源于您的负载均衡器。如果 HTTPCode_Target_5XX_Count 指标中存在数据点,则错误来源于您的目标。
使用访问日志
如果 elb_status_code 为"502",target_status_code 为"-",则错误来源于您的负载均衡器。如果 elb_status_code 为"502",target_status_code 为"502",则错误来源于您的目标。
对 HTTP 502 错误进行故障排除
要确定原因,请按 **elb_status_code = **** 和 **target_status_code"502" 筛选访问日志。然后,针对您遇到的问题完成相应的解决方法。
在尝试建立连接时,负载均衡器从目标收到 TCP RST
当您建立连接时,您可能会收到来自目标的 TCP RST 消息。当负载均衡器无法与目标建立 TCP 三次握手时,会出现此消息。因此,负载均衡器无法将用户请求转发到目标。
检查 TargetConnectionErrorCount 指标中是否存在数据点,这些数据点显示目标正在拒绝来自负载均衡器的连接并显示 TCP RST 消息。
在访问日志中,将 request_processing_time、target_processing_time 和 response_processing_time 字段设置为值 -1。当您将值设置为 -1 时,负载均衡器无法将请求发送到目标,因为您必须连接负载均衡器。
以下是 request_processing_time、target_processing_time 和 response_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"
当负载均衡器尝试连接"ICMP Destination unreachable (Host unreachable)"时,负载均衡器收到来自目标的意外响应,例如
在访问日志中将 request_processing_time、target_processing_time 和 response_processing_time 字段设置为值 -1。然后,确认负载均衡器子网是否允许流量通过目标端口流向目标。
当负载均衡器发往目标的请求未完成时,目标关闭了连接并显示 TCP RST 或 TCP FIN 消息
负载均衡器接收请求并将请求转发到目标。目标开始处理请求,但过早关闭了与负载均衡器的连接。当您在目标上配置的保持活动超时持续时间小于负载均衡器的空闲超时值时,会出现这种情况。确保保持活动超时的持续时间大于空闲超时值。
目标响应格式错误或包含无效的 HTTP 标头
要对目标响应进行故障排除,请在问题发生期间对目标执行数据包捕获。
要在 Linux 上执行数据包捕获,请运行以下命令:
sudo tcpdump -i any -w filename.pcap
**重要事项:**如果目标实例存在大量流量,则 tcpdump 集合生成的数据包捕获 (PCAP) 文件可能会影响您的磁盘空间。大量流量也可能会影响目标实例的服务。
对于 Windows,请在 Wireshark 网站上下载并使用 Wireshark 应用程序。
要使用 tcpdump 测试数据包捕获样本,请参阅如何排查 Amazon Virtual Private Cloud (Amazon VPC) 中的 Amazon Elastic Compute Cloud (Amazon EC2) Linux 或 Windows 实例与本地主机之间通过互联网网关通信时的网络性能问题?
负载均衡器在连接到目标时遇到 SSL 握手错误
从负载均衡器到目标的 HTTPS 侦听器的 TCP 连接成功,但随后的 SSL 握手遇到错误。因此,负载均衡器无法将请求转发到目标。
如果目标组使用 HTTPS 协议,请在问题发生期间对目标执行数据包捕获。
您的服务器必须使用负载均衡器用于后端连接的安全策略支持的 TLS 密码套件。
已注销目标所管理的请求的注销延迟期已过
在 AWS CloudTrail 事件中,检查问题发生期间是否存在 DeregisterTargets API 操作。如果目标过早地注销,则会出现 HTTP 502 错误。要解决此问题,请延长注销延迟期,以便长时间操作能够完成。
对目标是 Lambda 函数时的 HTTP 502 错误进行故障排除
对于失败的 AWS Lambda 函数请求,请查看负载均衡器访问日志的 error_reason 字段中的 Lambda 错误原因代码。
目标是 Lambda 函数,响应正文超过 1 MB
要确认问题,请检查 LambdaUserError 指标中是否存在数据点。或者,检查负载均衡器访问日志中的 error_reason 字段是否设置为 LambdaResponseTooLarge。
要对问题进行故障排除,请更新您的 Lambda 代码并添加错误处理逻辑。
目标是 Lambda 函数,该函数在配置的超时时间之前没有响应
要确认问题,请检查 LambdaUserError 指标中是否存在数据点。或者,检查负载均衡器访问日志中的 error_reason 字段是否设置为 LambdaUnhandled。
目标是 Lambda 函数,该函数返回了一个错误,或者 Lambda 限制了该函数
要确认 Lambda 是否限制了该函数,请检查 Throttles 指标中是否存在数据点。如果 Lambda 限制了该函数,请使用 AWS 服务配额申请增加 Lambda 并行执行的配额。
有关详细信息,请参阅 Understanding Lambda invoke throttling limits。