问题描述
负载均衡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服务器为例。
远程登录Nginx所在服务器。
找到Nginx的主配置文件,此文件默认路径为
/etc/nginx/nginx.conf
。源码安装的Nginx,请自行确认Nginx主配置文件所在路径。编辑Nginx的主配置文件,找到标记为default_server的server配置段,通过注释符井号(#)注释此段代码,退出并保存文件。
执行以下命令,确认更新后的配置文件无异常。
nginx -t
如果系统返回异常错误,请根据提示进行修复,直到系统返回以下内容。
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful
执行以下命令,重新加载Nginx配置文件。
nginx -s reload
重新检查SLB实例的健康检查状态。
问题二:您可以根据业务的实际情况,在SLB实例的健康检查配置中选择设定哪些HTTP状态码为正常状态。如果您认为HTTP 404不属于站点异常,您可以勾选http_4xx为正常状态码。关于如何设置SLB实例的健康检查,请参见配置健康检查。
适用于
负载均衡SLB