2026.05.22 | youres | 15次围观
Nginx负载均衡健康检查配置详解:主动被动检测与故障自动切换完整实战
在负载均衡架构中,后端服务器故障是导致业务不可用常见原因之一。如果没有健康检查机制,负载均衡会把用户请求持续转发到故障节点,导致大量请求失败。Nginx提供两种健康检查实现方式:原生被动健康检查、主动健康检查,本文将详细讲解两种方式的配置方法、适用场景以及生产环境最佳实践。
一、什么是Nginx负载均衡健康检查
健康检查是指负载均衡节点定期或在转发请求时,检查后端服务器的可用状态,自动将故障节点从转发列表中摘除,待节点恢复后再重新加入,从而保证转发到后端的请求都能得到正常响应。
二、被动健康检查:Nginx原生能力
被动健康检查是Nginx内置的能力,无需安装额外模块,通过upstream配置块的两个参数实现,配置简单,适合中小型业务场景。
1. 核心参数配置
在upstream配置中,为每个后端服务器配置max_fails和fail_timeout参数:
http {
upstream backend {
# 10秒内失败3次则标记该节点不可用,后续10秒不再转发请求到该节点
server 192.168.1.10:8080 max_fails=3 fail_timeout=10s;
server 192.168.1.11:8080 max_fails=3 fail_timeout=10s;
}
server {
location / {
proxy_pass http://backend;
}
}
}
max_fails:在fail_timeout时间内,转发到该节点的请求失败次数达到该值,则标记节点为不可用fail_timeout:两个作用,一是定义统计失败次数的时间窗口,二是节点被标记为不可用后,等待多久再次尝试转发请求
2. 被动检查的局限性
- 只有转发请求时才会触发检查,没有请求时无法感知后端故障
- 首次转发到故障节点时,用户会收到错误响应,直到失败次数达到阈值才会摘除节点
- 无法自定义检查逻辑,只能根据请求响应判断节点状态
三、主动健康检查:实时探测后端状态
主动健康检查是指Nginx定时主动向后端服务器发送探测请求,根据响应结果判断节点状态,故障感知更及时,适合对可用性要求较高的业务场景。Nginx实现主动健康检查有两种方案:
1. 开源方案:nginx_upstream_check_module
该模块是淘宝开源的Nginx第三方模块,实现了完整的主动健康检查能力,需要编译到Nginx中才能使用。
第一步:下载模块源码,打对应Nginx版本的补丁,编译安装Nginx时添加该模块:
# 下载Nginx源码和模块源码
wget http://nginx.org/download/nginx-1.25.3.tar.gz
wget https://github.com/yaoweibin/nginx_upstream_check_module/archive/refs/tags/v0.4.0.tar.gz
# 解压并打补丁
tar xf nginx-1.25.3.tar.gz
tar xf v0.4.0.tar.gz
cd nginx-1.25.3
patch -p1 < ../nginx_upstream_check_module-0.4.0/check_1.20.1+.patch
# 编译安装,添加模块
./configure --add-module=../nginx_upstream_check_module-0.4.0
make && make install
第二步:配置主动健康检查:
http {
upstream backend {
server 192.168.1.10:8080;
server 192.168.1.11:8080;
# 每隔3秒检查一次,成功2次标记为健康,失败3次标记为不可用,超时时间1秒,使用HTTP协议检查
check interval=3000 rise=2 fall=3 timeout=1000 type=http;
# 发送HEAD请求到后端/health端点,减少带宽占用
check_http_send "HEAD /health HTTP/1.0\r\n\r\n";
# 响应状态码为2xx或3xx时认为节点健康
check_http_expect_alive http_2xx http_3xx;
}
server {
location / {
proxy_pass http://backend;
}
# 健康检查状态查看页面,仅允许管理员IP访问
location /check_status {
check_status;
access_log off;
allow 127.0.0.1;
deny all;
}
}
}
2. Nginx Plus原生主动健康检查
如果使用付费版Nginx Plus,无需编译第三方模块,直接使用内置的health_check指令即可实现主动健康检查:
http {
upstream backend {
server 192.168.1.10:8080;
server 192.168.1.11:8080;
zone backend 64k;
}
server {
location / {
proxy_pass http://backend;
# 每隔3秒检查/health端点,失败3次标记为不可用,成功2次标记为健康
health_check interval=3s fails=3 passes=2 uri=/health;
}
}
}
四、生产环境健康检查最佳实践
- 检查端点要轻量:后端服务的健康检查端点不要返回大量数据,也不要依赖数据库、缓存等重资源,避免高频检查请求打垮后端服务
- 检查间隔要合理:间隔太短会增加后端压力,太长会导致故障感知滞后,一般建议设置为3-5秒,根据业务实际情况调整
- 主动+被动结合使用:主动检查实时感知故障,被动检查作为兜底,双重保障提升可用性
- 健康检查状态要监控:将Nginx健康检查状态接入监控系统,节点状态变化时及时发送告警,方便运维人员快速处理
- 不要对检查请求做负载均衡:健康检查请求是Nginx直接向后端节点发送的,不要把检查请求再转发到负载均衡集群,避免请求死循环
五、相关文章推荐
- 了解Nginx负载均衡算法选型,可以查看:Nginx负载均衡算法对比:6种核心策略选型指南与实战配置
- 配置Nginx加权轮询策略,可以参考:Nginx加权轮询weight配置详解:从原理到实战的完整指南
- Nginx反向代理基础配置,可以查看:Nginx反向代理配置教程:轻松实现负载均衡与端口转发
合理配置健康检查是提升负载均衡可用性的关键,大家可以根据自身业务需求选择合适的检查方式,保障业务稳定运行。
版权声明
本文仅代表个人观点。
本文系AI辅助作者原创,未经许可,转载请保留原文链接。

发表评论