Nginx 反向代理集群怎么配置 Keepalived 实现高可用切换

文章导读
Nginx 反向代理集群配合 Keepalived 实现高可用,核心是通过 VRRP 协议管理一个浮动虚拟 IP(VIP),当主节点故障时自动漂移到备节点。该方案适合双机主备架构,风险边界在于网络分区可能导致的双主冲突(脑裂),需配置健康检查脚本规避。
📋 目录
  1. A 命令速用版
  2. B 为什么会这样
  3. C 分步处理
  4. D 怎么验证是否生效
  5. E 常见坑
  6. F 常见问题
  7. G 参考来源
A A

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:启动服务

Nginx 反向代理集群怎么配置 Keepalived 实现高可用切换

先启动 Master,再启动 Backup,观察日志无报错。

怎么验证是否生效

检查 VIP 绑定:在 Master 节点执行 ip addr show,确认虚拟 IP 存在于网卡上。

检查业务访问:使用客户端请求虚拟 IP,确认返回 Nginx 默认页或业务内容。

模拟故障切换:停止 Master 节点的 Keepalived 服务或断开网络,在 Backup 节点执行 ip addr show,确认虚拟 IP 已漂移至此。

查看日志:检查 /var/log/messagesjournalctl -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/