keepalived仅监控nginx主进程存活,不处理worker异常;worker自愈由nginx master完成,需升级vrrp_script为http探活、worker数检查及nginx -t验证,并优先本地reload修复,失败后才降权漂移vip。

Keepalived 本身不处理 Nginx 的子进程(worker)异常,它只监控 Nginx 主进程(master)或整个服务的可用性。真正的 worker 异常恢复,由 Nginx 自身的 master 进程完成——Keepalived 不参与、也不替代这一逻辑。
Keepalived 的职责边界:只管“活着”,不管“健在”
Keepalived 默认通过 vrrp_script 检查 Nginx 是否在运行,典型做法是:
- 执行 kill -0 $(pidof nginx) 判断主进程是否存在
- 或简单检查 ps aux | grep nginx | grep master
这类检测仅确认 master 进程是否存活,完全无法感知 worker 是否崩溃、是否返回 502、是否已无实际服务能力。若 worker 全挂而 master 仍在,Keepalived 会误判为“服务正常”,VIP 不会漂移,但用户请求已大面积失败。
真正恢复 worker 异常的是 Nginx master 进程
Nginx 内置了轻量、高效的子进程自愈机制:
- master 使用 waitpid() + WNOHANG 轮询 worker 状态,发现非零退出码(如段错误、OOM killer 杀掉、被 kill -9)即判定为异常
- 立即 fork + exec 启动新 worker,复用已创建的监听 socket 和共享内存等资源,无冷启动延迟
- 设防机制:1 秒内 worker 异常退出 ≥10 次,master 主动退出并打印 "exit after too many worker processes exit unexpectedly",此时需人工介入
让 Keepalived “懂业务”:必须升级健康检查脚本
要使 Keepalived 对 Nginx 整体状态做出合理响应,需替换默认脚本,实现多维度探活:
- 访问 /nginx_status 或自定义 /healthz 接口,验证 HTTP 层响应能力
- 检查 worker 进程数量(如 ps -eo comm | grep 'nginx:' | wc -l)是否符合预期
- 执行 nginx -t 确认配置未损坏(避免 reload 失败)
- 失败时先尝试 nginx -s reload 或 -s start;仅当多次重试失败后,才触发权重下降或 VIP 漂移
闭环自愈的关键:本地修复优先,VIP 漂移兜底
高可用 ≠ 高切换频率。理想策略是:
- Keepalived 脚本检测失败后,先调用本地恢复动作(如 reload),等待 2–3 秒观察是否恢复
- 若仍未恢复,再执行 weight -40 并设置 fall 2 rise 3,平滑降权触发 VIP 迁移
- 迁移后原节点不自动抢回,避免震荡;所有操作写入独立日志(如 /var/log/keepalived-heal.log),含时间戳、PID、nginx -V 版本摘要











