nginx监控自愈核心是“检测—切换—验证”闭环:keepalived通过/healthz健康检查实现vip漂移,主备节点冗余采集、双活告警、独立执行自愈动作,并需定期故障演练验证。

监控组件宕机时,Nginx 自愈的核心逻辑
自愈不是自动重启服务,而是当主监控组件(如 Prometheus + Alertmanager + 自定义告警脚本)不可用时,备用节点能无缝接管数据采集、判断和响应动作。关键在于“检测—切换—验证”闭环,而非单纯双机热备。
用 Keepalived 实现 VIP 漂移,保障接入层不中断
监控系统对外通常通过一个统一入口(如 http://nginx-mon.internal)提供指标查询与告警配置。这个域名背后应绑定一个虚拟 IP(VIP)。主备监控节点都部署 Keepalived,通过健康检查(如定期请求 /healthz 接口)判断本地监控服务是否存活:
- 主节点健康 → VIP 绑定在主节点,所有流量进入主监控系统
- 主节点宕机或 /healthz 返回非 200 → Keepalived 自动释放 VIP,备节点抢占并绑定
- 切换后,Nginx 的 upstream 配置无需改动,因后端始终是 VIP
指标采集链路冗余:避免单点抓取失败
Nginx 日志和指标暴露不能只依赖一台监控机拉取。需从源头设计冗余:
- Nginx 配置中开启
stub_status并监听在0.0.0.0:8080,允许主备监控节点同时访问 - 日志采用远程写入方式:Nginx 用
syslog或fluent-bit将 access.log 同时发往两个 Kafka Topic 或两个 Loki 实例 - Prometheus 的 scrape targets 列表里,将同一组 Nginx 实例同时配置给主、备 Prometheus Server,两者独立拉取、独立存储
告警触发与执行的双活容错
Alertmanager 宕机不会导致告警丢失,但会影响去重、静默和通知分发。建议采用以下组合策略:
- 主备 Alertmanager 组成集群(–cluster.advertise-address),共享状态,任一节点宕机不影响通知下发
- 关键告警(如 “Nginx 进程消失”)额外配置 webhook 到轻量级备用通道(如本地脚本调用 curl 发企业微信),绕过 Alertmanager
- 自愈动作(如自动拉起 nginx_exporter)由主备节点各自部署的 watchdog 脚本独立执行,不依赖中心调度
验证与演练比配置更重要
真正可靠的自愈能力必须经过人为注入故障来验证:
- 手动 kill 主节点上的 prometheus 进程,观察 VIP 是否 3 秒内漂移、Grafana 是否自动连上备用 Prometheus
- 停掉主 Alertmanager,发一条测试告警,确认备用节点仍能完成分组、抑制并推送钉钉
- 模拟网络分区:切断主节点与 Nginx 服务器之间的网络,检查备用节点是否持续采集成功











