keepalived 实现 apache 高可用需真实 http 探活、arp 刷新、配置同步及全链路验证;仅依赖进程检测或忽略网络层细节会导致 vip 不漂移、客户端中断或内容不一致。

Apache 本身不提供高可用能力,必须依赖外部工具实现故障自动切换;Keepalived 是最轻量、最贴近 Linux 网络栈的方案,但直接配错 vrrp_script 或忽略 ARP 刷新,会导致 VIP 不漂移或客户端缓存旧 MAC——这是 80% 的失败案例根源。
Keepalived 怎么检测 Apache 是否真挂了
不能只靠 killall -0 httpd 或检查进程存在,Apache 进程可能僵死、端口被占但无法响应请求。必须做真实 HTTP 探活:
- 用
curl -f -s --connect-timeout 2 http://127.0.0.1/healthz | grep "OK"检查返回内容,-f确保非 2xx 状态码时退出非零 - 把探测命令封装进
vrrp_script,并设置interval 2、fall 2、rise 2,避免抖动误切 - 脚本中加
timeout 3防止 curl 卡住拖垮 Keepalived 主循环
为什么 VIP 漂移后客户端访问仍中断
常见于未处理 ARP 缓存和 TCP 连接残留。Linux 默认不主动通告 VIP 变更,交换机/客户端会继续发包到旧 MAC:
- 在
notify_master脚本里加arping -c 3 -A -I eth0 192.168.1.100(替换为你的 VIP 和网卡)强制刷新局域网 ARP 表 - 确保两台机器的
/proc/sys/net/ipv4/conf/all/arp_ignore设为1,防止非 VIP 接口响应 ARP 请求 - 客户端若复用长连接,需在应用层加重试逻辑,TCP 连接不会因 VIP 漂移自动重建
Apache 配置要注意哪些同步细节
Keepalived 只管 VIP,不负责配置同步。手动 rsync 或 Ansible 同步时,容易漏掉关键项:
-
/etc/httpd/conf/httpd.conf和/etc/httpd/conf.d/*.conf必须完全一致,尤其Listen、ServerName、SSL 证书路径 - 静态文件目录(如
/var/www/html)建议用 NFS 或 rsync + inotify 实时同步,否则主备内容不一致会导致 404 - 禁用
mod_status的ExtendedStatus On,它会在内存中维护连接状态,主备切换后状态丢失是正常行为,不必强求同步
真正难的不是配置 Keepalived,而是验证“Apache 假死”场景下能否 3 秒内完成探测、降级、VIP 漂移、ARP 刷新、客户端重连这一整条链路——多数人只测了进程 kill,没测过 CPU 100% 或 accept 队列满的情况。










