网站建设好后,部署在云服务器上,网站的稳定运行直接关第到网站在搜索引挚排名中的表现,如果服务器中途崩溃,流量会被搜索引挚处罚,最严重的结果就是网站流量给清零,这可不是站长们想要的结果,下面就详细说明通过Nginx 负载均衡 + 双机热备方案实现网站稳定运行:
方案架构图
互联网用户
↓
┌─────────────────────┐
│ 阿里云 SLB/Nginx │ (健康检查 + 负载均衡)
│ 47.xxx.xxx.100 │
└─────────────────────┘
↓
(自动分发)
↓
┌──────────┴──────────┐
↓ ↓
┌─────────┐ ┌─────────┐
│服务器 A │ │服务器 B │
│(主节点) │ │(备节点) │
│47.x.x.1 │ │47.x.x.2 │
└─────────┘ └─────────┘
↓ ↓
└──────────┬──────────┘
↓
┌─────────────────────┐
│ 阿里云 RDS 数据库 │ (主从同步)
│ MySQL 主备实例 │
└─────────────────────┘
↓
┌─────────────────────┐
│ 阿里云 NAS/OSS │ (共享文件存储)
│ 文件同步 │
└─────────────────────┘
【一、核心组件】
负载均衡层
├── 阿里云 SLB (推荐)
│ ├── 公网 IP + 固定带宽
│ ├── 健康检查: 每 5 秒检测一次
│ ├── 失败阈值: 连续 3 次失败则剔除
│ └── 恢复检测: 连续 3 次成功则恢复
│
└── 自建 Nginx (备选)├── 独立服务器/轻量服务器 └── nginx upstream 健康检查模块应用服务器层 (双节点)
├── 服务器 A (主) - 阿里云 ECS
│ ├── CPU: 4核
│ ├── 内存: 8GB
│ ├── 系统盘: 40GB
│ ├── 数据盘: 100GB
│ └── Tomcat 9 + Cms
│
└── 服务器 B (备) - 阿里云 ECS (相同配置)└── 实时同步状态数据库层
├── 阿里云 RDS MySQL (主备版)
│ ├── 自动主从同步
│ ├── 自动故障切换
│ └── 数据一致性保证
│
└── 或自建数据库主从复制├── 服务器 A: MySQL 主库 └── 服务器 B: MySQL 从库文件存储层
├── 阿里云 NAS (推荐)
│ ├── 双节点同时挂载
│ ├── 自动同步
│ └── 高可用保证
│
└── 或自建文件同步├── rsync + inotify 实时同步 └── /opt/tomcat11/webapps/ROOT/
【二、工作原理】
正常状态
┌────────────┐
│ SLB 接收请求 │
│ ↓ │
│ 健康检查 A: ✓ 正常 │
│ 健康检查 B: ✓ 正常 │
│ ↓ │
│ 按权重分发 (A: 100%, B: 0%) │
│ ↓ │
│ 所有流量 → 服务器 A │
└─────────────┘A 故障切换
┌────────────┐
│ 服务器 A 崩溃 │
│ ↓ │
│ SLB 健康检查失败 (15秒内) │
│ ↓ │
│ 自动剔除 A │
│ ↓ │
│ 所有流量 → 服务器 B │
│ ↓ │
│ 用户无感知 (切换时间 < 1秒) │
└──────────────┘A 恢复上线
┌────────────┐
│ 修复服务器 A │
│ ↓ │
│ 启动 Tomcat │
│ ↓ │
│ SLB 健康检查成功 │
│ ↓ │
│ 自动加入集群 │
│ ↓ │
│ 流量逐步切回 A │
└────────────┘
【三、详细配置步骤】
步骤1: 准备两台服务器
服务器 A (主)
- 区域: 华南1 (广州)
- IP: 47.xxx.xxx.101
- 安装: Tomcat 9 + Cms
- 状态: 当前运行中
服务器 B (备)
- 区域: 华南1 (广州) - 必须同区域!
- IP: 47.xxx.xxx.102
- 安装: 与 A 完全相同的环境
- 状态: 待部署
服务器 B 快速部署方法:
- 购买与 A 相同配置的 ECS
- 使用 A 的系统盘创建镜像
- 用镜像创建 B (最快,配置完全一致)
- 修改 B 的配置文件 (IP、hostname)
步骤2: 配置数据库 (选择其一)
【方案 A: 阿里云 RDS (推荐)】
购买 RDS MySQL 主备版
- 规格: 2核4GB 起步
- 存储: 100GB
- 自动主从同步、自动故障切换
迁移数据库
# 在服务器 A 导出 mysqldump -h127.0.0.1 -ucms -p cms > cms.sql # 导入到 RDS mysql -hRDS地址 -ucms -p cms < cms.sql修改两台服务器配置
# 服务器 A 和 B 都修改 vim /opt/tomcat11/webapps/ROOT/WEB-INF/config/cms.properties # 修改数据库地址为 RDS 内网地址 db.pool.default.jdbcUrl=jdbc:mysql://rm-xxxxx.mysql.rds.aliyuncs.com:3306/cms
【方案 B: 自建数据库主从】
服务器 A 配置为主库
vim /etc/my.cnf [mysqld] server-id=1 log-bin=mysql-bin binlog-do-db=cms服务器 B 配置为从库
vim /etc/my.cnf [mysqld] server-id=2 relay-log=mysql-relay-bin read_only=1配置主从复制
-- 在主库 A 执行 CREATE USER 'repl'@'%' IDENTIFIED BY 'password'; GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%'; FLUSH PRIVILEGES; SHOW MASTER STATUS; -- 记录 File 和 Position -- 在从库 B 执行 CHANGE MASTER TO MASTER_HOST='47.xxx.xxx.101', MASTER_USER='repl', MASTER_PASSWORD='password', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=154; START SLAVE; SHOW SLAVE STATUS\G -- 确认同步正常
步骤3: 配置文件同步 (选择其一)
【方案 A: 阿里云 NAS (推荐)】
购买 NAS 文件系统
- 类型: 通用型 NAS
- 协议: NFS
在两台服务器挂载
# 安装 NFS 客户端 yum install -y nfs-utils # 挂载 NAS mount -t nfs -o vers=3 file-system-id.region.nas.aliyuncs.com:/ /mnt/nas # 开机自动挂载 echo "file-system-id.region.nas.aliyuncs.com:/ /mnt/nas nfs vers=3,defaults 0 0" >> /etc/fstab迁移 Cms 文件
# 停止 Tomcat /opt/tomcat11/bin/shutdown.sh # 复制到 NAS cp -r /opt/tomcat11/webapps/ROOT /mnt/nas/cms # 创建软链接 rm -rf /opt/tomcat11/webapps/ROOT ln -s /mnt/nas/cms /opt/tomcat11/webapps/ROOT # 启动 Tomcat /opt/tomcat11/bin/startup.sh
【方案 B: rsync 实时同步】
在服务器 B 安装 rsync
yum install -y rsync inotify-tools创建同步脚本 (在服务器 A)
vim /opt/sync.sh#!/bin/bash # 实时同步到服务器 B SRC="/opt/tomcat11/webapps/ROOT/" DEST="root@47.xxx.xxx.102:/opt/tomcat11/webapps/ROOT/" # 排除不需要同步的目录 EXCLUDE="--exclude=work --exclude=logs --exclude=temp" # 初始全量同步 rsync -avz $EXCLUDE $SRC $DEST # 监控文件变化并实时同步 inotifywait -mrq --timefmt '%Y-%m-%d %H:%M:%S' --format '%T %w%f %e' \ -e modify,create,delete,attrib $SRC | while read date time file event do rsync -avz $EXCLUDE $SRC $DEST echo "$date $time $file $event 已同步" done配置 SSH 免密登录
ssh-keygen -t rsa ssh-copy-id root@47.xxx.xxx.102启动同步服务
chmod +x /opt/sync.sh nohup /opt/sync.sh > /var/log/sync.log 2>&1 &
步骤4: 配置阿里云 SLB (推荐方案)
创建 SLB 实例
- 进入阿里云控制台 - 产品: 传统型负载均衡 CLB - 网络类型: 公网 - 规格: 性能保障型 (slb.s2.small) - 价格: ¥200-300/月添加监听器
监听协议: HTTPS/443 └── SSL 证书: 选择已有证书 └── 后端协议: HTTP/8080 健康检查: ├── 检查方法: HEAD ├── 检查路径: / ├── 检查间隔: 5秒 ├── 响应超时: 3秒 ├── 健康阈值: 3次 └── 不健康阈值: 3次 会话保持: 开启 (Cookie, 超时1800秒)添加后端服务器
服务器 A: ├── IP: 47.xxx.xxx.101 ├── 端口: 8080 └── 权重: 100 服务器 B: ├── IP: 47.xxx.xxx.102 ├── 端口: 8080 └── 权重: 0 (备用,平时不接收流量)修改域名解析
将域名 A 记录指向 SLB 公网 IP www.wangzhanjianshe9.com.cn → SLB IP测试故障切换
# 在服务器 A 停止 Tomcat /opt/tomcat11/bin/shutdown.sh # 观察 SLB 日志 # 应该在 15 秒内自动切换到服务器 B # 访问网站,应该正常 curl https://www.wangzhanjianshe9.com.cn
步骤5: 配置自建 Nginx (备选方案)
如果不用 SLB,可以自建 Nginx 负载均衡
准备 Nginx 服务器 (轻量服务器即可)
yum install -y nginx配置 Nginx
vim /etc/nginx/nginx.confupstream cms_backend { # 服务器 A (主) server 47.xxx.xxx.101:8080 weight=100 max_fails=3 fail_timeout=30s; # 服务器 B (备) server 47.xxx.xxx.102:8080 weight=0 max_fails=3 fail_timeout=30s backup; # 健康检查 (需要 nginx-plus 或第三方模块) # 免费方案: 使用 max_fails 被动检查 } server { listen 80; listen 443 ssl http2; server_name www.wangzhanjianshe9.com.cn; ssl_certificate /etc/nginx/ssl/cert.pem; ssl_certificate_key /etc/nginx/ssl/key.pem; location / { proxy_pass http://cms_backend; 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_set_header X-Forwarded-Proto $scheme; # 超时设置 proxy_connect_timeout 30s; proxy_send_timeout 30s; proxy_read_timeout 30s; } # 健康检查端点 (可选) location /health { access_log off; return 200 "OK"; } }启动 Nginx
nginx -t systemctl start nginx systemctl enable nginx主动健康检查脚本 (弥补 Nginx 被动检查的不足)
vim /opt/nginx_health_check.sh#!/bin/bash # Nginx 主动健康检查 BACKEND_A="http://47.xxx.xxx.101:8080/" BACKEND_B="http://47.xxx.xxx.102:8080/" NGINX_CONF="/etc/nginx/nginx.conf" while true; do # 检查 A 是否正常 if curl -sf -m 5 "$BACKEND_A" > /dev/null; then # A 正常,确保权重为 100 sed -i 's/weight=0 /weight=100 /' $NGINX_CONF sed -i 's/weight=100 backup/weight=0 backup/' $NGINX_CONF nginx -s reload else # A 异常,切换到 B sed -i 's/weight=100 /weight=0 /' $NGINX_CONF sed -i 's/weight=0 backup/weight=100 backup/' $NGINX_CONF nginx -s reload # 发送报警 (可选) echo "服务器 A 故障,已切换到 B" | mail -s "告警" admin@example.com fi sleep 10 donechmod +x /opt/nginx_health_check.sh nohup /opt/nginx_health_check.sh > /var/log/health_check.log 2>&1 &
【四、成本分析】
【方案 A: 阿里云全托管 (推荐)】
【方案 B: 自建混合 (省钱)】
【方案 C: 最小化 (仅双机)】
【五、优缺点对比】
【方案 A: 阿里云全托管】
✅ 优点:
- 自动故障切换 (< 1秒)
- 自动数据库主从同步
- 自动文件同步
- 无需手动维护
- 稳定性最高 (99.95% SLA)
❌ 缺点:
- 成本较高
【方案 B: 自建混合】
✅ 优点:
- 成本适中
- 灵活可控
- 性能足够
❌ 缺点:
- 需要配置和维护
- 数据库主从需要监控
- 文件同步可能延迟
【方案 C: 最小化】
✅ 优点:
- 成本最低
- 实现基本高可用
❌ 缺点:
- Nginx 单点故障风险
- 需要较多手动配置
- 文件同步不稳定
【六、运维管理】
日常监控
# 检查集群状态 curl https://www.wangzhanjianshe9.com.cn # 查看 SLB 日志 (阿里云控制台) # 查看后端服务器健康状态 # 检查数据库同步 mysql -e "SHOW SLAVE STATUS\G" # 检查文件同步 tail -f /var/log/sync.log故障演练
# 模拟服务器 A 故障 ssh 47.xxx.xxx.101 "/opt/tomcat11/bin/shutdown.sh" # 观察切换时间和用户体验 # 应该在 15 秒内完成切换 # 恢复服务器 A ssh 47.xxx.xxx.101 "/opt/tomcat11/bin/startup.sh"告警配置
阿里云监控: ├── CPU > 80% ├── 内存 > 80% ├── 磁盘 > 80% ├── Tomcat 进程消失 └── 健康检查失败 告警方式: ├── 短信 ├── 电话 └── 邮件备份策略
# 数据库自动备份 (RDS 自带) # 每天自动备份,保留 7 天 # 文件手动备份 tar -czf cms_backup_$(date +%Y%m%d).tar.gz \ /opt/tomcat11/webapps/ROOT/ # 上传到 OSS ossutil cp cms_backup_*.tar.gz oss://backup-bucket/
【七、注意事项】
⚠️ 1. Session 共享问题
Cms 后台登录 session 需要共享
解决方案:
- 方案 A: 使用 Redis 共享 session
- 方案 B: SLB 开启会话保持 (推荐)
- 方案 C: 后台单独域名,不负载均衡
⚠️ 2. 缓存同步问题
Cms 内部缓存可能不一致
解决方案:
- 发布内容后,清除两台服务器的缓存
- 或使用集中式缓存 (Redis)
⚠️ 3. 定时任务问题
两台服务器可能重复执行定时任务
解决方案:
- 只在主服务器启用定时任务
- 或使用分布式任务调度
⚠️ 4. IP 白名单问题
如果 Cms 有 IP 限制,需要添加两台服务器 IP
⚠️ 5. 带宽成本
双机会增加数据库同步、文件同步的带宽消耗
建议使用内网同步
⚠️ 6. 安全组配置
确保两台服务器之间网络互通:
- 服务器 A 安全组允许 B 的 IP
- 服务器 B 安全组允许 A 的 IP
- 端口: 3306(MySQL), 8080(Tomcat), 22(SSH)
【八、升级建议】
阶段 1: 基础高可用 (当前)
└── 双机热备 + 手动切换
成本: ¥600/月
阶段 2: 自动切换
└── 双机热备 + Nginx 自动切换
成本: ¥750/月
阶段 3: 数据库托管
└── 双机热备 + 自动切换 + RDS
成本: ¥1,350/月
阶段 4: 全托管 (推荐)
└── 双机热备 + SLB + RDS + NAS
成本: ¥1,585/月
稳定性: ⭐⭐⭐⭐⭐
【九、快速部署检查清单】
□ 1. 服务器准备
□ 购买服务器 B
□ 使用镜像克隆服务器 A
□ 修改 B 的主机名和配置
□ 2. 数据库配置
□ 购买 RDS 或配置主从
□ 迁移数据库
□ 修改连接字符串
□ 3. 文件同步
□ 购买 NAS 或配置 rsync
□ 测试文件同步
□ 4. 负载均衡
□ 购买 SLB 或配置 Nginx
□ 配置健康检查
□ 添加后端服务器
□ 5. DNS 配置
□ 修改域名解析到 SLB
□ 测试访问
□ 6. 测试验证
□ 正常访问测试
□ 故障切换测试
□ 恢复测试
□ 后台登录测试
□ 7. 监控告警
□ 配置阿里云监控
□ 设置告警规则
□ 测试告警通知
【十、技术支持】
阿里云文档:
- SLB: https://help.aliyun.com/product/27537.html
- RDS: https://help.aliyun.com/product/26090.html
- NAS: https://help.aliyun.com/product/27516.html
常见问题:
Q: 切换会影响用户吗?
A: 用户无感知,最多 1-2 个请求失败后自动重试
Q: 服务器 B 平时闲置浪费吗?
A: 可以将 B 用于测试环境,或处理低优先级任务
Q: 成本能再降低吗?
A: 可以购买包年服务器,优惠约 30%
Q: 必须同区域吗?
A: SLB 必须同区域,跨区域延迟大且成本高
【最后更新】2026-04-01
【方案版本】v1.0
【适用场景】Cms 生产环境高可用部署