Keepalived 不负责 Nginx 配置同步,仅管理 VIP 漂移与健康切换;配置同步需手动或通过 scp、rsync+inotify、notify_master 脚本等外部方式实现,并确保主备节点配置一致且 nginx -t 通过。

Keepalived 本身不负责 Nginx 配置同步,它只管 VIP 漂移和节点健康切换。配置同步是独立环节,必须手动或借助其他工具完成。如果忽略这点,即使 Keepalived 切换成功,新主节点运行的仍是旧配置,服务可能异常甚至中断。
Nginx 配置同步不是 Keepalived 的职责
Keepalived 的核心能力是:
- 监控本机 Nginx 进程是否存活(通过
kill -0或自定义脚本) - 在主备间协商 VIP 归属(基于 VRRP 协议)
- 触发
notify_master/notify_backup等钩子脚本(仅作通知,不自动同步文件)
它不会读取、比较、复制或重载/etc/nginx/nginx.conf或conf.d/下的任何配置文件。
同步配置的实用方式
必须在 Keepalived 部署前或切换后主动处理,常见做法有:
-
手动同步(适合测试或小规模)
- 修改任一节点配置后,立即执行:
scp /etc/nginx/nginx.conf user@10.3.145.111:/etc/nginx/ scp -r /etc/nginx/conf.d/ user@10.3.145.111:/etc/nginx/ ssh user@10.3.145.111 "nginx -t && systemctl reload nginx"
- 修改任一节点配置后,立即执行:
-
利用 rsync + inotify 实时监听(生产推荐)
- 在 master 节点部署
inotifywait,监控/etc/nginx/变更,触发 rsync 推送至 backup:# 示例片段(需配合 systemd service 长期运行) inotifywait -m -e modify,create,delete /etc/nginx/ | while read; do rsync -avz --delete /etc/nginx/ user@10.3.145.111:/etc/nginx/ ssh user@10.3.145.111 "nginx -t && systemctl reload nginx" 2>/dev/null done
- 在 master 节点部署
-
结合 notify_master 脚本触发重载(增强可靠性)
- 在 Keepalived 配置中添加:
vrrp_instance VI_1 { ... notify_master "/usr/local/bin/reload-nginx.sh" } -
reload-nginx.sh内容示例:#!/bin/bash # 确保配置已就绪(如已提前同步),再安全重载 if nginx -t 2>/dev/null; then systemctl reload nginx fi
- 注意:该脚本不解决“配置未同步”的问题,只确保切换后 Nginx 用最新配置生效。
- 在 Keepalived 配置中添加:
关键检查项(上线前必做)
- 两台 Nginx 的
server_name、upstream、证书路径等必须完全一致,否则 VIP 切换后响应内容或 TLS 握手会出错 -
nginx -t在两台机器上都必须返回 success - 备份节点的
keepalived.conf中state BACKUP和priority值要低于主节点,避免脑裂 - 确保
virtual_router_id主备一致,且网卡名(如ens33)真实存在
不复杂但容易忽略


















