使用负载均衡SLB时业务站点访问正常但是健康检查显示站点异常

使用负载均衡SLB时业务站点访问正常但是健康检查显示站点异常

更新时间:2020-10-22 14:14:43

问题描述

负载均衡SLB实例使用HTTP监听,同时配置了使用HEAD方法的健康检查功能。业务站点可以正常访问的情况下,健康检查却显示异常。为了模拟健康检查,同样使用HEAD方法以及nc命令测试业务站点的状态,示例命令如下。

echo -e "HEAD /test.html HTTP/1.0\r\n\r\n" | nc -t www.example.com 80

说明:命令中的test.html以及www.example.com仅为示例,现场以实际情况为准。

返回结果如下,HTTP状态码为404。

作为对比,使用curl命令测试业务站点的状态,示例命令如下。

curl -I http://www.example.com/test.html

返回结果如下,HTTP状态码为200,属于正常情况,与HEAD方法以及nc命令的结果不一致。

上述描述中主要包含的问题如下:

  • 问题一
    业务站点可以正常访问,为什么SLB的健康检查和模拟测试中的HEAD方法及nc命令均显示站点异常,但curl命令显示站点正常?
  • 问题二
    业务站点返回的HTTP状态码为404,为什么健康检查判定为异常?

问题原因

上述问题的原因如下:

  • 问题一
    上述三种方式产生不同结果的原因如下:
    • curl命令
      curl命令和通过浏览器访问的结果一致,均访问请求域名下的资源文件,即访问www.example.com域名下的test.html文件。
    • SLB实例的健康检查
      如果SLB实例未配置健康检查域名,则健康检查时的请求域名为后端服务器的IP地址,类似于192.0.2.1等IP地址。请求域名为IP地址时,Web服务器会将请求转发到默认站点,而默认站点下没有test.html文件,因此返回HTTP 404状态码。
      说明:此处以Nginx的默认配置为例,Nginx的默认配置中含有默认站点。
    • HEAD方法及nc命令的模拟测试
      HEAD方法本身没有问题,但是nc命令会将请求转发给域名对应的IP地址,和SLB实例的健康检查情况一致,最终请求到Web服务器的默认站点,因此返回HTTP 404状态码。
  • 问题二
    默认情况下,SLB实例的健康检查配置中以http_2xx和http_3xx作为正常状态码,除此之外的状态码均识别为异常状态码。HTTP 404属于http_4xx,因此健康检查判定为站点异常。

解决方案

针对本文中的两个问题,解决方案不同,分别如下:

  • 问题一
    关于此问题,有下列两种解决方案,您可以根据实际情况进行选择:
    • 完善SLB实例的健康检查配置
      您可以在SLB实例的健康检查配置中完善健康检查路径健康检查域名选项。以本文为例,您可以设置健康检查域名www.example.com健康检查路径/test.html。关于如何完善健康检查配置以及这两个选项的说明,请参见配置健康检查
    • 禁用Web服务器的默认站点
      您可以修改Web服务器的配置文件,禁用默认站点。不同的Web服务器配置方法不同,以下步骤以Nginx服务器为例。
      1. 远程登录Nginx所在服务器。
      2. 找到Nginx的主配置文件,此文件默认路径为/etc/nginx/nginx.conf。源码安装的Nginx,请自行确认Nginx主配置文件所在路径。
      3. 编辑Nginx的主配置文件,找到标记为default_server的server配置段,通过注释符井号(#)注释此段代码,退出并保存文件。
      4. 执行以下命令,确认更新后的配置文件无异常。
        nginx -t
        如果系统返回异常错误,请根据提示进行修复,直到系统返回以下内容。
        nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
        nginx: configuration file /etc/nginx/nginx.conf test is successful
      5. 执行以下命令,重新加载Nginx配置文件。
        nginx -s reload
      6. 重新检查SLB实例的健康检查状态。
  • 问题二
    您可以根据业务的实际情况,在SLB实例的健康检查配置中选择设定哪些HTTP状态码为正常状态。如果您认为HTTP 404不属于站点异常,您可以勾选http_4xx为正常状态码。关于如何设置SLB实例的健康检查,请参见配置健康检查

适用于

  • 负载均衡SLB

如果您的问题仍未解决,您可以在阿里云社区免费咨询,或提交工单联系阿里云技术支持。