开源 nginx 不支持健康打分,但可通过被动检测(max_fails/fail_timeout + proxy_next_upstream)与主动探测(nginx_upstream_check_module)组合实现近生产级健康感知,并辅以weight、slow_start、backup及error_page构建完整容错体系。

开源 Nginx 本身不提供“健康打分”能力,但可通过组合配置实现接近生产可用的健康感知效果。关键在于区分被动响应式检测与主动探测式检测,并根据实际运维目标选择合适策略。
用好 max_fails 和 fail_timeout 做基础被动检测
这是最轻量、无需额外模块的方式,依赖真实业务请求失败来触发节点隔离:
- 把 max_fails 设为 2~3,避免单次网络抖动误判;fail_timeout 控制在 5~15 秒,太短易反复摘除,太长影响恢复速度
- 配合 proxy_next_upstream error timeout http_502 http_504,让 Nginx 在首次出错时就切换节点,而不是等超时
- 显式设置 proxy_next_upstream_tries 2,防止无限重试压垮其他后端
- 慎用 down 标记——它需人工干预才能恢复,违背自动故障恢复原则
用 nginx_upstream_check_module 实现主动探测
这是开源环境下最接近商业版 health_check 的方案,需编译安装,但稳定可靠:
- 配置 check interval=3000 rise=2 fall=2 timeout=1000 type=http uri=/health,每 3 秒探活,连续 2 次成功即回归,2 次失败立即下线
- default_down on 必须开启,防止新启动时流量打到未就绪服务
- 后端 /health 接口要轻量(返回 JSON 或纯文本)、响应快(建议 ≤200ms),避免探针本身成为瓶颈
- 搭配 location /upstream_status { healthcheck_status; } 可查看实时状态页
通过 weight + slow_start 控制流量倾斜与冷启动
虽不能动态打分,但可人工分级模拟健康倾向:
- 稳定服务设 weight=10,新上线或波动服务设 weight=2~5
- 对刚恢复或新部署节点启用 slow_start=30s,让权重从 0 线性升至设定值,防冷启动冲击
- 避免仅靠 weight 调度而不配健康检查——权重静态,无法应对突发故障
加 backup 和 error_page 做兜底保障
再完善的健康检查也存在窗口期,必须有降级路径:
- upstream 中定义 server 127.0.0.1:8080 backup;,指向本地维护页服务
- 全局配置 error_page 502 503 504 /maintenance.html;,确保用户看到友好提示而非空白或报错
- 限制单节点连接数:max_conns=200(需开启共享内存),防个别后端过载拖垮整体











