mod_proxy_hcheck无独立“检查窗口期”,其抖动控制依赖hcfails与hcpasses的连续计数机制及hcinterval共同作用:hcfails=3需连续3次失败才标记Down,hcpasses=2需连续2次成功才恢复Up,中间任一次相反结果即清零重计,结合hcinterval形成实际响应时间范围。

Apache 的 mod_proxy_hcheck 本身没有“检查窗口期”这个独立参数,它的抖动控制完全依赖 连续失败计数(hcfails) 和 连续成功计数(hcpasses) 这两个核心机制。所谓“窗口期”,其实是这两个阈值与 hcinterval 共同作用形成的时间范围——不是固定滑动窗口,而是基于事件序列的判定逻辑。
理解 hcfails 与 hcpasses 的真实行为
这两个参数决定节点状态切换的严格程度,直接应对频繁抖动:
-
hcfails=3表示:必须连续 3 次健康检查失败,才标记为 Down;中间只要有一次成功,失败计数就清零重来 -
hcpasses=2表示:必须连续 2 次健康检查成功,才恢复为 Up;中间一次失败,成功计数同样归零 - 它们不统计“过去 N 秒内失败几次”,只看最近几次探测的顺序结果,天然抗瞬时抖动
调整 hcinterval 以匹配业务容忍度
hcinterval 决定了探测频率,它和 hcfails/hcpasses 共同构成实际响应时间窗口:
- 若设
hcinterval=5、hcfails=3,最短需 15 秒(5×3)才能触发 Down;但若第 1 次失败、第 2 次成功、第 3 次失败……则永远不 Down - 对易抖动服务(如依赖外部 DB 或缓存的健康端点),建议适当拉长间隔,例如
hcinterval=10,避免高频探测放大网络毛刺影响 - 不要盲目设成 1 或 2 秒——过密探测会增加后端负担,且 Apache 的健康检查线程池有限,可能造成排队阻塞
用 ProxyHCExpr 提前过滤“假成功”
很多抖动源于后端返回了 200 状态码,但响应体或头表明实际异常(如 {"status":"degraded"})。仅靠 hcfails 无法识别这类情况:
- 必须配置
ProxyHCExpr,把内容判断纳入健康逻辑,例如:
ProxyHCExpr stable {%{REQUEST_STATUS} == 200 && %{hc resp body} =~ /"status"\s*:\s*"up"/} - 这样即使 HTTP 状态是 200,但 body 不含预期字段,本次检查仍算失败,真正失败计数才会累加
- 旧版 Apache(ProxyHCExpr stable {%{hc resp header X-Health} == "true"}
配合 retry 实现冷却期,防止反复横跳
节点被标记 Down 后,retry 参数决定它多久不参与调度——这是防止刚恢复又立刻被压垮的关键:
-
retry=60表示:该节点进入 60 秒冷却期,期间不接收任何新请求,也不再发起健康检查 - 冷却期结束后,健康检查自动重启,按
hcpasses规则重新评估是否恢复 - 避免设
retry=0(永久隔离)或retry=5(太短),前者需人工干预,后者容易在抖动中反复上下线











