keepalived结合vip实现nginx双机热备,本质是基于vrrp协议让两台服务器争抢同一虚拟ip:主节点存活时vip绑定其网卡,宕机或nginx崩溃后备节点几秒内自动接管,客户端无感知;需确保同子网、防火墙放行80端口及vrrp(协议号112)、selinux设为permissive、nginx服务一致且已启动,并通过nginx_check.sh脚本实现进程级健康检查。

Keepalived 结合虚拟 IP(VIP)实现 Nginx 双机热备,本质是用 VRRP 协议让两台服务器“争抢”同一个对外服务地址。主节点活着时 VIP 绑定在其网卡上;一旦它宕机或 Nginx 崩溃,备节点几秒内自动接管 VIP,客户端请求无感知切换。
网络与基础环境必须一致
两台服务器需满足硬性前提,缺一不可:
- 运行相同系统(如 CentOS 7),IP 在同一子网(例如主 192.168.201.131、备 192.168.201.129)
- 关闭 firewalld 或放行 TCP 80 端口 + VRRP 协议(IP 协议号 112)
- SELinux 设为 permissive:setenforce 0 并修改 /etc/selinux/config
- Nginx 已安装、能正常响应(curl http://localhost 返回 200)
- 两台的 Nginx 配置完全一致:监听端口、server_name、root 路径、upstream 列表(若反向代理)
Keepalived 主备配置要点
核心是 /etc/keepalived/keepalived.conf,主备仅两处不同:
- 主节点:state MASTER,priority 设为 100(或更高)
- 备节点:state BACKUP,priority 设为 90(必须低于主,且不能相同)
- virtual_router_id 必须完全一致(如 51),interface 填真实网卡名(用 ip a 查)
- virtual_ipaddress 写 VIP(如 192.168.201.130),不配置在物理网卡上
加 nginx_check.sh 实现真进程级检测
默认 Keepalived 只检查网络层连通性,无法发现 Nginx 进程已死但系统仍在线的情况。必须加健康检查脚本:
- 在 /etc/keepalived/ 下新建 nginx_check.sh,内容为:
#!/bin/bash
if ! ps -C nginx --no-header &> /dev/null; then
systemctl start nginx
sleep 1
if ! ps -C nginx --no-header &> /dev/null; then
killall keepalived
fi
fi
- 给执行权限:chmod +x /etc/keepalived/nginx_check.sh
- 在 keepalived.conf 的 vrrp_instance 段里加入:
track_script { chk_nginx },并在 global_defs 上方定义:
vrrp_script chk_nginx { script "/etc/keepalived/nginx_check.sh" interval 2 }
验证与日常观察
部署后重点确认三件事:
- 主节点执行 ip a 应看到 VIP 出现在其网卡下;备节点没有
- 客户端访问 VIP(如 curl http://192.168.201.130)应返回主节点页面内容
- 手动停主节点 Nginx:systemctl stop nginx,3–5 秒后 VIP 自动漂移到备节点,访问 VIP 返回备节点内容
- 日志看是否生效:tail -f /var/log/keepalived.log(需提前配置 rsyslog 输出)











