Nginx 通过主动探测、被动反馈和状态聚合三机制协同实现后端健康与负载实时感知:主动探测定时探活并语义校验,被动反馈捕获真实请求异常,状态聚合暴露结构化监控接口,并支持告警联动与动态流量调度。

Nginx 本身不自带实时感知能力,但通过主动探测 + 被动反馈 + 状态聚合三类机制协同,就能让代理层真正“看清”后端集群每一刻的健康与负载状态。
启用主动健康检查,让 Nginx 主动发心跳探活
这不是等请求失败才反应,而是定时、定向、可配置地去“问”后端是否在线且可用:
- 使用
nginx_upstream_check_module(推荐)或 OpenResty 的lua-resty-checkups模块 - 在 upstream 中指定探测路径,例如
/actuator/health或/healthz - 设置
rise=2 fall=3 timeout=1s interval=3s,避免误判抖动,也防止滞后下线 - 关键是匹配语义:用
check_http_expect_alive http_2xx,拒绝把返回503或{"status":"DOWN"}的节点当作健康
捕获真实业务请求反馈,补充被动观测维度
主动探测再勤快,也覆盖不了所有接口路径和业务逻辑。真实流量才是最终检验:
- 开启
proxy_next_upstream error timeout http_502 http_503 http_504,让失败请求自动重试其他节点 - 在 access_log 中记录
$upstream_addr $upstream_response_time $upstream_status,用于事后分析单节点性能拐点 - 若使用 OpenResty,可在
log_by_lua_block中统计每节点的 5xx 比率、P95 延迟突增,写入共享字典触发临时降权
暴露统一状态入口,供监控与人工快速确认
感知不是目的,可读、可查、可联动才是闭环关键:
- 配置
/statuslocation 返回结构化 JSON(如check_status_json或 Lua 动态聚合) - 输出字段应包含:节点 IP、当前状态(up/down)、连续失败次数、最后探测时间、响应耗时中位数
- 限制访问权限(只允运维网段),避免暴露内部拓扑
- 对接 Prometheus:用
nginx-module-vts或自定义 Lua exporter 抓取指标,设置upstream_down == 1告警
关联下游行为,实现状态驱动的动态响应
感知到状态变化后,Nginx 要能“做点什么”,而非仅记录:
- 探测到节点 down 时,自动触发日志标记,并调用 webhook 通知值班群
- 结合
balancer_by_lua_block,在选上游前读取健康评分,跳过低分节点 - 优雅下线期间,将待摘除节点权重设为 0 或启用
slow_start=30s,逐步回收流量
不复杂但容易忽略


















