要让Nginx在高并发下真正稳定,必须通过Keepalived实现VIP漂移的主备切换,确保服务不中断;需两台服务器同网段互通、环境一致、防火墙放行80端口和VRRP协议(IP 112)、SELinux设为permissive,并配置精准的vrrp_instance与Nginx进程级健康检查。

要让 Nginx 在高并发场景下真正“稳得住”,光靠单机优化远远不够;关键是在架构层面引入故障自动接管能力——Nginx 本身不自带主备切换,必须靠 Keepalived 提供 VIP 漂移能力,形成“服务不中断”的兜底机制。这不是简单叠加两个软件,而是让它们在协议层、进程层、网络层协同工作。
确保基础环境一致且可互通
两台服务器(比如 web01 和 web02)必须处于同一二层网络,能互相 ping 通,且物理网卡名一致(如都为 eth0 或 ens33)。推荐使用 CentOS 7/8 或 Rocky Linux,内核版本不低于 3.10。重点检查三项:
- Nginx 版本、配置文件路径、监听端口、server_name、root 目录完全相同;静态页建议加主机标识(如 “MASTER” / “BACKUP”),便于快速验证切换效果
- 防火墙必须放行 TCP 80 端口 + VRRP 协议(IP 协议号 112),不能只开 80;若用 firewalld,执行:
firewall-cmd --permanent --add-rich-rule='rule protocol value="112" accept' - SELinux 设为 permissive 模式(
setenforce 0),避免拦截 keepalived 绑定 VIP 或执行健康脚本
Keepalived 主备配置需精准区分角色
主节点 priority 必须高于备节点(如 100 vs 90),且 virtual_router_id 必须严格一致(同一组热备中不可重复)。interface 值务必与 ip a 输出的网卡名完全匹配,否则 VIP 无法绑定。示例核心段:
主节点 /etc/keepalived/keepalived.conf:
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
virtual_ipaddress { 192.168.1.100 }
}
备节点仅改两处:
state BACKUPpriority 90
必须添加 Nginx 进程级健康检查
默认 Keepalived 只检测网络连通性,Nginx 进程挂了却感知不到。需编写 shell 脚本并注册为 vrrp_script:
- 脚本内容(如 /etc/keepalived/check_nginx.sh):
#!/bin/bash+killall -0 nginx &>/dev/null || exit 1,记得chmod +x - 在 keepalived.conf 中定义:
vrrp_script chk_nginx { script "/etc/keepalived/check_nginx.sh" interval 2 weight -10 fall 3 rise 2 } - 在 vrrp_instance 块内引用:
track_script { chk_nginx }
这样当 Nginx 异常退出,主节点优先级会实时降低,触发 VIP 漂移,避免“有 VIP 没服务”的假高可用。
高并发下的实际调优要点
单纯堆配置无法应对真实流量压力,还需联动调优:
- Nginx worker_processes 设为 auto,worker_connections 至少调至 65535;开启
use epoll和multi_accept on - Keepalived 的
advert_int 1已是常规值,但若网络延迟波动大,可微调fall/rise参数(如 fall 5 rise 3),防止误切 - 避免将 VIP 配置在 loopback 或 docker0 等非物理网卡上;VIP 必须能被客户端直连,且不能与任一物理 IP 冲突
- 上线前务必用
curl -I http://VIP和ip addr show交叉验证 VIP 绑定状态,再模拟 kill nginx 进程测试漂移时效(通常 3–5 秒内完成)


















