apache 配合 keepalived 实现高可用的核心思路是:用 keepalived 管理虚拟 ip(vip),主节点正常时 vip 绑定其上提供服务,故障时自动漂移至备节点,实现秒级无感知切换;需确保两台服务器 apache 服务一致、关闭防火墙/selinux、时间同步、配置相同 virtual_router_id 和认证密码,仅 state(master/backup)与 priority 不同。

Apache 配合 Keepalived 实现高可用,核心思路是:用 Keepalived 管理一个虚拟 IP(VIP),让两台(或以上)运行相同 Apache 服务的服务器对外表现为“一台”,当主节点故障时,VIP 自动漂移到备节点,用户无感知地继续访问。这不是负载均衡,而是服务入口的高可用保障。
关键前提与准备
- 两台服务器(例如 node1 和 node2),均安装并运行 Apache,提供完全一致的 Web 内容(静态页、配置、端口等)
- 使用同一内网网段(如
192.168.1.0/24),确保二层互通 - 关闭防火墙和 SELinux(生产环境建议改用白名单策略,但实验阶段可直接关闭)
systemctl stop firewalld && setenforce 0
- 时间同步(避免 VRRP 心跳异常)
chronyd -q 'server ntp1.aliyun.com iburst'
Apache 服务一致性配置
确保两台服务器的 Apache 完全等效:
- 启用相同端口(默认
80,不建议改) - 主页内容一致(比如都返回
echo "node1" > /var/www/html/index.html和echo "node2",便于后续验证 VIP 漂移) - 启动服务并设为开机自启
systemctl enable --now httpd
- 测试直连:分别用浏览器或
curl访问http://192.168.1.10和http://192.168.1.11,确认都能正常响应
Keepalived 安装与主备配置
使用 yum 安装(CentOS/RHEL):
yum install -y keepalived
编辑 /etc/keepalived/keepalived.conf,两台机器配置仅 state 和 priority 不同:
主节点(node1)配置示例:
global_defs {
router_id LVS_MASTER
}
vrrp_instance VI_1 {
state MASTER
interface eth0 # 实际网卡名,用 ip a 确认
virtual_router_id 51
priority 100 # 数值越高优先级越高
advert_int 1
authentication {
auth_type PASS
auth_pass 1111 # 主备必须一致
}
virtual_ipaddress {
192.168.1.100/24 # VIP,对外服务地址
}
}
备节点(node2)配置示例:
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51 # 必须与主节点相同
priority 99 # 必须低于主节点
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.100/24
}
}
✅ 注意:
virtual_router_id在同一组 Keepalived 节点中必须唯一且一致;priority差值建议 ≥ 3,避免脑裂;advert_int是心跳间隔(秒),默认 1 秒足够灵敏。
启动服务:
systemctl enable --now keepalived
验证高可用效果
- 客户端执行
curl http://192.168.1.100→ 应返回主节点内容(如node1) - 手动停止主节点 Keepalived:
systemctl stop keepalived - 等待 1–3 秒,再次
curl http://192.168.1.100→ 应返回备节点内容(如node2) - 查看备节点
ip addr show eth0,确认 VIP 已绑定到其网卡 - 恢复主节点后,若配置为抢占模式(默认开启),VIP 会自动切回主节点
? 补充:如需禁用抢占,可在
vrrp_instance块中添加nopreempt(仅适用于 BACKUP 节点),并确保主节点priority更高且始终运行。
常见问题排查要点
- VIP 无法 ping 通?检查是否启用了
vrrp_strict(注释掉该行,它会限制多播/VIP 绑定) - 切换延迟长?确认
advert_int和preempt_delay(如有)设置合理,网络无丢包 - 日志在哪看?
journalctl -u keepalived -f或/var/log/messages - 多业务隔离?可定义多个
vrrp_instance,每个绑定不同 VIP 和virtual_router_id
不复杂但容易忽略细节。











