# Nginx健康检测模块
# 背景简介
被动健康检查 Nginx自带的健康检查模块 ngx_http_upstream_module 属于被动健康检测,只有当访问时才发起对后端节点探测。如果本次请求中节点正好出现故障, Nginx依然将请求转交给故障的节点,然后再转交给健康的节点处理。所以不会影响到这次请求的正常进行。但是会影响效率,因为多了一次转发,而且自带模块无法做到预警。
主动健康检查 是指Nginx定时主动地去检测后端的服务列表,当发现某服务出现异常时,把该服务从健康列表中移除,当发现某服务恢复时,又能够将该服务加回健康列表中。区别于nginx自带的非主动式的心跳检测,淘宝开发的tengine自带了一个提供主动式后端服务器心跳检测模块nginx_http_upstream_check_module。
# 适用场景
负载均衡环境: 在使用 Nginx 进行负载均衡的环境中,通过健康检查模块,可以自动检测后端服务器的健康状态,并将不健康的服务器从负载均衡池中移除。避免向故障服务器发送请求,提升用户访问的可靠性。
高可用系统: 对于高可用性系统,通过定期检测后端服务器的健康状态,确保系统能够在某些服务器出现故障时仍然正常运行。提供快速故障检测和恢复能力。
动态伸缩场景: 在使用自动扩展和缩减的场景中,通过健康检查模块,可以自动发现新加入的服务器并将其加入负载均衡池中,同时移除已失效的服务器。 动态调整负载均衡策略,适应业务流量的变化。
微服务架构: 在微服务架构中,每个服务通常由多个实例组成,通过健康检查模块可以监控每个实例的健康状态,确保请求分发到可用的实例。 提高微服务的可靠性和可维护性。
灰度发布和蓝绿部署: 在灰度发布或蓝绿部署过程中,通过健康检查模块可以确保新版本的服务实例在健康状态下接收流量。 实现平滑过渡和快速回滚,降低发布风险。
# 安装步骤
# 1.准备环境
下载nginx源码包 https://nginx.org/en/download.html 下载健康检测模块源码 https://github.com/yaoweibin/nginx_upstream_check_module 以及其他编译nginx时需要的依赖,参考:https://open.seeyoncloud.com/v5doc/142/1190/1223.html#%E8%87%AA%E4%B8%BB%E5%AE%89%E8%A3%85%E9%85%8D%E7%BD%AEnginx
服务器(linux)安装patch命令 yum install patch -y
nginx-1.26.1.tar.gz 解压至 /opt/nginx-1.26.1/
master.zip 解压至 /opt/nginx_upstream_check_module/
# 2.编译安装
2.1 安装补丁包 注意参考github选择对应nginx的版本,当前nginx-1.26.1使用1.20.1的补丁
# 进入nginx源码目录
cd /opt/nginx-1.26.1/
patch -p1 < /opt/nginx_upstream_check_module/check_1.20.1+.patch
# 注意 如果需要同时编译sticky模块,sticky模块也需要打健康检测的补丁
# 进入sticky源码目录
cd nginx-sticky-module
patch -p0 < /opt/nginx_upstream_check_module/nginx-sticky-module.patch
nginx 1.24、1.26等高版本编译sticky模块时报错: ngx_http_sticky_module.c: error: 'ngx_http_headers_in_t' has no member named 'cookies'
需修改源码:
# 进入sticky源码目录
cd nginx-sticky-module
sed -i "s/ngx_http_parse_multi_header_lines.*/ngx_http_parse_multi_header_lines(r, r->headers_in.cookie, \&iphp->sticky_conf->cookie_name, \&route) != NULL){/g" ngx_http_sticky_module.c
2.2 编译安装nginx
# 对已有nginx增加健康检测模块时可以通过 sbin/nginx -V 查看nginx的编译命令
./configure --prefix=/usr/local/nginx-1.26.1 --add-module=/opt/nginx-sticky-module --add-module=/opt/nginx_upstream_check_module/ 等等...
make
make install
# 3.配置
3.1 例:
upstream seeyon {
server 192.168.0.1:80;
server 192.168.0.2:80;
stikcy;
check fall=3 interval=3000 rise=2 timeout=2000 type=http;
check_http_expect_alive http_2xx http_3xx;
check_http_send "GET /seeyon/main.do HTTP/1.0\r\n\r\n";
}
3.2 参数介绍
check:
Syntax: check interval=milliseconds [fall=count] [rise=count] [timeout=milliseconds] [default_down=true|false] [type=tcp|http|ssl_hello|mysql|ajp] [port=check_port]
Default: interval=30000 fall=5 rise=2 timeout=1000 default_down=true type=tcp
# check 字段各个参数含义如下:
interval:向后端发送的健康检查包的间隔,单位为毫秒。
fall(fall_count): 如果连续失败次数达到fall_count,服务器就被认为是down。
rise(rise_count): 如果连续成功次数达到rise_count,服务器就被认为是up。
timeout: 后端健康请求的超时时间。
default_down: 设定初始时服务器的状态,如果是true,就说明默认是down的,如果是false,就是up的。
默认值是true,也就是一开始服务器认为是不可用,要等健康检查包达到一定成功次数以后才会被认为是健康的。
type:健康检查包的类型,现在支持以下多种类型
tcp:简单的tcp连接,如果连接成功,就说明后端正常。
ssl_hello:发送一个初始的SSL hello包并接受服务器的SSL hello包。
http:发送HTTP请求,通过后端的回复包的状态来判断后端是否存活。
mysql: 向mysql服务器连接,通过接收服务器的greeting包来判断后端是否存活。
ajp:向后端发送AJP协议的Cping包,通过接收Cpong包来判断后端是否存活。
port: 指定后端服务器的检查端口。可以指定不同于真实服务的后端服务器的端口,比如后端提供的是443端口的应用,你可以去检查80端口的状态来判断后端健康状况。默认是0,表示跟后端server提供真实服务的端口一样
check_http_expect_alive:
# 指定主动健康检查时HTTP回复的成功状态
Syntax: check_http_expect_alive [ http_2xx | http_3xx | http_4xx | http_5xx ]
Default: http_2xx | http_3xx
check_http_send:
# 配置http健康检查包发送的请求内容
Syntax: check_http_send http_packet
Default: "GET / HTTP/1.0\r\n\r\n"