Nginx健康检查
Nginx健康检查分为主动和被动两种,自带的健康检查模块为被动检查,主动检查模块需要依赖第三方模块
一、被动健康检查
被动检查就是只有当Nginx访问后,才会发起对后端的节点探测,这样就无法预先判断后端服务是否正常
自带的健康检查模块ngx_http_upstream_module,可实现基本健康检查,主要通过如下两个参数:
- max_fails:允许请求失败的次数,默认为1
- fail_timeout:如果达到了max_fails的失败次数,将暂停后端服务的时间,默认为10s
1、下面例子通过反向代理到tomcat和httpd ,如图:

通过反向代理请求server-proxy中的服务,如果失败一次,那么将停止这个server提供服务10s钟
此时通过浏览器访问http://10.9.2.247将会以轮询的方式分别请求tomcat和http,如图:


2、现在将httpd关闭,然后再次通过浏览器多次请求可以发现此时一直请求的是tomcat页面,查看error日志,可以发现内容如下:
2023/07/24 11:04:23 [error] 59839#59839: *552 connect() failed (111: Connection refused) while connecting to upstream, client: 10.9.2.99, server: _, request: "GET / HTTP/1.1", upstream: "http://10.9.2.247:88/", host: "10.9.2.247"
从上述错误可以看出,虽然页面请求一直是正常的,但实际在请求过程中还是会请求到已经不能提供服务的httpd上,这样就会造成一定的性能影响
二、主动检查
主动健康检查需要借助第三方模块nginx_upstream_check_module,此时nginx会动态探测后端服务,如果服务出现异常,那么将该服务从健康列表中移除,服务恢复后再次将该服务添加回健康列表中
1、下载nginx_upstream_check_module,如下:
wget https://github.com/yaoweibin/nginx_upstream_check_module/archive/master.zip
unzip master.zip
2、下载Nginx,将其和模块nginx_upstream_check_module放在同一级目录下并解压,如下:
unzip nginx-1.24.0.tar.gz
3、进入nginx源码目录,将nginx_upstream_check_module模块作为补丁打入,如下:
#-p0表示当前路径,-p1表示上一级路径
patch -p1 < ../nginx_upstream_check_module-master/check_1.20.1+.patch
#注意:check版本和Nginx版本要求有显示,可参考https://github.com/yaoweibin/nginx_upstream_check_module
4、编译安装Nginx,命令如下:
cd nginx-1.24.0
./configure --prefix=/usr/local/nginx --add-module=../nginx_upstream_check_module-master
make && make install
5、编辑nginx.conf文件,启用模块,如图:

- interval:每个3000ms执行一次健康检查,也就是3s
- rise:如果有2次健康检查结果为成功,表示服务状态正常
- fall:如果有5次健康检查失败,表示服务状态异常
- timeout:健康检查超时时间为1000ms,也就是1s
- type : 使用http类型的健康检查
- check_http_send:发送一个HTTP HEAD请求,协议为1.0
- \r\n – HTTP 请求的标准换行格式
- \r\n – 表示空行,分割 HTTP 请求头和 body
- check_http_expect_alive : 期望返回 2xx 或 3xx 状态码,表示服务器存活
当前状态也是轮询状态,因此通过浏览器访问http://10.9.2.247后将在tomcat和httpd页面之间轮询,跟上面一样,现在我们手动关闭httpd,然后观察nginx的error.log,可以看到后台已经开始提示服务不可用,如图:

此时nginx已经将这个服务从后端剥离,此时通过页面请求,看不到任何请求发送到httpd
6、配置状态检查,修改配置文件如下:

加载Nginx配置后,通过浏览器访问http://10.9.2.247/status,如图:

附加:
上面配置反向代理用的名字是server-proxy,如果不小心写成server_proxy,那么将会报错如图:

因此,反向代理名字不要用下横杠,否则会报错
除了上面模块外,还有一个模块可实现四层和7层的检查,如下:
https://github.com/zhouchangxun/ngx_healthcheck_module/blob/master/README-zh_CN.md


