网站搭建好后采用高可用集群方案(Nginx 负载均衡 + 双机热备)实现网站稳定运行

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

网站建设好后,部署在云服务器上,网站的稳定运行直接关第到网站在搜索引挚排名中的表现,如果服务器中途崩溃,流量会被搜索引挚处罚,最严重的结果就是网站流量给清零,这可不是站长们想要的结果,下面就详细说明通过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. 迁移数据库

    # 在服务器 A 导出
    mysqldump -h127.0.0.1 -ucms -p cms > cms.sql
    
    # 导入到 RDS
    mysql -hRDS地址 -ucms -p cms < cms.sql
    
  3. 修改两台服务器配置

    # 服务器 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 配置为主库

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

    vim /etc/my.cnf
    [mysqld]
    server-id=2
    relay-log=mysql-relay-bin
    read_only=1
    
  3. 配置主从复制

    -- 在主库 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. 在两台服务器挂载

    # 安装 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 文件

    # 停止 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

    yum install -y rsync inotify-tools
    
  2. 创建同步脚本 (在服务器 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
    
  3. 配置 SSH 免密登录

    ssh-keygen -t rsa
    ssh-copy-id root@47.xxx.xxx.102
    
  4. 启动同步服务

    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. 测试故障切换

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

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

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

  1. 准备 Nginx 服务器 (轻量服务器即可)

    yum install -y nginx
    
  2. 配置 Nginx

    vim /etc/nginx/nginx.conf
    
    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

    nginx -t
    systemctl start nginx
    systemctl enable nginx
    
  4. 主动健康检查脚本 (弥补 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
    done
    
    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. 日常监控

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

    # 模拟服务器 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. 备份策略

    # 数据库自动备份 (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. 监控告警
□ 配置阿里云监控
□ 设置告警规则
□ 测试告警通知

【十、技术支持】

阿里云文档:

常见问题:
Q: 切换会影响用户吗?
A: 用户无感知,最多 1-2 个请求失败后自动重试

Q: 服务器 B 平时闲置浪费吗?
A: 可以将 B 用于测试环境,或处理低优先级任务

Q: 成本能再降低吗?
A: 可以购买包年服务器,优惠约 30%

Q: 必须同区域吗?
A: SLB 必须同区域,跨区域延迟大且成本高

【最后更新】2026-04-01
【方案版本】v1.0
【适用场景】Cms 生产环境高可用部署

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
相关文章
|
人工智能 JavaScript Java
【SpringAIAlibaba新手村系列】(1)初识 Spring AI Alibaba 框架
本文介绍了SpringAIAlibaba框架的基本概念和使用方法。作为Spring官方AI框架的阿里云实现版本,它简化了Java开发者调用AI模型的过程。文章详细讲解了核心概念如ChatModel、ChatClient,以及阿里云百炼平台的功能。通过HelloWorld项目示例,展示了如何配置APIKey、编写控制层代码,实现普通调用和流式输出两种AI交互方式。重点阐述了SpringAI与SpringAIAlibaba的关系,以及自动配置机制的工作原理,帮助开发者快速上手这一框架。
1452 4
|
16天前
|
人工智能 JavaScript Java
【SpringAIAlibaba新手村系列】(10)Text to Voice 文本转语音技术
本文围绕 Spring AI Alibaba 1.1.2.2 的文本转语音实现展开,记录了基于 DashScopeAudioSpeechModel 与 stream() 的可运行方案。文章重点说明了模型、音色、输出格式与流式拼接音频文件的关键细节。
183 6
|
12天前
|
Kubernetes 网络协议 文件存储
Docker镜像拉了一下午还没完?我受够了,花了一周找替代方案
上周拉镜像卡在47%两小时?试遍阿里云、高校源、GitHub清单全失效。直到发现「毫秒镜像」——宝塔、爱快、绿联NAS已原生集成,金融级客户背书。一行命令安装,3秒拉完nginx,全仓库加速(Docker Hub/gcr/ghcr/k8s等),含DNS自诊。免费版够用,稳定不跑路。
416 19
|
16天前
|
人工智能 安全 IDE
2026 年 AI 编码的“渐进式 Spec”实战指南
这次分享的内容来自作者在实际项目中落地 AI 编码的一些实践和思考。希望能给正在尝试或想要尝试 AI 编码的同学一些参考。
|
10天前
|
人工智能 API 开发者
阿里云百炼Coding Plan售罄,抢不到怎么办?附抢购攻略及备选方案
阿里云百炼Coding Plan Pro版因Lite停售而一票难求,每日9:30限量抢购,几分钟即罄。本文提供实操抢购技巧,并推荐百炼平台作为高性价比备选:支持同款大模型、新用户赠100万Tokens、按量付费,开通即用。
582 9
|
11天前
|
Linux API 数据安全/隐私保护
阿里云无影云电脑、本地部署OpenClaw图文攻略:WhatsApp集成+千问Qwen3.6-Plus配置与避坑指南
本文完整覆盖2026年**阿里云无影云电脑部署OpenClaw、本地MacOS/Linux/Windows11全平台搭建、千问Qwen3.6-Plus API高性能配置、WhatsApp全球IM集成**四大核心流程,搭配全场景高频问题排查方案,所有命令均为实测可直接复制,无需复杂操作即可完成部署。
197 14
|
16天前
|
人工智能 数据可视化 安全
王炸组合!阿里云 OpenClaw X 飞书 CLI,开启 Agent 基建狂潮!(附带免费使用6个月服务器)
本文详解如何用阿里云Lighthouse一键部署OpenClaw,结合飞书CLI等工具,让AI真正“动手”——自动群发、生成科研日报、整理知识库。核心理念:未来软件应为AI而生,CLI即AI的“手脚”,实现高效、安全、可控的智能自动化。
34816 43
王炸组合!阿里云 OpenClaw X 飞书 CLI,开启 Agent 基建狂潮!(附带免费使用6个月服务器)
|
26天前
|
Kubernetes 安全 应用服务中间件
Kubernetes 官方再出公告,强调立即迁移 Ingress NGINX
北京时间 1 月 30 日,Kubernetes 指导委员会和安全响应委员会在 kubernetes.io 再次发出公告《Ingress NGINX: Statement from the Kubernetes Steering and Security Response Committees》,并通过 CNCF 官方微信公众号发布中文版公告。
146 22

热门文章

最新文章

下一篇
开通oss服务