Keepalived 与 Apache 集成实现高可用 Web 服务,核心是 VIP 自动漂移;需用 HTTP 健康检查替代端口探测,合理设置抢占延迟与通告间隔,绑定 Apache 至 VIP,启用 mod_remoteip,并打通监控告警链路。

Keepalived 与 Apache 在私有云环境中的集成,核心目标是实现高可用 Web 服务:当主节点 Apache 故障时,VIP(虚拟 IP)自动漂移到备节点,用户无感知切换。优化重点不在“能否跑通”,而在“切换是否快、稳、可监控、易维护”。
确保 Keepalived 状态检测真实反映 Apache 服务能力
默认的 TCP 端口探测(如检查 80 端口是否通)存在盲区:Apache 进程可能存活但无法响应 HTTP 请求(如后端数据库挂了、配置错误导致 503)。必须升级为 HTTP 级健康检查。
- 在 Keepalived 配置中使用 vrrp_script 调用 curl 或 wget 检查 Apache 返回的 HTTP 状态码(如 200 OK),并设置超时和重试次数
- 检查路径应为真实业务接口(如
/healthz或/status),避免静态文件(如/index.html),防止缓存或文件存在但服务异常的情况被误判 - 脚本需有明确退出码:0 表示健康,非 0 表示不健康;Keepalived 仅依据退出码判断,不解析响应内容
合理设置 VRRP 抢占与延迟,避免脑裂和抖动
私有云常见网络波动(如宿主机迁移、SDN 控制面延迟)易触发 VIP 频繁漂移。需通过参数抑制非必要切换。
- 启用 preempt_delay(如 30 秒):主节点恢复后不立即抢回 VIP,等待稳定运行一段时间再切换,规避启动中未就绪就接管流量
- 调低 advert_int(如 1 秒)加快故障发现,但需同步降低 fail/rise 计数(如 fail 2 / rise 2),平衡灵敏度与抗噪能力
- 禁用 preempt 仅在特殊场景(如强制主备角色固化)下使用;常规双活/主备模式建议保持启用,配合 delay 更安全
Apache 配置适配 VIP 场景,避免日志与绑定冲突
Apache 默认监听 0.0.0.0:80,在 VIP 漂移后仍能接收请求,但日志中客户端 IP 可能失真,且部分模块(如 mod_evasive)依赖本地地址做限流,需调整。
- 使用 Listen 指令绑定到 VIP(如
Listen 192.168.10.100:80)而非通配地址,使 Apache 仅在持有 VIP 时真正提供服务(需配合 Keepalived 的 notify 脚本启停) - 启用 mod_remoteip 并配置 RemoteIPHeader X-Forwarded-For(若前端有负载层)或直接信任 RemoteIPInternalProxy 为内网段,确保 access_log 中记录真实客户端 IP
- 关闭 ServerTokens 和 ServerSignature,减少信息泄露,符合私有云安全基线要求
打通监控与告警链路,让高可用“看得见”
Keepalived 自身无内置指标暴露,Apache 日志也不直接体现 VIP 切换事件,需主动埋点与聚合。
- 在 Keepalived 的 notify 脚本中,当状态变为 MASTER 或 BACKUP 时,向 Prometheus Pushgateway 推送事件标签(如
keepalived_state{instance="web01",role="master"}),或写入本地日志并由 Filebeat 采集 - Apache 日志中添加 %{X-Real-IP}i 和 %{X-Forwarded-For}i 字段,并在日志轮转时保留最近 7 天,便于故障回溯时比对切换时间点的请求分布
- 配置 Zabbix 或 Prometheus Alertmanager,对 “连续 3 次健康检查失败” 或 “1 小时内 VIP 切换 ≥2 次” 设置告警,避免静默降级

















