##(主备模式・前端部署・3 台 Tomcat 负载均衡・标准生产方案・无 LVS 版)
二、适用场景与架构说明
1. 适用需求
- 部署前后端分离项目,Nginx 托管前端静态资源
- 后端3 台 Tomcat / 应用服务,需要负载均衡 + 故障自愈
- 两台 Nginx 服务器:一主一备,实现入口高可用
- 主 Nginx 宕机,备机自动接管 VIP,业务无感知
- 拒绝 LVS/ipvsadm,追求简单、稳定、易维护
2. 最终架构(一层负载)
客户端请求
↓
VIP:192.168.1.100(Keepalived负责漂移)
↓
Nginx主(192.168.1.10) ←心跳→ Nginx备(192.168.1.11)
↓(同一时间仅一台工作)
Nginx upstream负载均衡
↓
Tomcat1(192.168.1.20:8080) Tomcat2(192.168.1.21:8080) Tomcat3备用(192.168.1.22:8080)
3. 核心结论
- 无需 LVS、无需 ipvsadm
- Keepalived 仅做VIP 漂移高可用
- Nginx 自带 7 层负载均衡,完全满足 Web 业务
- 生产环境中小项目标准最优方案
三、环境规划(示例 IP,你可直接替换)
表格
| 角色 | IP 地址 | 作用 |
|---|---|---|
| VIP 虚拟 IP | 192.168.1.100 | 统一入口,自动漂移 |
| Nginx 主节点 | 192.168.1.10 | 主入口服务器 |
| Nginx 备节点 | 192.168.1.11 | 备用接管服务器 |
| 后端 Tomcat1 | 192.168.1.20:8080 | 后端应用节点 1 |
| 后端 Tomcat2 | 192.168.1.21:8080 | 后端应用节点 2 |
| 后端 Tomcat3 | 192.168.1.22:8080 | 备用应用节点 |
四、完整操作步骤(两台 Nginx 都执行,标主 / 备的单独执行)
步骤 1:安装 Nginx(主、备 Nginx 都执行)
# CentOS/RHEL
yum install -y nginx
# 设置开机自启
systemctl enable nginx
步骤 2:安装 Keepalived(主、备 Nginx 都执行)
yum install -y keepalived
systemctl enable keepalived
步骤 3:编写 Nginx 存活检测脚本(主、备都执行)
vi /etc/keepalived/check_nginx.sh
#!/bin/bash
# 检测Nginx是否运行,挂掉则尝试重启,仍失败则让出VIP
nginx_num=$(ps -ef | grep nginx | grep -v grep | wc -l)
if [ $nginx_num -eq 0 ]; then
systemctl start nginx
sleep 2
nginx_num=$(ps -ef | grep nginx | grep -v grep | wc -l)
if [ $nginx_num -eq 0 ]; then
systemctl stop keepalived
exit 1
fi
fi
exit 0
赋予执行权限:
chmod +x /etc/keepalived/check_nginx.sh
步骤 4:配置 Nginx 主配置文件(主、备 Nginx 配置完全一致)
vi /etc/nginx/nginx.conf
五、完整配置文件示例(直接复制可用)
1. Nginx 完整配置(nginx.conf)
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
events {
worker_connections 1024;
use epoll;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$upstream_addr"';
access_log /var/log/nginx/access.log main;
sendfile on;
keepalive_timeout 65;
gzip on;
# 后端3台Tomcat负载均衡集群
upstream tomcat_cluster {
server 192.168.1.20:8080 weight=5;
server 192.168.1.21:8080 weight=5;
server 192.168.1.22:8080 backup; # 备用节点
}
server {
listen 80;
server_name 192.168.1.100; # 绑定VIP
# 前端部署路径:访问 http://VIP/WEB/
location /WEB/ {
root /data/frontend/;
index index.html;
try_files $uri $uri/ /WEB/index.html; # Vue/React路由适配
}
# 后端API代理
location /api/ {
proxy_pass http://tomcat_cluster/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 10s;
proxy_read_timeout 30s;
client_max_body_size 100m;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
}
2. 前端目录创建(主、备都执行)
mkdir -p /data/frontend/WEB
# 将前端打包文件放入 /data/frontend/WEB
chown -R nginx:nginx /data/frontend
3. Keepalived 主节点配置(192.168.1.10)
mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
vi /etc/keepalived/keepalived.conf
global_defs {
router_id NGINX_MASTER
}
vrrp_script check_nginx {
script "/etc/keepalived/check_nginx.sh"
interval 2
weight -20
}
vrrp_instance VI_1 {
state MASTER
interface eth0 # 改为你的实际网卡名(ens33等)
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
192.168.1.100/24
}
track_script {
check_nginx
}
}
4. Keepalived 备节点配置(192.168.1.11)
global_defs {
router_id NGINX_BACKUP
}
vrrp_script check_nginx {
script "/etc/keepalived/check_nginx.sh"
interval 2
weight -20
}
vrrp_instance VI_1 {
state BACKUP
interface eth0 # 同主节点网卡
virtual_router_id 51
priority 80 # 优先级低于主
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
192.168.1.100/24
}
track_script {
check_nginx
}
}
六、启动服务与验证
1. 检查 Nginx 配置并启动
nginx -t
systemctl start nginx
2. 启动 Keepalived
systemctl start keepalived
3. 高可用验证
- 查看 VIP 绑定:
ip addr(正常在主节点) - 访问测试:
http://192.168.1.100/WEB/ - 主 Nginx 宕机测试:
systemctl stop nginx - 观察 VIP 自动漂移到备机,业务正常访问
- 后端 Tomcat 停机,Nginx 自动剔除故障节点
七、核心知识点总结(你所有疑问的答案)
- VIP 漂移(Keepalived)
- 只负责入口高可用,主备机器间切换
- 不负责后端负载分发
- LVS/ipvsadm
- 4 层负载工具,Web 场景完全不需要
- 仅用于 MySQL、Redis 等纯 TCP 服务
- 一层负载 vs 两层负载
- 你的架构:Nginx 一层负载,简单稳定
- LVS 架构:两层负载,大厂超大流量用
- 关键口诀
VIP 漂移管高可用,解决入口单点故障;LVS 是 4 层负载器,Web 项目无需使用;Nginx 自带负载均衡,前端后端都能管;主备切换靠 Keepalived,后端容错靠健康检查。