ALB异常状态码

更新时间:
复制 MD 格式

建议开启ALB访问日志,帮助快速排查ALB返回的HTTP异常。用户可以优先排查访问日志中的ALB状态码(status)和后端状态码(upstream_status)是否相同。若两者相同,很可能ALB直接透传了后端状态码,建议优先排查后端服务的异常原因。

先做这5项快速自检

在按状态码深入排查前,建议先按顺序检查以下5项配置。这些是 ALB 故障最高频的根因。

  1. 运行ALB实例诊断工具。实例页面,找到目标实例,在实例诊断列单击发起诊断,可一键检测实例配置、监听、后端服务等常见问题。

  2. 确认监听对应的健康检查状态正常监听详情页查看后端服务器组的健康检查状态。如显示异常,请参见ALB健康检查异常排查方法

  3. 确认后端 ECS 未屏蔽 ALB 实例所属交换机的网段。ALB 通过其所在交换机分配的 Local IP 与后端通信。若后端 ECS 的 iptables 或第三方安全软件屏蔽了 ALB 交换机网段,将导致 ALB 无法访问后端,触发 502/504 等异常。

  4. 确认服务器组中后端服务器配置的端口与后端服务实际监听的端口一致。在 ALB 服务器组中为每台后端服务器配置的端口,必须与该服务器上业务进程实际监听的端口相同。例如服务器组中配置为 8080,但后端服务实际监听 80,将导致连接失败。可在后端 ECS 执行 ss -tlnp | grep ':<端口> 'netstat -tlnp | grep ':<端口> '

  5. HTTPS 监听:确认证书未过期且证书绑定的域名与访问域名匹配。监听详情页查看绑定的证书及有效期。证书过期或域名不匹配会触发 SSL 握手失败或返回异常状态码。

502 Bad Gateway

HTTP 或 HTTPS 监听接收客户端请求后,ALB 无法正常将请求转发至后端服务器,或无法从后端服务器收到响应。

排查思路:先检查访问日志中 upstream_status 字段的值,根据该字段的值判断后续排查方向。

  • upstream_status = 502:ALB 透传了后端返回的 502 状态码,问题在后端服务自身。请排查后端服务,例如后端 Nginx、网关层是否反向代理到了不可达的上游。

  • upstream_status 是其他值(如 504444500 等):访问日志中 ALB 对外返回的 statusupstream_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监听:ALBHTTPS监听会拒绝非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网络质量差:TCPRTT(Round Trip Time)较大或存在丢包等网络问题。建议排查访问日志的request_timetcpinfo_rtt字段,或在客户端进行网络诊断。

  • ALB实例带宽限速:访问ALB实例的流量过大,触发带宽限速和丢包。建议通过云监控排查出带宽丢弃连接数指标。

413 Request Entity Too Large

请求体过大。ALB对请求体(Body)的大小限制为50 GB,一般请求不会触发此限制。

排查思路:检查访问日志中 upstream_status 字段的值,判断413ALB主动返回还是后端服务器透传。

  • upstream_status- 或为空:ALB主动返回413,表示请求体超过了ALB自身的大小限制(50 GB)。此情况较少见。请检查客户端发送的请求体大小是否确实超过了限制。

  • upstream_status = 413:后端服务器返回413并由ALB透传,此情况更常见。通常是后端代理服务器(如Nginx)配置了请求体大小限制。请排查后端服务的相关配置,例如Nginxclient_max_body_size 参数。

414 URI Too Long

请求的URI长度超出限制,ALB或后端服务器拒绝服务。

  • ALB自身限制:ALB要求请求的URI长度不超过32KB,否则返回414。建议缩短URI长度。如需传输大量数据,可使用POST方法,将数据放在请求体中传输,ALB支持最大50GBPOST请求体。

  • 后端服务限制:如果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网络质量差:TCPRTT(Round Trip Time)较大或存在丢包等网络问题。建议排查访问日志的request_timetcpinfo_rtt字段,或在客户端进行网络诊断。

  • ALB实例带宽限速:访问ALB实例的流量过大,触发带宽限速和丢包。建议通过云监控排查出带宽丢弃连接数指标。

  • 后端处理请求时间过长:后端请求处理时间超过了客户端的请求超时时间。请检查访问日志中的upstream_response_time字段,其值为后端处理请求的时间。如该值普遍较高,建议排查后端服务是否存在性能瓶颈。

  • 客户端设置的请求超时时间过短:客户端未发送完请求就因为超时关闭了连接。建议检查访问日志中的request_time字段,该字段代表客户端请求的总时间,参考该字段的值设置更合理的客户端请求超时时间。

  • 客户端遇到未知问题:导致请求还未完成即提前关闭连接。建议排查客户端是否有提前关闭连接的行为。

500 Internal Server Error

后端服务器内部错误,无法执行请求。

  • 后端直接返回500:建议检查访问日志,如upstream_status500,则很可能ALB透传了后端状态码。请排查后端服务。

  • 后端服务器异常关闭连接:后端服务器在发送完响应前即异常关闭连接。请在后端服务器抓包排查连接异常关闭的原因。

503 Service Temporarily Unavailable

