Keepalived 配合 Nginx 实现双机热备的核心是基于 VRRP 协议共享虚拟 IP(VIP),主节点正常时 VIP 绑定其上,故障后自动漂移至备节点,客户端无感知;需确保两台 CentOS 7 服务器网络互通、Nginx 服务一致、防火墙放行 80 端口及 VRRP(协议号 112),并配置 priority 区分主备、virtual_router_id 一致,推荐增加 nginx_check.sh 健康检查脚本实现进程级可靠性。

Keepalived 配合 Nginx 实现双机热备,核心是用 VRRP 协议让两台服务器共享一个虚拟 IP(VIP),主节点正常时 VIP 绑定在它身上,故障后自动漂移到备节点,客户端无感知切换。整个过程不依赖外部调度器,轻量、可靠、落地快。
基础环境与前置检查
两台 CentOS 7(或类 RHEL 系统)服务器,网络互通且在同一子网。例如:
- 主节点(web01):192.168.201.131
- 备节点(web02):192.168.201.129
- 虚拟 IP(VIP):192.168.201.130(仅用于访问,不配置在物理网卡上)
确保以下条件已满足:
- Nginx 已安装并能正常响应 HTTP 请求(
curl http://localhost可通) - 防火墙放行:TCP 80 端口、VRRP 协议(IP 协议号 112),或直接关闭 firewalld:
systemctl stop firewalld && systemctl disable firewalld - SELinux 临时设为 permissive:
setenforce 0;如需永久生效,修改/etc/selinux/config
Nginx 配置一致性要求
两台机器的 Nginx 必须提供完全一致的服务内容,否则切换后用户看到的页面或行为可能异常。关键点:
- 配置文件路径、监听端口、server_name、root 路径必须相同
- 静态页建议区分标识便于验证,例如主节点
/usr/share/nginx/html/index.html写 “WEB01 - MASTER”,备节点写 “WEB02 - BACKUP” - 若用作反向代理,后端 upstream 列表、健康检查逻辑也需同步
Keepalived 主备配置要点
主节点 /etc/keepalived/keepalived.conf 示例:
global_defs {
router_id NGINX_MASTER
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
virtual_ipaddress {
192.168.201.130
}
}备节点对应配置仅两处不同:
state BACKUP-
priority 90(必须低于主节点,且两节点不能相同)
注意:interface 值需与实际网卡名一致(可用 ip a 查看),virtual_router_id 在同一组热备中必须唯一且相同。
增强可靠性:Nginx 进程健康检查
默认 Keepalived 只检测本机网络层连通性,不感知 Nginx 是否真在工作。推荐添加脚本主动检查:
在 /etc/keepalived/ 下新建 nginx_check.sh:
#!/bin/bash
if ! ps -C nginx --no-header > /dev/null; then
systemctl start nginx > /dev/null 2>&1
sleep 2
if ! ps -C nginx --no-header > /dev/null; then
systemctl stop keepalived
fi
fi赋予执行权限:chmod +x /etc/keepalived/nginx_check.sh,并在 vrrp_instance 块中加入:
track_script {
chk_nginx
}
再在全局区域定义:
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh"
interval 2
weight -5
}这样当 Nginx 挂掉且无法拉起时,Keepalived 会主动降权退出,触发 VIP 漂移。
验证与排错提示
启动服务后,用以下方式确认状态:
- 查看 VIP 是否生效:
ip a | grep 192.168.201.130—— 应只出现在主节点 - 查 Keepalived 日志:
tail -f /var/log/messages | grep Keepalived(或按需配置独立日志) - 模拟主节点宕机:
systemctl stop keepalived,观察 VIP 是否秒级迁移到备节点,并仍可curl http://192.168.201.130
常见失败原因:网卡名写错、VIP 不在同网段、防火墙拦截 VRRP 多播(224.0.0.18)、两节点 virtual_router_id 不一致、SELinux 阻断绑定 VIP 权限。


















