nginx自身无双机热备能力,需与keepalived配合实现高可用:通过vrrp协议管理统一vip,主节点正常时绑定vip,故障后秒级漂移至备节点;要求nginx配置完全一致、keepalived主备参数严格匹配(state、priority、virtual_router_id、interface)、必须配置curl或进程级健康检查脚本防假死,并完成防火墙放行vrrp(协议号112)、时间同步及selinux调优等系统准备。

Nginx 本身不内置双机热备能力,必须搭配 Keepalived 实现高可用。核心思路是:两台 Nginx 服务器提供完全一致的服务,由 Keepalived 基于 VRRP 协议管理一个虚拟 IP(VIP),主节点正常时 VIP 绑定在其网卡上;一旦主节点宕机或 Nginx 崩溃,VIP 自动漂移到备节点,客户端无感知切换。
以下为关键配置要点,直击落地难点:
确保 Nginx 服务完全一致
两台机器的 Nginx 必须对外呈现相同行为,否则切换后用户可能看到错误页或功能异常:
- 配置文件路径、监听端口(如
listen 80)、server_name、root路径需严格一致 - 静态资源目录内容建议加区分标识(如主节点首页写
WEB01 - MASTER,备节点写WEB02 - BACKUP),便于快速验证当前生效节点 - 若用作反向代理,
upstream定义、健康检查参数、SSL 证书路径等也必须同步
Keepalived 主备角色与 VIP 控制
主节点配置中 state MASTER、优先级设为更高值(如 priority 100);备节点设为 state BACKUP、优先级略低(如 priority 90);两者 virtual_router_id 必须相同(如 51),且在同一子网内:
-
interface指定实际网卡名(如eth0或ens33),务必确认真实接口名 -
virtual_ipaddress块中只写 VIP(如192.168.201.130/24),不配置在物理网卡上 -
advert_int 1表示每秒发送一次 VRRP 通告,心跳间隔不宜过大
必须加入 Nginx 健康检查脚本
仅靠 Keepalived 自身的心跳无法感知 Nginx 进程是否真正在工作。需添加自定义检测脚本,避免“VIP 还在、但 Nginx 已死”的假活状态:
- 编写
/etc/keepalived/nginx_check.sh,内容为:#!/bin/bash if ! kill -0 $(cat /var/run/nginx.pid) 2>/dev/null; then systemctl start nginx 2>/dev/null sleep 1 if ! nginx -t &>/dev/null || ! systemctl is-active --quiet nginx; then exit 1 fi fi - 在
keepalived.conf中定义vrrp_script,调用该脚本,并设置weight -5:脚本失败时降低本节点优先级,触发自动切换 - 脚本需赋予可执行权限:
chmod +x /etc/keepalived/nginx_check.sh
系统级基础准备不可跳过
- 关闭或放行防火墙:VRRP 使用 IP 协议号 112(非 TCP/UDP),需显式放行:
firewall-cmd --permanent --add-rich-rule='rule protocol value="112" accept' - SELinux 设为 permissive 模式(
setenforce 0),或调整策略允许 Keepalived 绑定 VIP - 两台服务器时间需同步(
chronyd或ntpd),避免因时间差导致 VRRP 状态异常
不复杂但容易忽略。











