排查健康检查误判需确认节点实际可用却被错标为down,关键查探针路径响应是否可靠、参数是否过激(如rise=1/fall=1)、防火墙是否拦截探针、以及keepalive与检查模块冲突。

排查健康检查误判导致节点频繁剔除,关键在于确认“节点实际可用”但被 Nginx 错标为 DOWN。这通常不是服务真宕机,而是探测行为与后端状态、网络策略或配置参数不匹配所致。
查健康检查路径与响应是否真实可靠
很多误判源于探针本身得不到预期响应:
- 确认后端是否真在指定路径(如
/health或/actuator/health)返回 2xx 状态码,且响应体不含错误标识(如"status":"DOWN") - 用
curl -v http://后端IP:端口/health在 Nginx 服务器上手动测试,注意看 HTTP 状态码、响应头(尤其是Content-Type)和响应时间 - 避免使用重定向路径(如 302 跳转到登录页)、需鉴权的接口或依赖数据库连接的健康端点——它们容易因临时延迟或权限问题返回非 2xx
核对主动/被动检查参数是否过激
过于敏感的阈值是高频误判根源:
- 若用
nginx_upstream_check_module:检查rise是否太小(如rise=1)、fall是否太低(如fall=1)、interval是否太短(如interval=1000),建议起始值设为interval=5000 rise=2 fall=3 - 若用被动检查(
max_fails+proxy_next_upstream):确认是否把http_503或http_404加进了重试列表——这些可能是业务正常返回,不应触发踢节点 - 对 GC 明显或偶发慢响应的服务,适当放宽
max_fails=5 fail_timeout=60s,或仅保留error timeout触发条件
排除防火墙与网络中间件干扰
健康检查请求常被安全设备静默丢弃或限速:
- 在后端机器上抓包:
tcpdump -i any port 后端端口 -w health.pcap,观察是否有来自 Nginx 的探测包到达,以及是否返回了 SYN-ACK 或 RST - 检查云平台安全组、主机 iptables/nftables 是否放行了 Nginx 服务器 IP 对健康端口的访问;特别注意是否只放行了业务端口,却漏掉健康探针端口
- 若用 HTTP 探针,确认 WAF 或 API 网关未拦截含特定
User-Agent(如nginx-check)或无Host头的请求
验证连接复用与 keepalive 冲突
某些组合会导致探测逻辑异常:
- 使用
nginx_upstream_check_module时,不能在同 upstream 块中配置keepalive指令,否则 Nginx 启动会报错或探测失效 - 若后端启用了 HTTP/2 或长连接复用,而健康检查仍用短连接反复建连,可能触发后端连接数限制,造成探测失败
- 对比
error_log中是否密集出现upstream check failed但无对应业务错误日志,这是典型“探针被拦、业务畅通”的信号











