更新时间:2024-04-19 GMT+08:00

健康检查异常如何排查?

问题描述

客户端通过负载均衡器访问后端服务器异常,负载均衡器的“后端服务器组”页签显示后端服务器的健康检查结果为“异常”。

背景介绍

ELB的健康检查通过向后端服务器发起心跳检查的方式来实现,在检查过程中使用ELB后端子网所在的VPC地址通信。为确保健康检查正常进行,您需要确保服务器已经放通ELB后端子网所在的VPC网段。

当健康检查探测到您的后端服务器异常时,ELB将不再向异常的后端服务器转发流量。直到健康检查检测到后端服务器恢复正常时,ELB才会向此服务器继续转发流量。

对于共享型负载均衡,如果将健康检查正常的后端服务器的权重调整为0,则健康检查状态会显示为“异常”。

排查思路

以下排查思路根据原因的出现概率进行排序,建议您从高频率原因往低频率原因排查,从而帮助您快速找到问题的原因。

如果解决完某个可能原因仍未解决问题,请继续排查其他可能原因。

相关修改配置的操作,修改完配置后需要等待一定的时间,配置才会生效,因为健康检查包含检查间隔和阈值(根据默认配置为几十秒生效,如果健康检查恢复正常,在ELB关联的后端服务器基本信息界面可以看到健康检查状态是否正常)。

表1 排查思路

可能原因

处理措施

检查后端服务器组是否关联监听器

解决方法请参考检查后端服务器组是否关联监听器

检查ELB是否绑定EIP或私网IP

解决方法请参考检查ELB是否绑定EIP或私网IP

健康检查配置

解决方法请参考检查健康检查配置

服务器安全组配置

解决方法请参考检查服务器所在安全组

子网ACL配置

解决方法请参考检查网络ACL规则

后端服务器监听配置

解决方法请参考检查后端服务器是否正常

后端服务器防火墙配置

解决方法请参考检查服务器防火墙

后端服务器路由配置

解决方法请参考检查服务器路由

后端服务器负载过大

解决方法请参考检查服务器负载

后端服务器host.deny文件配置

解决方法请参考检查服务器hosts.deny文件

检查后端服务器组是否关联监听器

检查健康检查异常的服务器所在的后端服务器组是否关联了监听器。

  • 如果后端服务器组未关联监听器,请检查是否已创建了监听器。
    • 已经创建了监听器,请将后端服务器组关联至监听器。
    • 未创建监听器,请先添加监听器,然后为监听器绑定后端服务器组。
  • 如果后端服务器组已经关联了监听器,请再按照以下原因排查。

检查ELB是否绑定EIP或私网IP

  • 该检查项仅适用于四层监听器(TCP/UDP)。
  • 对于七层监听器(HTTP/HTTPS),无论ELB是否绑定弹性公网IP或私网IP,均不会影响后端服务器健康检查。

对于四层监听器(TCP/UDP),请检查其关联的负载均衡器是否绑定弹性公网IP或私网IP。

如果ELB未绑定弹性公网IP和私网IP,请绑定弹性公网IP或私网IP。

ELB初次创建时,如果未绑定EIP或私网IP时,四层监听器(TCP/UDP)所关联的后端服务器会显示健康检查异常。当给ELB绑定EIP或私网IP后,健康检查结果显示正常,再解绑EIP或私网IP后,健康检查结果依然会显示正常。

检查健康检查配置

单击对应的负载均衡名称,进入负载均衡基本信息页面。切换到“后端服务器组”页签,单击对应的后端服务器组名称,在其基本信息页面,单击“健康检查”右侧的配置按钮。查看以下参数:
  • 域名。健康检查使用HTTP协议时,如果后端服务器设置了校验HOST头能力,需要将后端服务器配置的域名填写到“健康检查配置”页面中的“域名”处。
  • 协议。
  • 端口。端口必须是后端服务器上真实业务所监听的端口,不是自定义端口。检查您配置的健康检查端口和监听的端口是否一致。不一致则会导致健康检查异常。
  • 检查路径。如果是使用HTTP健康检查需要查看此参数,建议配置简单的静态HTML文件。
  • 健康检查协议为“HTTP”,则会检查端口和路径。
  • 健康检查协议为“TCP”,则只检查端口。
  • 您的健康检查协议为“HTTP”,健康检查异常时,如果您已检查端口没有问题,请修改检查路径或者将健康检查协议修改为“TCP”,只检查端口。
  • 检查路径需填写绝对路径。

    例如:

    访问链接为:http://www.example.com或http://192.168.63.187:9096,则检查路径填写“/”。

    访问链接为:http://www.example.com/chat/try/,则检查路径填写“/chat/try/”。

    访问链接为:http://192.168.63.187:9096/chat/index.html,则检查路径填写“/chat/index.html”。

