nginx 实现可靠故障转移需主动探测(ngx_http_upstream_check_module)+被动容错(proxy_next_upstream)双重保障:先源码编译集成check模块,upstream中配置http健康检查与状态页,再配合proxy_next_upstream兜底重试。

要让 Nginx 在后端故障时自动转移流量,光靠被动容错(如 proxy_next_upstream)不够稳定。真正可靠的故障转移,需要结合 ngx_http_upstream_check_module 实现主动探测 + 状态感知 + 动态剔除,再叠加兜底策略。
编译安装 check 模块(必须前置)
开源 Nginx 默认不带该模块,必须源码编译集成:
- 下载与当前 Nginx 版本严格匹配的源码(例如
nginx-1.28.0)和对应分支的nginx_upstream_check_module(推荐 yaoweibin 的v0.4.0或适配 1.26+ 的 dev 分支) - 执行
./configure --add-module=/path/to/module [原有参数] && make && make install - 验证:运行
nginx -V 2>&1 | grep check,输出含check即成功
upstream 中配置主动探测逻辑
在 upstream 块内启用检查,每个 server 不单独设参数,而是整组统一控制:
-
check interval=3 rise=2 fall=3 timeout=1 type=http:每 3 秒探一次,连续 2 次成功才上线,连续 3 次失败才下线,单次超时 1 秒 -
check_http_send "GET /healthz HTTP/1.1\r\nHost: api.example.com\r\nConnection: close\r\n\r\n":用 GET 发真实请求,带 Host 头适配虚拟主机,关闭 keep-alive 避免连接复用干扰 -
check_http_expect_alive http_2xx:只把 2xx 响应视为健康;若后端返回{"status":"UP"}类 JSON,仅靠状态码还不够,需确保该接口本身已做业务级校验(如连 DB、查缓存)
暴露状态页用于监控与人工确认
添加专用 location 展示实时节点状态,便于排查和对接 Prometheus:
location /status { check_status; access_log off; allow 127.0.0.1; deny all; }- 访问
/status可看到每个后端 IP、端口、当前状态(up/down)、失败次数、最近检测时间 - 务必限制访问来源,避免敏感信息泄露
搭配 proxy_next_upstream 形成双重保障
主动检查再及时也有探测间隙,需保留被动兜底机制:
- 在
location或server块中设置:proxy_next_upstream error timeout http_502 http_504; - 当某次真实请求遇到连接失败、超时或后端返回 502/504 时,Nginx 会立即尝试下一个健康节点
- 这层机制不依赖检查周期,是故障发生瞬间的第一道响应,与主动检查形成纵深防御











