keepalived 通过 vrrp 协议实现单个 vip 在多台 nginx 节点间的主备高可用接管,本质是双机热备而非负载均衡;其核心为 vip 漂移与健康检查,依赖优先级、状态配置及可靠脚本判断 nginx 实际服务能力,并推荐启用非抢占模式保障生产稳定性。

Keepalived 本身不直接“管理”多个 Nginx 实例,而是通过 VRRP 协议保障**单个 VIP(虚拟 IP)在多个 Nginx 节点间的高可用接管**。所谓“管理多实例”,实际是指:在多台部署了 Nginx 的服务器上,用 Keepalived 实现主备切换,确保对外只暴露一个稳定 VIP,流量始终由当前活跃的 Nginx 节点处理——这本质是双机热备(Active-Standby),不是多实例并行负载均衡。
核心逻辑:VIP 漂移 + 健康检查
Keepalived 不调度请求、不分发流量,它只做两件事:
- 监控本机 Nginx 进程或端口是否存活(通过自定义脚本或 TCP 检查)
- 根据优先级和健康状态,决定哪台机器持有 VIP;一旦主节点失联或 Nginx 异常,VIP 立即漂移到备节点
客户端访问的始终是同一个 VIP(如 192.168.5.200),背后真实提供服务的 Nginx 实例自动切换,业务无感。
主备配置关键差异点
两台服务器都装 Nginx 和 Keepalived,但配置需严格区分:
-
state:主节点设为
MASTER,备节点必须为BACKUP - priority:主节点优先级更高(如 100),备节点略低(如 90),数值越大越可能成为 Master
- vrrp_instance 名称与 virtual_router_id:必须完全一致,否则无法组成同一 VRRP 组
- virtual_ipaddress:VIP 地址相同,仅写在 vrrp_instance 块内,Keepalived 自动绑定/解绑
健康检查脚本要可靠
仅靠 Keepalived 自带的 TCP 端口检查(如 :80 是否通)不够健壮,建议使用自定义脚本判断 Nginx 实际服务能力:
- 检查 nginx 进程是否存在(
pgrep nginx) - 或 curl 本地 127.0.0.1 的健康接口(如
/health),返回 200 才算正常 - 脚本返回非 0 值时,Keepalived 会降低本节点优先级,触发切换
- 脚本路径、权限(
chmod +x)、执行用户(建议 root 或 keepalived 运行用户)需确认无误
非抢占模式更稳,适合生产
主节点恢复后立刻抢回 VIP,可能造成瞬时连接中断或请求重试。推荐启用非抢占:
- 主、备节点 state 都设为
BACKUP - 主节点加配置
nopreempt(放在 vrrp_instance 块内) - 这样只有当前持有 VIP 的节点故障,才会切换;原主恢复后不会主动夺权
- 启动顺序决定初始 Master:先启的节点获得 VIP











