Nginx需搭配Keepalived实现高可用,主备模式稳当适用关键业务,双主模式提升资源利用率适合高流量;必须配置vrrp_script健康检查、正确设置VIP掩码及防火墙规则,并通过故障模拟验证切换可靠性。

Nginx 本身不支持集群化部署,单点运行存在致命风险。要实现真正可用的生产级服务,必须搭配 Keepalived 构建高可用(HA)架构——核心就是用虚拟 IP(VIP)屏蔽后端节点变化,让故障切换对用户透明。
主备模式:稳字当头,适合关键业务
这是最常用、最易落地的方案。两台 Nginx 服务器,一台为主(MASTER),持有 VIP 对外提供服务;另一台为备(BACKUP),只监听心跳、不响应流量。Keepalived 通过 VRRP 协议维持主备状态,主节点一旦失联(如进程崩溃、网络中断、或健康检查失败),备节点在 1–3 秒内自动接管 VIP。
- 主节点配置中
state MASTER、priority值设为较高(如 100) - 备节点对应设为
state BACKUP、priority略低(如 90) - 必须启用
vrrp_script自定义检测脚本(例如检查 nginx 进程或端口 80 是否存活),不能仅依赖 Keepalived 自带的简单 ping - 接口名(如
interface ens33)、virtual_router_id(同组内唯一)、认证密码(auth_pass)三者必须严格一致
双主模式:榨干资源,适合流量密集型场景
两台 Nginx 同时对外服务,各自绑定一个独立 VIP,流量通过 DNS 轮询、客户端负载或上层 LVS 分流。每台都既是主又是备:当 A 故障,B 不仅继续处理自身流量,还接管 A 的 VIP;反之亦然。
- 需配置两个
vrrp_instance,每个有独立virtual_router_id和 VIP - 两套
vrrp_script检测逻辑需隔离,避免相互干扰 - 必须关闭
vrrp_strict(否则多实例可能启动失败) - 脑裂风险更高,建议配合
notify脚本+外部仲裁(如 Redis 或 etcd)做二次确认
健康检查不能只靠“ping”
Keepalived 默认的心跳检测只是网络层连通性验证,无法反映 Nginx 实际服务能力。务必添加脚本检测:
- 检查
nginx进程是否存在(ps -C nginx --no-headers) - 或发起 HTTP 请求验证服务响应(
curl -s --connect-timeout 2 http://127.0.0.1/health | grep "ok") -
weight参数可联动调整优先级,比如检测失败时weight -5,使 priority 动态低于备机,触发切换
几个容易踩的坑
- 防火墙未放行 VRRP 组播地址(224.0.0.18)和协议号 112,导致心跳收不到
- 两台机器
router_id相同,VRRP 实例无法正常协商角色 -
virtual_ipaddress没加/32掩码(如写成192.168.200.100/32),可能导致 ARP 广播异常 - SELinux 或 NetworkManager 干扰 VIP 绑定,建议关闭或配置白名单
这套组合不复杂,但每个细节都影响切换是否可靠。真正上线前,一定要模拟 kill -9 nginx、拔网线、关机等场景做切换验证。


















