是的,Nginx 能够通过健康检查(Health Check) 机制来实现后端故障节点的自动剔除与恢复。这是构建高可用后端服务集群的关键功能。

为了帮助你快速理解,我梳理了 Nginx 健康检查的核心机制:

检查方式

工作原理

关键配置参数

触发条件(示例)

优点与注意

被动检查

Nginx 根据处理实际请求的成功与否来判断节点健康。

max_fails=3 fail_timeout=30s

30秒内连续3次请求失败

默认支持,配置简单。但有滞后性,可能影响少量用户体验。

主动检查

Nginx 定期主动向后端节点发送特定请求(如 HTTP、TCP)来探测其健康状态。

interval=5s fails=3 passes=2 timeout=3s type=http

连续3次检查失败标记为不健康;连续2次检查成功则重新标记为健康。

响应更及时,能在用户请求到来前发现故障。通常需第三方模块(如 nginx_upstream_check_module) 或 Nginx Plus(商业版)支持。


⚙️ 如何配置 Nginx 的健康检查

Nginx 的健康检查分为被动检查(默认支持)和主动检查(需配置或使用模块)。

1. 被动健康检查(默认)

被动检查依赖于对实际用户请求的处理结果。这是通过 upstream 块中的 max_failsfail_timeout 参数实现的。

http {
    upstream backend {
        # 在30秒内,连续失败3次,则该节点被标记为不可用30秒
        server backend1.example.com max_fails=3 fail_timeout=30s;
        server backend2.example.com max_fails=3 fail_timeout=30s;
        server backend3.example.com max_fails=3 fail_timeout=30s;
    }

    server {
        listen 80;
        location / {
            proxy_pass http://backend;
            # 定义在什么情况下请求应转发到下一台服务器
            proxy_next_upstream error timeout http_500 http_502 http_503 http_504;
        }
    }
}

关键参数解释:

  • max_fails: 在 fail_timeout 时间内,与服务器通信的连续失败次数(如连接超时、连接拒绝或配置的 proxy_next_upstream 错误)超过此值,Nginx 会将该服务器标记为不可用。
  • fail_timeout:
    1. 统计 max_fails时间窗口
    2. 服务器被标记为不可用后,持续的不可用时间。超过此时间后,Nginx 会再次尝试将请求 probes 给该服务器。
  • proxy_next_upstream: 指定在哪些错误情况下应将请求转发到下一个后端服务器。
2. 主动健康检查(推荐)

主动检查通过第三方模块(如 nginx_upstream_check_module)或 Nginx Plus 实现。Nginx 定时主动向后端节点发送健康检查请求,并根据响应判断其状态。

http {
    upstream backend {
        server backend1.example.com;
        server backend2.example.com;
        server backend3.example.com;
        
        # 开启主动健康检查 (nginx_upstream_check_module 模块语法)
        check interval=3000 rise=2 fall=3 timeout=1000 type=http;
        check_http_send "HEAD /health HTTP/1.0\r\n\r\n"; # 发送健康检查请求
        check_http_expect_alive http_2xx http_3xx;       # 认为健康的状态码
    }

    server {
        listen 80;
        location / {
            proxy_pass http://backend;
        }
        # 提供一个查看健康检查状态的页面
        location /nstatus {
            check_status;
            access_log off;
        }
    }
}

关键参数解释 (以 nginx_upstream_check_module 为例):

  • interval: 健康检查的间隔时间(例如 3000 毫秒)。
  • fall: 连续失败多少次后将节点标记为不健康(例如 3 次)。
  • rise: 连续成功多少次后将不健康的节点重新标记为健康(例如 2 次)。
  • timeout: 每次健康检查请求的超时时间。
  • type: 健康检查协议类型,如 http, tcp, ssl_hello 等。

🔧 故障转移与恢复流程

其自动故障剔除与恢复的流程,可以概括为以下几步:

  1. 健康检查:Nginx 通过被动或主动方式检查后端节点。
  2. 故障判定:当健康检查失败次数达到阈值(如 max_failsfall),Nginx 将该节点标记为 “不健康”
  3. 自动剔除:Nginx 停止向“不健康”的节点转发用户请求,流量被引导至其他健康的节点。
  4. 恢复检查:对于被剔除的节点,Nginx 会持续进行健康检查
  5. 自动恢复:当健康检查成功的次数达到阈值(如 rise),Nginx 会认为该节点已恢复,并重新将其加入负载均衡池,开始向其转发流量。

⚠️ 注意事项

  • 模块需求:上述的 check 指令通常需要 nginx_upstream_check_module 等第三方模块支持,而非 Nginx 开源版自带。编译时需手动添加此模块。
  • 商业版本Nginx Plus 提供了功能更强大、更易用的主动健康检查功能,无需第三方模块。
  • 合理配置参数intervalfallrisetimeout 等参数需要根据实际业务和后端服务的处理能力进行合理设置,以避免误判或发现延迟。

💎 总结

Nginx 完全能够通过健康检查机制实现后端故障节点的自动剔除与恢复

  • 对于被动检查,利用 max_failsfail_timeout 等参数可实现基本的故障转移。
  • 对于更及时、更可靠的主动检查,通常需要通过 nginx_upstream_check_module 等第三方模块或 Nginx Plus 商业版来实现。

建议你根据实际情况,为 Nginx 配置合适的健康检查机制,这能有效提升你后端服务的可用性和可靠性。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