ALB按照您指定的健康检查配置向后端服务器发送探测请求,在连接错误或响应格式不正确时将该服务器标记为异常。本文为您介绍如何排查并解决ALB后端服务器健康检查异常的问题。
问题描述
ALB的健康检查功能用于探测您的后端ECS实例是否处于正常工作状态,当健康检查出现异常时,说明您的后端ECS实例出现了异常,或者是您的健康检查配置不正确。
问题原因
首次配置健康检查出现异常的主要原因是健康检查配置问题,可以通过以下两类原因进行检查。
- 健康检查参数设置错误
- 监听端口问题
配置成功后健康检查出现异常的主要原因是后端ECS实例出现问题,可以通过以下三类原因进行检查。
- 安全类防护软件问题
- 路由配置错误问题
- 后端ECS实例负载过高
解决方案
首次配置健康检查出现异常
原因一:健康检查参数设置错误
- 登录应用型负载均衡ALB控制台。
- 在顶部菜单栏,选择ALB的所属地域。
- 在左侧导航栏,选择 。
- 在服务器组页面,找到目标ALB实例挂载的服务器组,然后单击服务器组ID。
- 在服务组详情页面,在健康检查区域单击编辑健康检查。
- 在编辑健康检查对话框,检查健康检查参数设置是否正常,建议按照默认提供的健康检查参数进行设置。更多信息,请参见健康检查。
原因二:监听端口问题
- 登录应用型负载均衡ALB控制台。
- 在顶部菜单栏,选择ALB的所属地域。
- 在左侧导航栏,选择 。
- 在服务器组页面,找到目标ALB实例挂载的服务器组,然后单击服务器组ID。
- 在服务器组详情页,单击后端服务器页签,查看并记录后端ECS实例端口。
- 在服务组详情页面,单击详细信息页签,在健康检查区域单击编辑健康检查。在编辑健康检查对话框,查看并记录健康检查参数。
- 登录后端ECS实例,使用nc或curl命令对后端ECS实例进行探测。关于如何登录ECS,请参见ECS远程连接操作指南。
# nc命令: echo -e "[$Method] [$PATH] [$VERSION]\r\nHost: [$Domain]\r\n\r\n" | nc -t [$IP] [$Port] #格式 echo -e "HEAD /index.html HTTP/1.0\r\nHost: wwww.example.org\r\n\r\n" | nc -t 127.0.0.1 80 #示例 # curl命令: curl -X [$Method] -H "Host: [$Domain]" -I http://[$IP]:[$Port][$PATH] #格式 curl -X HEAD --http1.0 -H "Host: www.example.org" -I http://127.0.0.1:80/index.html #示例
说明- [$Method]为该服务器组设置的健康检查方法。
- [$PATH]为该服务器组设置的健康检查路径。
- [$VERSION]为该服务器组设置的健康检查中HTTP协议的版本,例如HTTP/1.0。
- [$Domain]为该服务器组设置的健康检查域名,如果该值为“-----”,说明默认使用各后端ECS实例的内网IP为域名,可以使用[$IP]代替。
- [$IP]为后端ECS实例内网IP地址。
- [$Port]为该服务器组设置的健康检查的探测端口,如果没有手动配置过健康检查端口,默认使用的是后端ECS实例端口,如果配置了健康检查端口,则使用配置的健康检查端口。
- 查看命令执行结果的状态码,结合业务判断返回的状态码是否属于正常情况下的返回。
- 如果判断返回的状态码是属于正常情况下的返回,且该状态码未在健康检查中配置,请修改健康检查的健康状态返回码。
- 如果判断返回的状态码异常,请参见下表进行排查。下表列出了可能返回的HTTP状态码及排查方法。
状态码 描述 排查方法 400 客户端HTTP请求格式异常 HTTP头部格式错误,例如content length为空、header的某些字段未使用大写字母等。请检查HTTP请求的格式。 404 未找到目标资源 请检查请求的URL是否正确。 405 健康检查请求方法不支持 请检查后端服务是否支持健康检查的请求方法。 500 服务器内部错误,无法完成请求 请检查后端服务的业务逻辑。 503 服务器暂时不可用 请检查后端服务的业务逻辑或负载是否过高。
配置成功后健康检查出现异常
原因一:安全类防护软件问题
ALB实例使用内网地址段100.64.0.0/10或VPC网段与后端ECS通信,请确保后端ECS实例没有对ALB实例的该网段进行任何形式的屏蔽,包括Iptables或其他任何第三方安全策略软件。
因为ALB通过内部保留地址段中的IP地址与后端ECS实例通信,ALB的该地址段被屏蔽会导致健康检查异常,ALB将无法正常工作。本文以Iptables检查100.64.0.0/10为例介绍。
- 登录问题后端ECS实例,执行以下命令,查看filter表的所有规则。
iptables -nL
如果返回类似以下信息,说明后端ECS实例禁止ALB内网地址段请求。 - 执行以下命令,删除此规则即可。
iptables -t filter -D INPUT -s 100.64.0.0/10 -j DROP
- 执行以下命令,确认没有禁止ALB内网地址段请求。
iptables -nL
原因二:路由配置错误问题
当ALB实例使用的内网地址段100.64.0.0/10在后端ECS上的路由配置错误时,也会导致ALB实例收不到健康检查探测的数据包,造成健康检查异常。本文以Linux下的route命令为例,检查路由配置情况。
- 登录问题后端ECS实例,执行以下命令,检查当前系统的路由配置情况。
route -n
若您发现存在路由条目的Destination为100.64.0.0,Genmask为255.192.0.0,且Gateway没有指向对应网卡的默认网关(当Destination为0.0.0.0时,Gateway显示的信息就是默认网关),则该路由配置错误。 - 执行以下命令,删除配置错误的100.64.0.0/10路由。
route del -net 100.64.0.0/10
原因三:后端ECS实例负载过高
参见Linux实例系统负载的查询及分析,查看是否是服务器负载过高导致的问题。