Nginx 反向代理集群配合 Keepalived 实现高可用,核心是通过 VRRP 协议管理一个浮动虚拟 IP(VIP),当主节点故障时自动漂移到备节点。该方案适合双机主备架构,风险边界在于网络分区可能导致的双主冲突(脑裂),需配置健康检查脚本规避。
先说结论:Keepalived 通过 VIP 漂移实现 Nginx 入口高可用,配置重点在于 VRRP 优先级和健康检查脚本。
- 适合:双机主备架构,需要统一入口 IP 的生产环境。
- 先准备:两台安装了 Nginx 的 Linux 服务器,规划好不冲突的 VIP 地址。
- 验收:断开主节点网络后,VIP 能在秒级内漂移到备节点且业务可访问。
命令速用版
以下命令基于 CentOS/RHEL 环境,Debian/Ubuntu 请替换包管理器为 apt。
# 安装 Keepalived
yum install keepalived -y
# 编辑配置文件
vim /etc/keepalived/keepalived.conf
# 启动并设置开机自启
systemctl start keepalived
systemctl enable keepalived
# 查看状态和 IP
systemctl status keepalived
ip addr show为什么会这样
Keepalived 利用 VRRP 协议在多台服务器间选举出一台主节点持有虚拟 IP。
正常情况下,优先级高的服务器作为 Master 绑定 VIP 对外提供服务。当 Master 节点宕机或健康检查失败,Backup 节点检测到 VRRP 通告中断,会自动提升优先级接管 VIP。Nginx 只需监听本地所有 IP 或特定 VIP,无需感知底层切换,从而实现入口高可用。
分步处理
步骤 1:安装与基础检查
在两台服务器上均安装 Keepalived 和 Nginx,确保 Nginx 能正常启动。
nginx -t
systemctl status nginx步骤 2:配置 Master 节点
编辑 `/etc/keepalived/keepalived.conf`,设置状态为 MASTER,优先级设为 100,填写真实的物理 IP 作为 unicast_src_ip(若使用单播)。
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.100
}
}步骤 3:配置 Backup 节点
配置文件类似,state 改为 BACKUP,priority 改为 90,其他保持一致。
步骤 4:配置健康检查脚本
编写脚本检查 Nginx 进程,若失败则停止 Keepalived 以触发漂移。脚本需赋予执行权限。
#!/bin/bash
if ! pgrep -x "nginx" > /dev/null; then
systemctl stop keepalived
fi在配置文件中通过 `vrrp_script` 调用该脚本。
步骤 5:启动服务
先启动 Master,再启动 Backup,观察日志无报错。
怎么验证是否生效
检查 VIP 绑定:在 Master 节点执行 ip addr show,确认虚拟 IP 存在于网卡上。
检查业务访问:使用客户端请求虚拟 IP,确认返回 Nginx 默认页或业务内容。
模拟故障切换:停止 Master 节点的 Keepalived 服务或断开网络,在 Backup 节点执行 ip addr show,确认虚拟 IP 已漂移至此。
查看日志:检查 /var/log/messages 或 journalctl -u keepalived,确认有 VRRP 状态切换记录。
常见坑
防火墙拦截 VRRP 报文:Keepalived 使用 VRRP 协议(IP 协议号 112),防火墙需放行该协议或多播地址 224.0.0.18,否则备节点无法检测主节点状态。
健康检查脚本权限:脚本必须有执行权限(chmod +x),且配置文件中路径需正确,否则 Keepalived 启动失败。
虚拟 ID 冲突:同一局域网内不同 Keepalived 集群的 virtual_router_id 不能相同,否则会导致 IP 冲突。
脑裂风险:若网络波动导致主备无法通信,可能同时持有 VIP。建议配置第三方仲裁或调整 advert_int 时间。
常见问题
虚拟 IP 配置后无法 Ping 通?
检查防火墙是否允许 ICMP 协议,以及 VIP 是否成功绑定到网卡上。
Nginx 配置文件两台服务器需要一样吗?
建议保持一致,确保切换后业务逻辑相同,但监听地址可配置为 0.0.0.0 以适配 VIP 漂移。
出现双主(脑裂)怎么解决?
检查网络连通性和防火墙设置,确保 VRRP 报文能正常交互,必要时降低 advert_int 间隔。
参考来源
Keepalived Official Documentation: https://keepalived.org/
Nginx Official Documentation: https://nginx.org/