检查服务器所在安全组

  • TCP、HTTP或HTTPS协议监听器:后端服务器所在的安全组入方向规则无需放通100.125.0.0/16网段,但需放通ELB所在VPC的网段,并在TCP协议中放通健康检查的端口。
    • 健康检查端口与后端服务器业务端口相同:需要放通后端服务器的业务端口,例如80。
    • 健康检查端口与后端服务器业务端口不同:需要放通后端服务器的业务端口和健康检查端口,例如80和443。

      健康检查的协议和端口在配置的健康检查配置项提示框中获取。

    图1 安全组入方向规则配置示例
  • UDP协议监听器:不仅需要保证安全组入方向规则放通健康检查的协议、端口和ELB所在VPC的网段。还需要放通后端服务器所在安全组入方向的ICMP协议。
    图2 安全组入方向规则放通ICMP协议示例
  • 如果不确认是否是安全组问题,可以把安全组入方向规则的“协议”和“端口范围/ICMP类型”均放通Any测试下。
  • UDP协议监听器,也可以参考使用UDP协议有什么注意事项?

检查网络ACL规则

网络ACL是一个子网级别的可选安全层,通过与子网关联的出方向/入方向规则控制出入子网的数据流。网络ACL与安全组类似,都是安全防护策略,当您想增加额外的安全防护层时,就可以启用网络ACL。但是网络ACL默认规则会拒绝所有入站和出站流量,如果此网络ACL和负载均衡所属同一个子网,或者此网络ACL和负载均衡相关联的后端服务器所属同一个子网那么负载均衡的业务也会受到影响,收不到来自于公网或者私网的任何请求流量,或者会导致后端服务器异常。

您可以通过配置网络ACL入方向规则,放行源网段为ELB所在的VPC网段,目的端口为后端服务器端口。

  1. 登录管理控制台。
  2. 在管理控制台左上角单击图标,选择区域和项目。
  3. 单击页面左上角的,选择“网络 > 虚拟私有云”。
  4. 在左侧导航栏选择“访问控制 > 网络ACL”。
  5. 在“网络ACL”列表区域,选择网络ACL的名称列,单击您需要修改的“网络ACL名称”进入网络ACL详情页面。
  6. 在入方向规则或出方向规则页签,单击“添加规则”,添加入方向或出方向规则。
    • 类型:与后端服务器组的IP类型保持一致。
    • 协议:和监听器协议一致。
    • 源地址:此方向允许的源地址,填写为VPC网段。
    • 源端口范围:选择业务所在端口范围。
    • 目的地址:此方向允许的目的地址。选择默认值为0.0.0.0/0,代表支持所有的IP地址。
    • 目的端口范围:选择业务所在端口范围。
    • 描述:网络ACL规则的描述信息,非必填项。
  7. 单击“确定”。

检查后端服务器是否正常

如果后端服务器的操作系统为Windows,请通过浏览器直接访问https://后端服务器的IP : 健康检查配置的端口。如果返回码为2xx或3xx,则表示后端服务器正常。

  • 您可以在后端服务器上通过以下命令查看后端服务器的健康检查端口是否被健康检查协议正常监听。
    netstat -anlp | grep port

    回显中包含健康检查端口信息并且显示LISTEN,则表示后端服务器的健康检查端口在监听状态,如图3中表示880端口被TCP进程所监控。

    如果您没有配置健康检查端口信息,默认和后端服务器业务端口一致。
    图3 后端服务器正常被监听的回显示例
    图4 后端服务器没有被监听的回显示例

    如果健康检查端口没有在监听状态(后端服务器没有被监听),您需要先启动后端服务器上的业务,启动业务后再查看健康检查端口是否被正常监听。

  • 如果是HTTP健康检查,请您在后端服务器上执行以下命令查看回显中返回的状态码。
    curl 后端服务器的私有IP:健康检查端口/健康检查路径 -iv

    HTTP健康检查是ELB向后端服务器发起GET请求,当获取到以下所列的响应状态码,认为服务器是正常状态。

    对于TCP的监听器,HTTP健康检查正常返回状态码是200。

    对于ELB,HTTP健康检查正常返回状态码是200、202或者401。

    图5 后端服务器异常的回显示例
    图6 后端服务器正常的回显示例
  • 如果HTTP健康检查异常,除了检查健康检查路径外,建议您将配置的HTTP健康检查修改为TCP健康检查。操作如下:

    在监听器界面,修改目标监听器,在配置参数里选择已有TCP健康检查的后端服务器组,或者选择新创建TCP健康检查的后端服务器组。配置完成之后,几十秒后去查看健康检查状态是否恢复正常。

检查服务器防火墙

如果后端服务器内部开启了防火墙或其他安全类防护软件,这些软件可能会屏蔽ELB后端子网所在的VPC网段。

检查服务器路由

请检查是否手动修改了后端服务器内部的路由,查看主网卡(比如eth0)上是否配置默认路由,默认路由是否修改。如果默认路由更改,可能导致健康检查报文无法到达后端服务器。

您可以在后端服务器上通过以下命令查看您的默认路由是否指向网关(经过ELB转发属于跨网段访问,三层通信需要配置默认路由指向网关)。
ip route

route -n

正常的回显如图7所示。

图7 默认路由指向网关示例
图8 默认路由未指向网关示例

如果回显中没有像图7中的第一条路由信息,或者路由指向的IP的不是后端服务器所在VPC子网的网关,请您配置默认路由指向网关。

检查服务器负载

通过云监控服务,查看后端服务器的CPU/内存/网络连接数等,来判断后端服务器的负载是否过高。

如果负载很高,可能会导致健康检查的连接或请求超时。

检查服务器hosts.deny文件

建议您排查后端服务器的/etc/hosts.deny文件,文件中不能写入ELB后端子网所在的VPC网段。