020-29876379

网站建设行业

网站建设好后,部署在云服务器上,网站的稳定运行直接关第到网站在搜索引挚排名中的表现,如果服务器中途崩溃,流量会被搜索引挚处罚,最严重的结果就是网站流量给清零,这可不是站长们想要的结果,下面就详细说明通过Nginx 负载均衡 + 双机热备方案实现网站稳定运行:      

方案架构图

         互联网用户
              ↓
    ┌─────────────────────┐
    │   阿里云 SLB/Nginx   │  (健康检查 + 负载均衡)
    │   47.xxx.xxx.100     │
    └─────────────────────┘
              ↓
         (自动分发)
              ↓
    ┌──────────┴──────────┐
    ↓                     ↓
┌─────────┐          ┌─────────┐
│服务器 A  │          │服务器 B  │
│(主节点) │          │(备节点) │
│47.x.x.1 │          │47.x.x.2 │
└─────────┘          └─────────┘
    ↓                     ↓
    └──────────┬──────────┘
              ↓
    ┌─────────────────────┐
    │  阿里云 RDS 数据库    │  (主从同步)
    │  MySQL 主备实例      │
    └─────────────────────┘
              ↓
    ┌─────────────────────┐
    │  阿里云 NAS/OSS      │  (共享文件存储)
    │  文件同步            │
    └─────────────────────┘

【一、核心组件】

1. 负载均衡层
   ├── 阿里云 SLB (推荐)
   │   ├── 公网 IP + 固定带宽
   │   ├── 健康检查: 每 5 秒检测一次
   │   ├── 失败阈值: 连续 3 次失败则剔除
   │   └── 恢复检测: 连续 3 次成功则恢复
   │
   └── 自建 Nginx (备选)
       ├── 独立服务器/轻量服务器
       └── nginx upstream 健康检查模块

2. 应用服务器层 (双节点)
   ├── 服务器 A (主) - 阿里云 ECS
   │   ├── CPU: 4核
   │   ├── 内存: 8GB
   │   ├── 系统盘: 40GB
   │   ├── 数据盘: 100GB
   │   └── Tomcat 9 + Cms 
   │
   └── 服务器 B (备) - 阿里云 ECS (相同配置)
       └── 实时同步状态

3. 数据库层
   ├── 阿里云 RDS MySQL (主备版)
   │   ├── 自动主从同步
   │   ├── 自动故障切换
   │   └── 数据一致性保证
   │
   └── 或自建数据库主从复制
       ├── 服务器 A: MySQL 主库
       └── 服务器 B: MySQL 从库

4. 文件存储层
   ├── 阿里云 NAS (推荐)
   │   ├── 双节点同时挂载
   │   ├── 自动同步
   │   └── 高可用保证
   │
   └── 或自建文件同步
       ├── rsync + inotify 实时同步
       └── /opt/tomcat11/webapps/ROOT/


【二、工作原理】

1. 正常状态
   ┌────────────┐
   │ SLB 接收请求                      │
   │   ↓                              │
   │ 健康检查 A: ✓ 正常                │
   │ 健康检查 B: ✓ 正常                │
   │   ↓                              │
   │ 按权重分发 (A: 100%, B: 0%)      │
   │   ↓                              │
   │ 所有流量 → 服务器 A               │
   └─────────────┘

2. A 故障切换
   ┌────────────┐
   │ 服务器 A 崩溃                     │
   │   ↓                              │
   │ SLB 健康检查失败 (15秒内)        │
   │   ↓                              │
   │ 自动剔除 A                        │
   │   ↓                              │
   │ 所有流量 → 服务器 B               │
   │   ↓                              │
   │ 用户无感知 (切换时间 < 1秒)       │
   └──────────────┘

3. 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 快速部署方法:
1. 购买与 A 相同配置的 ECS
2. 使用 A 的系统盘创建镜像
3. 用镜像创建 B (最快,配置完全一致)
4. 修改 B 的配置文件 (IP、hostname)


步骤2: 配置数据库 (选择其一)

【方案 A: 阿里云 RDS (推荐)】

1. 购买 RDS MySQL 主备版
   - 规格: 2核4GB 起步
   - 存储: 100GB
   - 自动主从同步、自动故障切换

2. 迁移数据库
   ```bash
   # 在服务器 A 导出
   mysqldump -h127.0.0.1 -ucms -p cms > cms.sql
   
   # 导入到 RDS
   mysql -hRDS地址 -ucms -p cms < cms.sql
   ```

3. 修改两台服务器配置
   ```bash
   # 服务器 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: 自建数据库主从】

1. 服务器 A 配置为主库
   ```bash
   vim /etc/my.cnf
   [mysqld]
   server-id=1
   log-bin=mysql-bin
   binlog-do-db=cms
   ```

2. 服务器 B 配置为从库
   ```bash
   vim /etc/my.cnf
   [mysqld]
   server-id=2
   relay-log=mysql-relay-bin
   read_only=1
   ```

3. 配置主从复制
   ```sql
   -- 在主库 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 (推荐)】

