建议开启ALB访问日志,帮助快速排查ALB返回的HTTP异常。用户可以优先排查访问日志中的ALB状态码(status)和后端状态码(upstream_status)是否相同。若两者相同,很可能ALB直接透传了后端状态码,建议优先排查后端服务的异常原因。
先做这5项快速自检
在按状态码深入排查前,建议先按顺序检查以下5项配置。这些是 ALB 故障最高频的根因。
-
运行ALB实例诊断工具。在实例页面,找到目标实例,在实例诊断列单击发起诊断,可一键检测实例配置、监听、后端服务等常见问题。
-
确认监听对应的健康检查状态为正常。在监听详情页查看后端服务器组的健康检查状态。如显示异常,请参见ALB健康检查异常排查方法。
-
确认后端 ECS 未屏蔽 ALB 实例所属交换机的网段。ALB 通过其所在交换机分配的 Local IP 与后端通信。若后端 ECS 的 iptables 或第三方安全软件屏蔽了 ALB 交换机网段,将导致 ALB 无法访问后端,触发 502/504 等异常。
-
确认服务器组中后端服务器配置的端口与后端服务实际监听的端口一致。在 ALB 服务器组中为每台后端服务器配置的端口,必须与该服务器上业务进程实际监听的端口相同。例如服务器组中配置为
8080,但后端服务实际监听80,将导致连接失败。可在后端 ECS 执行ss -tlnp | grep ':<端口> '或netstat -tlnp | grep ':<端口> '。 -
HTTPS 监听:确认证书未过期且证书绑定的域名与访问域名匹配。在监听详情页查看绑定的证书及有效期。证书过期或域名不匹配会触发 SSL 握手失败或返回异常状态码。
502 Bad Gateway
HTTP 或 HTTPS 监听接收客户端请求后,ALB 无法正常将请求转发至后端服务器,或无法从后端服务器收到响应。
排查思路:先检查访问日志中 upstream_status 字段的值,根据该字段的值判断后续排查方向。
-
当
upstream_status= 502:ALB 透传了后端返回的 502 状态码,问题在后端服务自身。请排查后端服务,例如后端 Nginx、网关层是否反向代理到了不可达的上游。 -
当
upstream_status是其他值(如504、444、500等):访问日志中 ALB 对外返回的status与upstream_status不一致,说明 ALB 做了状态码转换。请排查后端服务为何返回该状态码(查后端 Nginx、网关或应用日志)。 -
当
upstream_status为-或为空:ALB 没有收到后端的任何响应,说明请求未到达后端、或后端在响应前异常断开。请按以下顺序逐项排查:-
ALB 与后端服务器 TCP 通信异常。请排查后端服务状态是否正常、服务端口是否正常监听、后端 ECS 的 iptables 或第三方安全软件是否屏蔽了 ALB 实例所属交换机的网段(ALB 通过其所在交换机分配的 Local IP 与后端通信)。可抓包查看 TCP 握手是否正常。
-
后端服务器 Backlog 已满。将导致新的连接请求被拒绝或丢弃。可在后端服务器执行
netstat -s | grep -i listen,查看是否有drop计数。 -
后端服务器没有及时处理完请求。请检查后端服务器的日志,并查看 CPU、内存等占用率,确认是否存在性能瓶颈。
-
客户端发送报文长度超过后端服务器的 MTU。表现为健康检查或其他报文较短的包正常,但报文较长的包异常。建议在后端服务器抓包分析报文长度是否符合要求。
-
后端服务器响应的报文格式异常或含非法 HTTP 标头。建议在后端服务器抓包,分析响应报文的格式是否规范。
-
400 Bad Request
请求格式异常。
-
后端直接返回400:建议检查访问日志,如
upstream_status的值为400,则很可能ALB透传了后端状态码。请排查后端服务。 -
HTTP请求发送至HTTPS监听:ALB的HTTPS监听会拒绝非HTTPS请求并返回
400。请检查客户端是否误将HTTP请求发送至HTTPS端口。 -
请求头大小超限:ALB要求每个HTTP请求头最大不超过32KB,超过此限制会返回
400。建议调整HTTP请求头的长度。 -
请求未完整发送:HTTP请求发送完成前,客户端关闭了连接。建议在客户端抓包分析原因。
-
请求头格式错误:如
Content-Length与实际请求体长度不一致。建议在客户端抓包分析HTTP请求的格式,与正常请求进行比较。
405 Method Not Allowed
请求方法不支持。
-
ALB自身限制:ALB不支持
TRACE请求方法。建议用其他方法替换。 -
后端服务限制:除
TRACE外,其他请求方法能否被处理取决于后端服务器是否支持。可直接运行curl -X METHOD http://<后端服务IP>:<服务端口>进行验证,其中METHOD为客户端使用的请求方法。
408 Request Timeout
请求超时,ALB主动断开连接。
-
客户端数据传输缓慢:在客户端到ALB请求超时时间内(默认60s),客户端只传输了部分数据(如仅传输了
HTTP Header而未传输HTTP Body)。建议抓包排查客户端是否存在性能瓶颈或其他异常。 -
客户端到ALB网络质量差:TCP的RTT(Round Trip Time)较大或存在丢包等网络问题。建议排查访问日志的
request_time和tcpinfo_rtt字段,或在客户端进行网络诊断。 -
ALB实例带宽限速:访问ALB实例的流量过大,触发带宽限速和丢包。建议通过云监控排查
出带宽和丢弃连接数指标。
414 URI Too Long
请求的URI长度超出限制,ALB或后端服务器拒绝服务。
-
ALB自身限制:ALB要求请求的URI长度不超过32KB,否则返回
414。建议缩短URI长度。如需传输大量数据,可使用POST方法,将数据放在请求体中传输,ALB支持最大50GB的POST请求体。 -
后端服务限制:如果URI没有超过ALB限制,但后端服务有更严格的长度限制,则ALB会透传后端返回的
414状态码。请排查后端服务。
463
仅当监听挂载IP类型服务器组时,才会返回463。
请求路径存在环路。请求通过ALB时,系统会在HTTP Header中追加ALICLOUD-ALB-TRACE字段(其值为基于规则ID生成的16位哈希值)。若检测到存在重复的规则ID,或ALICLOUD-ALB-TRACE字段数量超过16个,则判定为环路,ALB将停止转发请求以防止网络风暴引发的资源耗尽,并返回463状态码。
-
后端服务配置错误:后端服务配置有误导致请求被重新发送回ALB而形成环路。请排查ALB的后端服务配置。
-
网络架构设计缺陷:例如单条请求的转发链路上存在多个负载均衡实例。建议优化网络架构。
499 Client Closed Request
客户端主动断开连接。
-
客户端到ALB网络质量差:TCP的RTT(Round Trip Time)较大或存在丢包等网络问题。建议排查访问日志的
request_time和tcpinfo_rtt字段,或在客户端进行网络诊断。 -
ALB实例带宽限速:访问ALB实例的流量过大,触发带宽限速和丢包。建议通过云监控排查
出带宽和丢弃连接数指标。 -
后端处理请求时间过长:后端请求处理时间超过了客户端的请求超时时间。请检查访问日志中的
upstream_response_time字段,其值为后端处理请求的时间。如该值普遍较高,建议排查后端服务是否存在性能瓶颈。 -
客户端设置的请求超时时间过短:客户端未发送完请求就因为超时关闭了连接。建议检查访问日志中的
request_time字段,该字段代表客户端请求的总时间,参考该字段的值设置更合理的客户端请求超时时间。 -
客户端遇到未知问题:导致请求还未完成即提前关闭连接。建议排查客户端是否有提前关闭连接的行为。
500 Internal Server Error
后端服务器内部错误,无法执行请求。
-
后端直接返回500:建议检查访问日志,如
upstream_status为500,则很可能ALB透传了后端状态码。请排查后端服务。 -
后端服务器异常关闭连接:后端服务器在发送完响应前即异常关闭连接。请在后端服务器抓包排查连接异常关闭的原因。
503 Service Temporarily Unavailable
服务器暂时不可用,通常由于流量超限或后端服务不可用。
-
后端直接返回503:建议检查访问日志,如
upstream_status为503,则很可能ALB透传了后端状态码。请排查后端服务。 -
客户端请求触发ALB限速:
-
通过云监控查看
每秒请求数指标。 -
云监控展示分钟级数据,可能无法反映秒级超限情况。可检查访问日志,如
upstream_status字段的值为-,则请求未送达后端服务器。 -
检查响应数据包头部,如包含
ALB-QPS-Limited:Limited字段,则请求触发了ALB的限速。
-
-
客户端直接访问ALB的IP或通过域名访问时DNS解析异常:可能导致流量集中在少数几个IP从而超限。建议客户端通过ALB的域名访问(参考为ALB配置CNAME解析),并确保DNS解析正常。
-
监听没有配置后端服务器或配置的后端服务器权重为
0。
504 Gateway Timeout
后端服务器响应超时。
-
后端直接返回504:建议检查访问日志,如
upstream_status为504,则很可能ALB透传了后端状态码。请排查后端服务。 -
ALB与后端服务器建立连接超时:超时时间默认为5秒且无法修改。建议抓包排查后端服务器响应超时的原因。
-
后端服务器响应超时:连接请求超时时间默认为60秒。可查看云监控的
UpstreamResponseTime和访问日志的upstream_response_time来确定后端服务器是否响应超时。