0

Nginx负载均衡健康检查配置详解:主动被动检测与故障自动切换完整实战

2026.05.22 | youres | 15次围观

Nginx负载均衡健康检查配置详解:主动被动检测与故障自动切换完整实战

在负载均衡架构中,后端服务器故障是导致业务不可用常见原因之一。如果没有健康检查机制,负载均衡会把用户请求持续转发到故障节点,导致大量请求失败。Nginx提供两种健康检查实现方式:原生被动健康检查、主动健康检查,本文将详细讲解两种方式的配置方法、适用场景以及生产环境最佳实践。

一、什么是Nginx负载均衡健康检查

健康检查是指负载均衡节点定期或在转发请求时,检查后端服务器的可用状态,自动将故障节点从转发列表中摘除,待节点恢复后再重新加入,从而保证转发到后端的请求都能得到正常响应。

二、被动健康检查:Nginx原生能力

被动健康检查是Nginx内置的能力,无需安装额外模块,通过upstream配置块的两个参数实现,配置简单,适合中小型业务场景。

1. 核心参数配置

upstream配置中,为每个后端服务器配置max_failsfail_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;
        }
    }
}

四、生产环境健康检查最佳实践

  1. 检查端点要轻量:后端服务的健康检查端点不要返回大量数据,也不要依赖数据库、缓存等重资源,避免高频检查请求打垮后端服务
  2. 检查间隔要合理:间隔太短会增加后端压力,太长会导致故障感知滞后,一般建议设置为3-5秒,根据业务实际情况调整
  3. 主动+被动结合使用:主动检查实时感知故障,被动检查作为兜底,双重保障提升可用性
  4. 健康检查状态要监控:将Nginx健康检查状态接入监控系统,节点状态变化时及时发送告警,方便运维人员快速处理
  5. 不要对检查请求做负载均衡:健康检查请求是Nginx直接向后端节点发送的,不要把检查请求再转发到负载均衡集群,避免请求死循环

五、相关文章推荐

合理配置健康检查是提升负载均衡可用性的关键,大家可以根据自身业务需求选择合适的检查方式,保障业务稳定运行。

版权声明

本文仅代表个人观点。
本文系AI辅助作者原创,未经许可,转载请保留原文链接。

发表评论
881文章数 0评论数
作者其它文章