nginx 本身不支持双机热备,需配合 keepalived 实现 vip 漂移与主备切换;核心是 nginx + keepalived 协同构建高可用入口,要求同子网、静态 ip、一致配置、健康检查脚本防假死。

Nginx 本身不直接支持“双机热备”意义上的 VIP 漂移或主备自动切换,它只是一个反向代理/负载均衡器。真正在内网实现双机热备+流量转发,必须配合 Keepalived(基于 VRRP 协议)来管理虚拟 IP(VIP),让两台 Nginx 服务器共享同一个对外服务地址,故障时秒级接管。
核心不是“Nginx 配置双机热备”,而是 Nginx + Keepalived 协同构建高可用入口。以下是针对内网场景的实用配置要点:
网络与系统基础必须一致
两台 Nginx 服务器需部署在**同一内网子网**,且满足以下硬性前提:
- 使用静态 IP(如主:10.0.1.10,备:10.0.1.11),VIP(如 10.0.1.100)不配置在任何物理网卡上,由 Keepalived 动态绑定
- 关闭 firewalld 或放行:TCP 80/443(业务端口) + VRRP 协议(IP 协议号 112)
- SELinux 设为 permissive(
setenforce 0),避免拦截组播心跳 - 用
ip a确认真实网卡名(如 ens160),Keepalived 配置中interface字段必须完全匹配
Nginx 配置必须逐字同步
内网客户端通过 VIP 访问服务,切换后若返回不同响应(如 502、页面不一致、跳转错误后端),就会感知故障。因此:
-
/etc/nginx/nginx.conf及所有 include 文件(如 upstream、server 块)内容必须完全一致 - 重点校验:
listen端口、server_name(若用域名)、proxy_pass目标地址、upstream列表及健康检查参数(max_fails/fail_timeout) - 建议首页加标识便于验证:
echo "NODE-A - MASTER"和echo "NODE-B - BACKUP" - 每次修改后执行
nginx -t && systemctl reload nginx
Keepalived 主备角色靠三要素联动
VRRP 不看主机名,只认三个严格匹配的参数:
-
state:主节点设为 MASTER,备节点为 BACKUP -
priority:主节点数值更高(如 100),备节点略低(如 90),且不能相同 -
virtual_router_id:主备必须完全一致(如 51),这是 VRRP 组唯一标识,错一个就无法通信
同时,在 virtual_ipaddress 块中声明 VIP,例如:virtual_ipaddress { 10.0.1.100/24 dev ens160 }
必须加 Nginx 健康检查脚本防假死
Keepalived 默认只检测网络连通性。若 Nginx 进程崩溃但系统存活,VIP 不会漂移——这就是内网最常踩的坑。
- 写检查脚本
/etc/keepalived/nginx_check.sh,内容示例:
#!/bin/bash
if killall -0 nginx 2>/dev/null; then
exit 0
else
exit 1
fi- 在 keepalived.conf 的
vrrp_script块中调用:
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh"
interval 2
weight -2
}- 在
vrrp_instance VI_1中加入:track_script { chk_nginx; } - 这样当 Nginx 异常,主节点优先级会实时降低,触发 VRRP 重选,VIP 自动漂移到备机
不复杂但容易忽略。











