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

问题描述

负载均衡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