建议开启访问日志,帮助快速定位 CLB 返回的异常状态码。用户可以优先排查访问日志中的状态码(status)和后端状态码(upstream_status)是否相同。若两者相同,很可能 CLB 直接透传了后端状态码,建议优先排查后端服务的异常原因;若只有状态码(status),则可能是客户端访问异常导致。
先做这5项快速自检
在按状态码深入排查前,建议先按顺序检查以下5项配置。这些是 CLB 故障最高频的根因,提前确认可避免在状态码章节中走弯路。
-
运行 CLB 实例诊断工具。在 CLB 实例列表页找到目标实例,在实例诊断列单击发起诊断,可一键检测实例配置、监听、后端服务等常见问题。
-
确认监听对应的健康检查状态为正常。在实例监听页查看后端服务器组的健康检查状态。如显示异常,请参见CLB健康检查FAQ。
-
确认后端 ECS 安全组已放行
100.64.0.0/10网段。该网段是 CLB 与后端通信使用的内部网段(阿里云保留地址,无安全风险)。若后端 ECS 安全组、iptables 或第三方安全软件拦截了该网段,将导致 CLB 无法访问后端,触发 502/504 等异常。 -
确认服务器组中后端服务器配置的端口与后端服务实际监听的端口一致。在 CLB 服务器组中为每台后端服务器配置的端口,必须与该服务器上业务进程实际监听的端口相同。例如服务器组中配置为
8080,但后端服务实际监听80,将导致连接失败。可在后端 ECS 执行ss -tlnp | grep ':<端口> '或netstat -tlnp | grep ':<端口> '。 -
HTTPS 监听:确认证书未过期且证书绑定的域名与访问域名匹配。在监听详情页查看绑定的证书及有效期。证书过期或域名不匹配会触发 SSL 握手失败或返回异常状态码。
502(Bad Gateway)
HTTP 或 HTTPS 监听接收客户端请求后,CLB 无法将请求成功转发至后端服务器,或无法从后端服务器收到响应。
排查思路:先看访问日志中 upstream_status 字段的值,根据该值判断后续排查方向。
-
当
upstream_status= 502:后端服务自身返回了 502,CLB 透传给客户端。请排查后端 Nginx、网关层或应用日志。 -
当
upstream_status是其他值(如 504、444、500 等):访问日志中 CLB 对外返回的status与upstream_status不一致,说明 CLB 做了状态码转换。请按upstream_status真实值排查后端服务为何返回该状态码(查后端 Nginx、网关或应用日志)。 -
当
upstream_status为-或为空:CLB 没有收到后端的任何响应,说明请求未到达后端、或后端在响应前异常断开。请按以下顺序逐项排查:-
CLB 与后端服务器 TCP 通信异常。请排查后端服务状态是否正常、服务端口是否正常监听、后端 ECS 安全组是否放行了
100.64.0.0/10网段(CLB 与后端通信使用的内部网段)。可抓包查看 TCP 握手是否正常。 -
后端服务器 Backlog 已满。将导致新的连接请求被拒绝或丢弃。可在后端服务器执行
netstat -s | grep -i listen,查看是否有drop计数。 -
后端服务器没有及时处理完请求。请检查后端服务器的日志,并查看 CPU、内存等占用率,确认是否存在性能瓶颈。
-
客户端发送报文长度超过后端服务器的 MTU。表现为健康检查或其他报文较短的包正常,但报文较长的包异常。建议在后端服务器抓包分析报文长度是否符合要求。
-
后端服务器响应的报文格式异常或含非法 HTTP 标头。建议在后端服务器抓包,分析响应报文的格式是否规范。
-
服务器组中所有后端服务器健康检查都异常。CLB 无可用后端,直接返回 502。请排查监听的健康检查配置和后端服务状态,参考如何排查健康检查异常?。
-
400(Bad Request)
HTTP 请求格式异常。
-
后端服务器自身返回 400。
upstream_status=400,CLB 透传。常见于 CLB 访问后端时使用 HTTP 协议但后端使用 HTTPS 协议、或后端服务器有特殊的报文校验逻辑。请排查后端服务为何返回 400。 -
客户端发起的请求 HTTP 头部格式错误。例如
Content-Length与请求 body 长度不一致、请求方法未大写、Header 超过 32 KB 限制。建议在客户端抓包分析 HTTP 请求格式,并与正常请求进行比较。 -
客户端将 HTTP 请求发送到了 CLB 的 HTTPS 监听端口。CLB 拒绝并返回 400。请检查客户端是否误用协议。
-
在 HTTP 请求发送完成前,客户端主动关闭了连接。建议抓包排查客户端断连原因。
405(Method not allowed)
请求方法不支持。
-
后端服务器不支持客户端使用的请求方法。
upstream_status=405。可在后端服务器执行curl -X method ip:port验证(其中 method 为客户端请求方法、ip 为后端 IP、port 为后端端口)。请排查客户端方法和后端支持范围是否匹配。 -
CLB 本身不支持 TRACE 请求方法。建议使用其他方法替换。
408(Request Timeout)
请求超时,CLB 主动断开连接。
-
客户端只传输了部分数据。在客户端到 CLB 请求超时时间内(默认 60 秒),客户端只传输了部分数据(如只有 HTTP Header 而无 Body)。建议抓包排查客户端是否存在性能瓶颈或异常行为。
-
客户端到 CLB 网络链路质量差。TCP 的 RTT(Round Trip Time)较大或存在丢包。建议排查访问日志中
request_time和tcpinfo_rtt字段,或在客户端做网络诊断。 -
访问 CLB 实例的流量过大,触发带宽限速和丢包。建议通过云监控排查实例的出带宽和丢弃连接数指标。
414(URI too long)
客户端请求的 URI 长度超过限制,CLB 拒绝服务。
-
后端服务器自身返回 414。
upstream_status=414。后端对 URI 长度的限制比 CLB 更严格。请缩短客户端 URI,或调大后端服务器对 URI 长度的限制。 -
客户端请求的 URI 长度超过 CLB 自身 32 KB 限制。请缩短 URI 长度;如数据量大,建议改用 POST 方法将数据放入请求 body。
499(Client Closed Request)
客户端主动断开连接。
-
客户端到 CLB 网络链路质量差。TCP 的 RTT 较大或存在丢包。建议排查访问日志中
request_time和tcpinfo_rtt字段,或抓包诊断客户端网络。 -
访问 CLB 实例的流量过大,触发带宽限速和丢包。建议通过云监控排查实例的出带宽和丢弃连接数指标。
-
后端处理请求时间过长。超过了客户端的请求超时时间(访问日志中
upstream_response_time代表后端处理时间)。建议排查后端服务器的 CPU、内存、网络是否存在性能瓶颈。 -
客户端设置的请求超时时间过短。导致客户端在请求未完成时关闭连接(访问日志中
request_time代表客户端请求总时间)。建议参考该字段调整客户端超时配置。 -
客户端遇到未知问题。导致请求未完成时主动关闭连接。建议排查客户端是否有提前关闭连接的行为。
500(Internal Server Error)
后端服务器内部错误。
-
后端服务器自身返回 500。
upstream_status=500,CLB 透传。请结合后端服务器的错误日志排查根因。 -
后端服务器在发送完响应之前异常关闭了连接。请在后端服务器抓包排查连接异常关闭的原因。
503(Service Temporarily Unavailable)
服务暂时不可用,通常由于流量超限或后端服务不可用。
-
后端服务器自身返回 503。
upstream_status=503,CLB 透传。请结合后端服务器的日志排查根因。 -
客户端请求流量触发了 CLB 的限速。可通过云监控查看每秒请求数指标。由于云监控展示是分钟级的,可能无法展示秒级超限情况,可通过访问日志查看秒级请求数(
upstream_status字段为-时表示请求未送达后端)。解决方案:
提升 CLB 实例规格。
通过云解析 DNS 将域名指向多个 CLB 实例分摊流量。
四层业务可改用 NLB 获取更大并发。
七层业务可改用 ALB 获取更高 QPS。
-
CLB 监听未配置后端服务器,或后端服务器的权重为 0。
504(Gateway Time-out)
后端服务器响应超时。
-
后端服务器自身返回 504。
upstream_status=504,CLB 透传。常见原因是后端访问其他内部服务时超时。请排查后端访问的其他内部服务。 -
CLB 与后端服务器建立连接时超时。建立连接超时时间默认 5 秒,不可修改。可查看访问日志中
upstream_connect_time字段是否接近 5 秒。建议抓包排查后端响应慢的原因。 -
后端服务器响应请求的时间超过了 CLB 的请求超时时间。默认 60 秒。可在云监控查看
upstream_rt指标,或访问日志的upstream_response_time字段确认。