Keepalived + Nginx 高可用
Keepalived + Nginx 是实现中小规模业务高可用的经典方案。 基于 VRRP 协议实现 VIP 漂移,主节点宕机时备节点自动接管,切换时间 3-10 秒, 对上游客户端完全透明。是运维工程师入门高可用架构的第一课。
架构原理
VRRP 协议
VRRP(Virtual Router Redundancy Protocol)允许多台路由器共享一个虚拟 IP(VIP):
- 主节点(Master)持有 VIP,定期发送 VRRP 广播(默认 1 秒)
- 备节点(Backup)监听广播,主节点失联(3 次未收到广播)时自动接管 VIP
- 切换对客户端透明,IP/MAC 映射通过 ARP 更新
核心组件
客户端 → VIP
→ Keepalived(VRRP 心跳)→ Nginx → Backend Servers
- Keepalived: VRRP 实现 + 健康检查 + 状态通知
- Nginx: 反向代理 / 静态资源服务
- VIP: 浮动 IP,始终绑定到当前主节点
- 健康检查脚本: vrrp_script 调用外部脚本,检测 Nginx 进程和 HTTP 响应
适用场景
- 静态资源服务高可用
- Nginx 反向代理入口高可用
- 小型业务主备方案
不适用场景: 多活架构、毫秒级切换需求 → 需用 LVS DR 模式或硬件负载均衡器。
Keepalived 配置要点
主备核心参数
| 参数 | 主节点 | 备节点 | 说明 |
|---|---|---|---|
| state | MASTER | BACKUP | 初始状态,最终由 priority 决定 |
| priority | 100 | 80 | 差值建议 20-50,需考虑 weight 影响 |
| virtual_router_id | 51 | 51 | 同集群内一致,同一网段不同集群不可重复 |
| advert_int | 1 | 1 | VRRP 广播间隔,单位秒 |
关键配置项
# 网卡名确认(不同发行版差异大)
ip a
ls /sys/class/net/
# virtual_router_id 范围 0-255,同一网段不可重复
# weight 为负值时:脚本失败 → 优先级降低 → 备节点接管
# weight -10 表示脚本失败时 priority -= 10
非抢占模式(nopreempt)
默认主节点恢复后抢回 VIP。若希望减少切换次数:
vrrp_instance VI_1 {
state BACKUP
priority 100
nopreempt
}
Nginx 健康检查策略
健康检查有多个层次,根据可靠性要求选择:
| 层次 | 检查方法 | 发现的问题 | 响应速度 |
|---|---|---|---|
| 1 | ps -ef | grep nginx |
Nginx 进程崩溃 | 快(2s 间隔) |
| 2 | curl http://127.0.0.1/ |
Nginx 无法响应(超载/死锁) | 中等(2-3s) |
| 3 | curl http://upstream/health |
后端服务不可达 | 慢(取决于 upstream) |
生产建议: 层次 1 + 2 必须启用,层次 3 根据业务场景选择。 如果后端全挂时不想触发主备切换(换个节点也一样),层次 3 可以改为只记日志不退出。
VIP 漂移全流程
正常状态:
Master: VIP + Nginx 运行
Backup: 无 VIP + Nginx 待命
Nginx 崩溃:
Master: check_nginx 脚本返回非 0 → priority -= weight → priority < Backup
Backup: 检测到 priority 更高 → 广播发送 → 绑定 VIP
主机宕机:
Master: 停止 VRRP 广播
Backup: 3×advert_int 未收到广播 → 接管 VIP
恢复(默认):Master 恢复后 priority 回归 → 抢回 VIP
恢复(nopreempt):Master 恢复后不抢回,等待 Backup 故障
配置一致性保障
两台 Nginx 配置必须同步,否则备节点接管后无法正确服务:
# rsync 同步
rsync -avz /etc/nginx/ root@backup:/etc/nginx/
# ansible playbook
ansible nginx-servers -m copy -a "src=/etc/nginx/ dest=/etc/nginx/"
# 证书同步(SSL 证书双向同步)
rsync -avz /etc/nginx/ssl/ root@backup:/etc/nginx/ssl/
与 Nginx 配置的关联
Keepalived + Nginx 的 HA 方案中,Nginx 自身配置的可靠性同样重要。 参见 nginx-config-pitfalls 了解常见的 Nginx 配置错误(location 匹配、proxy_pass 路径处理、upstream keepalive 等)。
风险与注意事项
-
脑裂(Split-Brain): 网络分区时两台可能各自持有 VIP。 解决:使用单播(unicast_src_ip + unicast_peer)替代广播,并配置防火墙放行 VRRP(协议号 112)。
-
切换中断: 默认 3-10s 中断。需要更高可用性时,客户端应有重试机制(HTTP 请求重试、Nginx upstream 失败重试)。
- 配置一致性: 两台 Nginx 配置必须同步。建议使用 rsync、ansible 或 git+部署脚本。
- VIP 同网段约束: Keepalived 依赖 ARP 广播,无法跨网段。跨网段需 LVS DR 模式或隧道模式。
- 后端单点瓶颈: 本方案只解决 Nginx 层的 HA,后端服务若为单点则仍有单点故障风险。
部署后验证清单
- [ ] VIP 绑定在主节点(
ip addr show) - [ ] 备节点无 VIP
- [ ] 通过 VIP 访问服务正常(
curl http://VIP/) - [ ] 杀掉 Nginx → VIP 漂移到备节点 → 服务恢复
- [ ] 主节点关机 → 备节点接管
- [ ] 恢复后 VIP 行为符合预期(nopreempt 或自动抢回)
- [ ] 健康检查脚本返回码正确(手动执行
echo $?) - [ ] VRRP 通信正常(
tcpdump -i eth0 vrrp -n) - [ ] SSL 证书在两台同步
关联页面
| 页面 | 关联点 |
|---|---|
| nginx-config-pitfalls | Nginx 典型配置错误复盘(高可用架构中的 upstream 与 proxy_pass 误配) |
| keepalived-ha-hidden-pitfalls | Keepalived+Nginx 高可用架构 3 个隐藏坑位与生产级防护方案(脑裂/健康检查僵尸进程 |
| nginx-pre-launch-checklist | Nginx 上线前检查清单(Keepalived + Nginx 高可用上线前必检项) |