服务器暂时不可用,通常由于流量超限或后端服务不可用。

  • 后端直接返回503:建议检查访问日志,如upstream_status503,则很可能ALB透传了后端状态码。请排查后端服务。

  • 客户端请求触发ALB限速

    • 通过云监控查看每秒请求数指标。

    • 云监控展示分钟级数据,可能无法反映秒级超限情况。可检查访问日志,如upstream_status字段的值为-,则请求未送达后端服务器。

    • 检查响应数据包头部,如包含ALB-QPS-Limited:Limited字段,则请求触发了ALB的限速。

  • 客户端直接访问ALBIP或通过域名访问时DNS解析异常:可能导致流量集中在少数几个IP从而超限。建议客户端通过ALB的域名访问(参考ALB配置CNAME解析),并确保DNS解析正常。

  • 监听没有配置后端服务器或配置的后端服务器权重为0

ALB Ingress 默认转发规则导致 503

在 ACK 集群中安装 ALB Ingress 组件后,组件会在 ALB 实例下自动创建一条默认转发规则及对应的服务器组,该服务器组初始为空。

当请求到达 ALB 但未匹配任何已配置的 Ingress 域名转发规则时,请求被路由到该默认转发规则。由于默认服务器组为空,ALB 无后端可转发,返回 503 Service Temporarily Unavailable 错误。

此为预期行为,无需手动删除默认转发规则。如需解决,请在 ACK 集群中配置正确的 Ingress 域名转发规则,将业务流量路由到对应的后端服务器组。

说明

503 与 502 的区别:503 表示服务器组为空、ALB 无后端可转发;502 表示有后端服务器但后端服务不可用(如后端进程异常)。

504 Gateway Timeout

后端服务器响应超时。

  • 后端直接返回504:建议检查访问日志,如upstream_status504,则很可能ALB透传了后端状态码。请排查后端服务。

  • ALB与后端服务器建立连接超时:超时时间默认为5秒且无法修改。建议抓包排查后端服务器响应超时的原因。

  • 后端服务器响应超时连接请求超时时间默认为60秒。可查看云监控的UpstreamResponseTime和访问日志的upstream_response_time来确定后端服务器是否响应超时。

HTTPS 监听 TLS 握手失败排查

ALB HTTPS 监听在 TLS 握手阶段收到 Handshake Failure (40) 错误,通常由以下三种原因引起。可按顺序逐一排查。

原因一:SNI 与证书域名不匹配

客户端 TLS Client Hello 中携带的 SNI(Server Name Indication)ServerName 字段值,与 ALB 监听绑定的证书域名不匹配,ALB 无法选择合适的证书完成握手。

排查步骤

  1. 使用 Wireshark 抓取客户端发出的 TLS Client Hello 包,查看 Extension: server_name 字段中 Server Name 的实际值。

  2. 在 ALB 控制台进入目标 HTTPS 监听,单击证书管理,查看绑定的默认服务器证书及其绑定域名(例如 alb-test.example.com)。

  3. 对比 SNI ServerName 与证书绑定域名是否一致。如不一致,请确认客户端请求的 Host 头是否正确,或在监听上绑定与客户端 SNI 匹配的证书。

原因二:客户端与 ALB 加密套件无交集

客户端 Client Hello 中支持的加密套件列表,与 ALB 监听TLS 安全策略中配置的加密套件列表没有交集,握手阶段无法协商出双方均支持的套件。

排查步骤

  1. 执行以下命令,查看 TLS 握手协商过程并获取服务端下发的套件信息;也可通过 Wireshark 抓包获取客户端 Client Hello 中支持的完整加密套件列表:

    openssl s_client -connect <ALB域名>:443
  2. 在 ALB 控制台进入目标 HTTPS 监听详情,查看当前配置的TLS 安全策略名称(例如 tls_cipher_policy_1_0)。单击策略名称后的查看全部加密套件,查看该策略支持的完整套件列表(tls_cipher_policy_1_0 支持 TLS v1.0/v1.1/v1.2,共 19 个套件:6 个 ECDSA 类、6 个 RSA 类、7 个非 ECDHE 类)。

  3. 对比客户端支持的加密套件与安全策略中的套件列表,确认是否存在交集。如无交集,可在 ALB 控制台将 HTTPS 监听的安全策略更换为与客户端兼容的策略,或在客户端侧添加与当前安全策略兼容的加密套件。

原因三:证书签名算法与加密套件类型不匹配

TLS 安全策略包含要求 ECDSA 签名算法的加密套件,但 HTTPS 监听上仅配置了 RSA 证书,导致这些 ECDSA 类套件无法参与协商,可能造成握手失败。

排查步骤

  1. 在 ALB 控制台进入目标 HTTPS 监听详情,找到SSL 证书区域,查看当前绑定的证书名称、ID 及绑定域名。该区域不直接显示签名算法类型。

  2. 单击证书 ID 链接,跳转至 SSL 证书管理控制台,查看该证书的签名算法类型(RSA 或 ECDSA)。

  3. 回到监听详情页,确认当前TLS 安全策略所含套件类型。若安全策略包含 ECDSA 类套件(例如 tls_cipher_policy_1_0 含 6 个 ECDSA 类套件),但监听仅配置了 RSA 证书,则需在监听上补充绑定对应类型的 ECC 证书(ECDSA 算法证书)。