1. 购买 NAS 文件系统
   - 类型: 通用型 NAS
   - 协议: NFS
   
2. 在两台服务器挂载
   ```bash
   # 安装 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
   ```

3. 迁移 Cms 文件
   ```bash
   # 停止 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 实时同步】

1. 在服务器 B 安装 rsync
   ```bash
   yum install -y rsync inotify-tools
   ```

2. 创建同步脚本 (在服务器 A)
   ```bash
   vim /opt/sync.sh
   ```
   
   ```bash
   #!/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
   ```

3. 配置 SSH 免密登录
   ```bash
   ssh-keygen -t rsa
   ssh-copy-id root@47.xxx.xxx.102
   ```

4. 启动同步服务
   ```bash
   chmod +x /opt/sync.sh
   nohup /opt/sync.sh > /var/log/sync.log 2>&1 &
   ```


步骤4: 配置阿里云 SLB (推荐方案)

1. 创建 SLB 实例
   ```
   - 进入阿里云控制台
   - 产品: 传统型负载均衡 CLB
   - 网络类型: 公网
   - 规格: 性能保障型 (slb.s2.small)
   - 价格: ¥200-300/月
   ```

2. 添加监听器
   ```
   监听协议: HTTPS/443
   └── SSL 证书: 选择已有证书
   └── 后端协议: HTTP/8080
   
   健康检查:
   ├── 检查方法: HEAD
   ├── 检查路径: /
   ├── 检查间隔: 5秒
   ├── 响应超时: 3秒
   ├── 健康阈值: 3次
   └── 不健康阈值: 3次
   
   会话保持: 开启 (Cookie, 超时1800秒)
   ```

3. 添加后端服务器
   ```
   服务器 A:
   ├── IP: 47.xxx.xxx.101
   ├── 端口: 8080
   └── 权重: 100
   
   服务器 B:
   ├── IP: 47.xxx.xxx.102
   ├── 端口: 8080
   └── 权重: 0 (备用,平时不接收流量)
   ```

4. 修改域名解析
   ```
   将域名 A 记录指向 SLB 公网 IP
   www.wangzhanjianshe9.com.cn → SLB IP
   ```

5. 测试故障切换
   ```bash
   # 在服务器 A 停止 Tomcat
   /opt/tomcat11/bin/shutdown.sh
   
   # 观察 SLB 日志
   # 应该在 15 秒内自动切换到服务器 B
   
   # 访问网站,应该正常
   curl https://www.wangzhanjianshe9.com.cn
   ```


步骤5: 配置自建 Nginx (备选方案)

如果不用 SLB,可以自建 Nginx 负载均衡

1. 准备 Nginx 服务器 (轻量服务器即可)
   ```bash
   yum install -y nginx
   ```

2. 配置 Nginx
   ```bash
   vim /etc/nginx/nginx.conf
   ```
   
   ```nginx
   upstream 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";
       }
   }
   ```

3. 启动 Nginx
   ```bash
   nginx -t
   systemctl start nginx
   systemctl enable nginx
   ```

4. 主动健康检查脚本 (弥补 Nginx 被动检查的不足)
   ```bash
   vim /opt/nginx_health_check.sh
   ```
   
   ```bash
   #!/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
   done
   ```
   
   ```bash
   chmod +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 单点故障风险
   - 需要较多手动配置
   - 文件同步不稳定


【六、运维管理】

1. 日常监控
   ```bash
   # 检查集群状态
   curl https://www.wangzhanjianshe9.com.cn
   
   # 查看 SLB 日志 (阿里云控制台)
   # 查看后端服务器健康状态
   
   # 检查数据库同步
   mysql -e "SHOW SLAVE STATUS\G"
   
   # 检查文件同步
   tail -f /var/log/sync.log
   ```

2. 故障演练
   ```bash
   # 模拟服务器 A 故障
   ssh 47.xxx.xxx.101 "/opt/tomcat11/bin/shutdown.sh"
   
   # 观察切换时间和用户体验
   # 应该在 15 秒内完成切换
   
   # 恢复服务器 A
   ssh 47.xxx.xxx.101 "/opt/tomcat11/bin/startup.sh"
   ```

3. 告警配置
   ```
   阿里云监控:
   ├── CPU > 80%
   ├── 内存 > 80%
   ├── 磁盘 > 80%
   ├── Tomcat 进程消失
   └── 健康检查失败
   
   告警方式:
   ├── 短信
   ├── 电话
   └── 邮件
   ```

4. 备份策略
   ```bash
   # 数据库自动备份 (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 生产环境高可用部署