Nginx 开源版不支持原生主动健康检查,需通过 proxy_next_upstream 重试机制、第三方模块 nginx-upstream-check-module 或应用层 /health 端点配合实现;推荐编译该模块并配置 check 指令实现主动探测。

Nginx 本身不原生支持主动式健康检查(如定期探测后端是否存活),但可通过 upstream 模块的轮询机制 + 第三方模块或反向代理层配合实现类似效果。官方版 Nginx(开源版)需借助 ngx_http_upstream_module 的基础能力,再结合 health_check 指令(仅限 Nginx Plus)或用开源替代方案(如 nginx-upstream-check-module)来补足健康检查功能。
使用官方 Nginx(开源版)+ 自定义探针逻辑
虽然开源 Nginx 不提供内置健康检查,但可通过以下方式“模拟”:利用 proxy_next_upstream 配合超时与错误码重试,让失效节点自动被跳过:
-
配置基本轮询 upstream:在
http块中定义后端服务组,启用默认轮询 -
开启失败转移机制:设置
proxy_next_upstream error timeout http_500 http_502 http_503 http_504;,当某台后端返回这些响应或连接失败时,Nginx 自动转发请求到下一台 -
设置合理超时与尝试次数:用
proxy_next_upstream_tries 3;和proxy_next_upstream_timeout 3s;控制重试边界,避免雪崩
使用 nginx-upstream-check-module(推荐开源方案)
这是广泛使用的第三方模块,编译进 Nginx 后可启用主动健康检查。需确认你的 Nginx 是源码编译安装(非 apt/yum 直接安装的二进制包):
- 下载并编译该模块,添加
--add-module=../nginx-upstream-check-module到 configure 命令中 - 在
upstream块中启用检查:check interval=3 rise=2 fall=5 timeout=1 type=http;表示每 3 秒探测一次,连续 2 次成功标记为健康,连续 5 次失败标记为宕机 - 搭配
check_http_send和check_http_expect_alive可自定义探测路径与期望状态码,例如发送GET /health HTTP/1.0\r\n\r\n并期望返回 2xx 或 3xx
通过外部服务暴露健康端点(应用层配合)
最轻量、无需修改 Nginx 编译配置的方式:让每个后端服务提供 /health 接口,Nginx 不做主动探测,而是依赖上游服务自我上报 + 运维手动或自动更新 upstream 配置:
- 后端服务启动时注册自身地址,并持续上报心跳;故障时自动注销
- 用脚本监听服务注册中心(如 Consul、etcd),动态生成 Nginx upstream 配置并 reload
- 或使用 OpenResty + Lua,调用
resty.http定期探测,缓存健康状态,再在balancer_by_lua*中做路由决策
注意事项与常见坑点
实际部署中容易忽略的关键细节:
- 健康检查请求本身不应打到业务逻辑,务必确保
/health路径不触发数据库查询或鉴权,否则可能成为性能瓶颈 - 轮询权重(
weight)和最大连接数(max_conns)会影响实际分发效果,需结合后端处理能力调整 - 开启
keepalive连接复用能显著降低 Nginx 与后端之间的建连开销,建议在 upstream 中配置keepalive 32; - 日志中可通过
$upstream_addr和$upstream_status查看每次请求实际转发到哪台及响应状态,用于排障











