ALB常用状态码有哪些及可能原因

在遇到ALB返回异常状态码时,您可以根据状态码的可能原因排查问题。本文为您介绍ALB常用状态码的说明及可能原因。

说明
  • ALB支持开启访问日志,开启该功能后,可以帮助您更快地定位问题。关于如何开启访问日志,请参见访问日志

  • 收到异常状态码时,请排查访问日志中ALB状态码(status)和后端状态码(upstream_status)是否相同,如果两者相同,很可能是由于直接透传后端状态码导致的,建议优先排查后端服务器透传状态码的原因。

400(Bad Request)

客户端HTTP请求格式异常。

可能原因:

  • 后端服务器直接返回400,ALB透传后端状态码给客户端,请排查后端服务器返回400的原因。

  • HTTP头部格式错误,例如content length与请求body长度不一致等,建议在客户端抓包分析HTTP请求的格式,并和正常的请求进行比较。

  • ALB实例添加了HTTPS监听,当客户端发送的请求不是HTTPS请求且返回400状态码时,建议排查客户端是否有将HTTP请求发送至HTTPS端口。

  • 在HTTP请求发送完成前,客户端主动关闭连接,建议抓包排查客户端断连原因。

  • ALB要求每个HTTP header最大不超过32 KB,超过该限制会返回400状态码,建议调整HTTP头部或标头的长度。

405(Method not allowed)

请求方法不支持。

可能原因:

  • 后端服务器不支持客户端请求使用的方法,建议排查客户端使用方法和后端服务器的方法是否匹配。例如,在后端服务器直接测试是否支持特定的method,使用curl -X method ip:port命令排查,其中,method为客户端请求使用的方法,ip为后端服务器的IP地址,port为后端服务器的端口。

  • ALB本身不支持TRACE请求方法,建议使用其他方法替换。

408(Request Timeout)

请求超时,ALB主动断开连接。

可能原因:

  • 在连接请求超时时间内,客户端只传输了部分数据(例如只有HTTP header而没有body),ALB主动断开连接。建议抓包排查客户端是否存在性能瓶颈或存在其他异常行为。您也可以通过调大ALB监听的连接请求超时时间,观察是否可以解决该问题。更多信息,请参见修改监听

  • 客户端到ALB的网络链路有问题,TCP的rtt(Round Trip Time)比较大或存在丢包等问题,建议排查访问日志的request_time和tcpinfo_rtt字段或抓包排查客户端网络是否有异常。

  • 访问ALB实例的流量太大,触发带宽限速和丢包,建议通过云监控排查实例的出带宽和丢弃连接数指标。更多信息,请参见ALB监控项说明查看ALB监控信息

414(URI too long)

客户端请求的URI长度超过了后端服务器能够解析的长度,因此ALB拒绝对该请求提供服务。

可能原因:

  • 后端服务器直接返回414,ALB透传后端状态码给客户端,请排查后端服务器返回414的原因。

  • 访问ALB请求的URI长度限制为32 KB,超过32 KB会返回414状态码,建议缩短URI长度,如果数据量很大建议采用POST传输数据(ALB POST请求的body体最大支持50 GB)。

499(Client Close Request)

客户端主动断开连接。

可能原因:

  • 客户端到ALB的网络链路有问题,存在rtt(Round Trip Time)比较大或丢包等问题,建议排查访问日志的request_time和tcpinfo_rtt字段或抓包排查客户端网络是否有异常。

  • 访问ALB实例的流量太大,触发带宽限速丢包,建议通过云监控排查实例的出带宽和丢弃连接数指标。更多信息,请参见ALB监控项说明查看ALB监控信息

  • 后端处理请求时间太长,超过了客户端的请求超时时间。访问日志中的upstream_response_time代表后端处理请求的时间,建议排查后端服务器的CPU、内存、网络是否存在性能瓶颈。

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

  • 客户端遇到未知问题,在未完成HTTP请求的情况下,提前关闭连接。建议排查客户端是否有提前关闭连接的行为。

500(Internal Server Error)

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

可能原因:

  • 后端服务器直接返回500,ALB透传后端状态码给客户端,请排查后端服务器返回500的原因。

  • 后端服务器在发送完响应之前异常关闭连接,请在后端服务器抓包确定并排查请求异常关闭的原因。

502(Bad Gateway)

HTTP或HTTPS监听接收到客户端连接请求后,ALB由于无法正常将请求转发至后端服务器或无法从后端服务器收到响应,则会向客户端发送HTTP 502 Bad Gateway状态码。

可能原因:

  • 后端服务器直接返回502,ALB透传后端状态码给客户端,请排查后端服务器返回502的原因。

  • ALB后端服务器返回其他错误的状态码(例如504、444),但ALB统一返回502。建议排查访问日志的upstream_status和status字段或抓包排查后端服务器是否有异常。

  • ALB与后端服务器之间TCP通信异常,请排查后端服务器的状态是否正常、服务端口是否正常被监听,或抓包查看TCP握手报文是否正常。

  • 后端服务器Backlog已满,导致报文丢弃。建议通过netstat查看后端服务器的网络统计结果是否有drop的计数,例如netstat -s | grep -i listen

  • 客户端发送的报文长度超过了后端服务器的最大传输单元(Maximum Transmission Unit,MTU),表现为健康检查或报文较短的包正常,但报文较长的包异常。建议在后端服务器抓包分析报文长度是否符合要求。

  • 后端服务器返回的报文格式异常或者有非法的HTTP标头。建议在后端服务器抓包,确认HTTP格式是否正常。

  • ALB后端服务器没有及时完成请求处理,请排查后端服务器的日志,并查看对应后端服务器的CPU、内存等的占用率。

503(Service Temporarily Unavailable)

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

可能原因:

  • 后端服务器直接返回503状态码,ALB透传后端状态码给客户端,请排查后端服务器返回503的原因。

  • 客户端请求的流量触发了ALB的限速。您可以使用以下三种方式排查:

    • 在云监控查看实例每秒请求数指标 。更多信息,请参见ALB监控项说明查看ALB监控信息

    • 由于云监控的展示是分钟级的,可能无法展示秒级超限情况,您可以通过访问日志查看秒级的请求数。查看访问日志的upstream_status字段,内容为“-”时,表示请求未发送至后端服务器。

    • 查看响应数据包头部是否包含字段“ALB-QPS-Limited:Limited”,若包含,表示请求触发了ALB的限速。

  • 客户端访问ALB时未使用域名而是直接访问ALB的IP,或者使用域名访问ALB时未及时更新DNS解析结果,导致流量不能在多个ALB IP之间打散,出现503错误码。建议客户端使用ALB的域名访问服务,同时尽量确保客户端均匀地使用DNS返回的IP来访问服务。

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

504(Gateway Time-out)

后端服务器响应超时。

可能原因:

  • 后端服务器直接返回504状态码,请排查后端服务器的负载是否过高。

  • ALB向后端服务器建立连接时,后端服务器建立连接超时,超时时间默认设置为5秒,您可以查看访问日志中的upstream_connect_time字段是否为5秒或者大约为5秒。建议抓包排查后端服务器响应超时的原因。

  • 后端服务器负载增大,响应请求的时间大于所配置的请求超时时间。比如配置的请求超时时间是60秒,如果响应时间为60.001秒,ALB将返回504。您可以在云监控或者访问日志中查看问题时间段的延时情况,云监控查看upstream_rt, 访问日志中查看upstream_response_time。