Nginx被动健康检查依赖proxy_next_upstream、max_fails和fail_timeout三者协同:前者定义失败重试条件(如error/timeout/5xx),后两者在fail_timeout窗口内累计max_fails次失败后标记节点down并暂停调度30秒,新请求触发试探恢复。
Nginx 本身不提供主动探测后端健康状态的机制(如定期发心跳请求),但可以通过 proxy_next_upstream 配合超时、错误响应等条件,实现“被动健康检查”——即在请求失败时自动尝试下一个 upstream 节点,并结合 max_fails 和 fail_timeout 实现故障节点的临时剔除。
该指令定义在请求转发到某个 upstream server 失败后,是否尝试重试其他节点。它不决定“是否健康”,而是决定“失败后要不要换人”。常见触发条件包括:
proxy_connect_timeout、proxy_send_timeout、proxy_read_timeout)仅靠 proxy_next_upstream 不足以自动剔除节点,必须搭配 max_fails 和 fail_timeout 才能标记节点为“不可用”并暂停转发:
fail_timeout 时间窗口内,连续失败 3 次,则标记该 server 为不可用max_fails 时默认为 1;未设置 fail_timeout 默认为 10 秒示例 upstream 配置:
upstream backend {server 192.168.1.10:8080 max_fails=3 fail_timeout=30s;
server 192.168.1.11:8080 max_fails=3 fail_timeout=30s;
server 192.168.1.12:8080 backup;
}
在 proxy_pass 所在 location 块中,明确启用需要的失败类型:
location / {proxy_pass http://backend;
proxy_next_upstream error timeout http_500 http_502 http_503 http_504;
proxy_next_upstream_tries 3;
proxy_next_upstream_timeout 10s;
proxy_connect_timeout 5s;
proxy_send_timeout 10s;
proxy_read_timeout 10s;
}
proxy_*_timeout 值共同影响单次请求的失败判定,进而触发 proxy_next_upstream
backup 服务器只在所有非 backup 节点都不可用时才启用,适合做灾备节点proxy_next_upstream 不生效(因未命中任何触发条件),需结合业务层校验或使用 ngx_http_upstream_check_module(第三方模块)做主动健康检查