从零搭建高可用 Web 架构:华为云 ECS + VPC + ELB 实战指南
从零搭建高可用 Web 架构:华为云 ECS + VPC + ELB 实战指南
本文以一个真实场景为线索:你有一个面向公网的 Web 应用,需要做到高可用、可扩展、安全可控。我们将用华为云的 VPC、ECS、ELB 三大核心服务,一步步把这套架构搭起来,并讲清楚每一步为什么这么做。
一、先想清楚架构,再动手
很多人一上来就开 ECS、装 Nginx,跑通了就完事。但真正上生产环境,至少要回答三个问题:
- 单点故障怎么办? —— 一台 ECS 挂了,用户还能不能访问?
- 流量突增怎么办? —— 大促时 QPS 翻 5 倍,一台机器扛得住吗?
- 安全边界在哪里? —— 数据库能不能被公网直接访问?
答案分别对应三个华为云服务:
| 问题 | 解决方案 | 华为云服务 |
|---|---|---|
| 单点故障 | 多台 ECS + 负载均衡分发流量 | ELB(弹性负载均衡) |
| 流量突增 | 弹性伸缩自动增减 ECS 实例 | AS(弹性伸缩) |
| 安全边界 | VPC 隔离 + 安全组精细管控 | VPC(虚拟私有云) |
最终我们要搭的架构长这样:
┌──────────────┐
│ 公网用户 │
└──────┬───────┘
│
┌──────▼───────┐
│ EIP + ELB │ ← 公网入口,负载均衡
└──────┬───────┘
│
┌────────────────┼────────────────┐
│ │ │
┌──────▼──────┐ ┌──────▼──────┐ ┌──────▼──────┐
│ ECS-1 │ │ ECS-2 │ │ ECS-N │ ← 后端服务器组
│ Nginx+App │ │ Nginx+App │ │ Nginx+App │
└──────┬──────┘ └──────┬──────┘ └──────┬──────┘
│ │ │
└────────────────┼────────────────┘
│
┌──────▼───────┐
│ 后端数据库 │ ← 私有子网,不对公网暴露
│ (RDS/自建) │
└──────────────┘
二、第一步:用 VPC 划定网络边界
2.1 为什么不能跳过 VPC?
VPC(虚拟私有云)是你在华为云上的私有网络空间。它逻辑上隔离于其他租户,你可以完全掌控 IP 段、子网、路由表、安全组。
如果不建 VPC,ECS 会默认进入一个共享网络——这在生产环境是不可接受的。就好比你租了办公室,但走廊是公用的,谁都能推门进来。
2.2 创建 VPC 和子网
操作路径:控制台 → 虚拟私有云 VPC → 创建虚拟私有云
关键参数建议:
| 参数 | 建议值 | 说明 |
|---|---|---|
| VPC 网段 | 192.168.0.0/16 |
给自己留 65534 个 IP,够用 |
| 子网1(公网子网) | 192.168.0.0/24 |
放 ELB 和需要 EIP 的 ECS |
| 子网2(私网子网) | 192.168.1.0/24 |
放数据库,不挂 EIP |
为什么分两个子网? 这是一个安全最佳实践:公网子网放需要对外提供服务的资源(ELB、带 EIP 的 ECS),私网子网放数据库等不应被公网直接访问的资源。子网之间通过路由表天然互通,但安全组可以进一步限制。
2.3 配置安全组
安全组是实例级别的虚拟防火墙,每个 ECS 至少关联一个安全组。
建议创建两个安全组:
sg-web(Web 服务器安全组):
| 方向 | 协议 | 端口 | 源地址 | 说明 |
|---|---|---|---|---|
| 入方向 | TCP | 80 | 0.0.0.0/0 |
HTTP 流量 |
| 入方向 | TCP | 443 | 0.0.0.0/0 |
HTTPS 流量 |
| 入方向 | TCP | 22 | 你的办公IP/32 |
SSH 管理,不要开 0.0.0.0/0 |
| 出方向 | 全部 | 全部 | 0.0.0.0/0 |
允许出站 |
sg-db(数据库安全组):
| 方向 | 协议 | 端口 | 源地址 | 说明 |
|---|---|---|---|---|
| 入方向 | TCP | 3306 | sg-web |
只允许 Web 安全组访问 MySQL |
| 出方向 | 全部 | 全部 | 0.0.0.0/0 |
— |
常见错误:把数据库安全组的入方向源地址填成
0.0.0.0/0,等于数据库裸奔在公网上。正确做法是源地址引用sg-web,这样只有 Web 服务器能连数据库,且安全组变更会自动生效。
三、第二步:创建 ECS 后端服务器
3.1 选规格(Flavor)
华为云 ECS 规格命名规则是 代际.规格.CPU内存比,比如 s6.large.2:
s6:第六代通用计算型large:2 vCPU2:CPU:内存 = 1:2,即 4GB 内存
对于中等流量的 Web 应用,建议:
| 场景 | 推荐规格 | vCPU | 内存 | 参考价格(月包年) |
|---|---|---|---|---|
| 测试环境 | s6.small.1 |
1 | 1GB | 约 ¥30+/月 |
| 小型生产 | s6.large.2 |
2 | 4GB | 约 ¥100+/月 |
| 中型生产 | s6.xlarge.2 |
4 | 8GB | 约 ¥200+/月 |
| 计算密集型 | c6.xlarge.2 |
4 | 8GB | 更高主频,适合 API 服务 |
3.2 选镜像
- 公共镜像:华为云官方维护的 CentOS / Ubuntu / EulerOS,开箱即用
- 私有镜像:基于已有 ECS 制作,包含你的预装软件,适合批量创建
- 共享镜像:其他账号共享给你的镜像
实战建议:先用公共镜像创建一台,装好 Nginx + 应用,然后用这台 ECS 制作私有镜像。后续通过弹性伸缩自动扩容时,新实例直接用私有镜像启动,秒级就绪,不用再装一遍软件。
3.3 创建至少两台 ECS
高可用的最低要求是 2 台 ECS 分布在不同可用区(AZ)。
华为云每个区域有多个可用区(如 cn-north-4 有 AZ1~AZ3),可用区之间物理隔离。一台放 AZ1,一台放 AZ2,某个 AZ 故障时另一个不受影响。
创建时注意:
- 网络:选择前面创建的 VPC 和公网子网
- 安全组:选择
sg-web - 弹性公网 IP:后端 ECS 不需要各自挂 EIP,流量统一走 ELB 的 EIP。这样既省钱,又减少攻击面
- 系统盘:建议 40GB+,高 IO 场景选 SSD
- 登录方式:推荐密钥对,比密码安全
四、第三步:用 ELB 统一入口
4.1 ELB 的两个版本
华为云 ELB 有两种:
- 共享型:多个租户共享底层资源,便宜,适合测试/小流量
- 独享型:独享底层资源,性能更高,有固定 IP,适合生产环境
生产环境建议直接上独享型,避免"邻居噪音"问题。
4.2 创建负载均衡器
操作路径:控制台 → 弹性负载均衡 ELB → 创建负载均衡器
关键配置:
| 参数 | 设置 | 说明 |
|---|---|---|
| 类型 | 独享型 | 生产环境 |
| 网络类型 | 公网 | 需要对外访问 |
| VPC | 选你的 VPC | — |
| 子网 | 公网子网 | ELB 要在公网子网才能接外网流量 |
| 弹性公网 IP | 新建 | 这是用户访问的入口 IP |
4.3 配置监听器
监听器定义了 ELB 在哪个端口接流量、用什么协议。
HTTP 监听器(端口 80):
| 参数 | 设置 |
|---|---|
| 前端协议 | HTTP |
| 前端端口 | 80 |
| 后端协议 | HTTP |
| 后端端口 | 80 |
| 负载均衡算法 | 加权轮询 |
| 健康检查 | 开启,检查路径 /health,间隔 5s,阈值 3 |
HTTPS 监听器(端口 443):
| 参数 | 设置 |
|---|---|
| 前端协议 | HTTPS |
| 前端端口 | 443 |
| SSL 证书 | 上传你的域名证书 |
| 后端协议 | HTTP |
| 后端端口 | 80 |
为什么 443 后端用 HTTP 而不是 HTTPS? 这是常见的 SSL 卸载模式:ELB 负责加解密,后端 ECS 只处理 HTTP。这样后端不用配证书,CPU 开销也更低。如果后端到 ELB 这段网络也需要加密(合规要求),再开后端 HTTPS。
4.4 添加后端服务器组
把前面创建的两台 ECS 加入后端服务器组,权重都设为 50(均匀分发)。
健康检查是关键:ELB 会定期请求你配置的检查路径(如 /health),只有返回 200 的实例才会收到流量。这样某台 ECS 上的应用挂了,ELB 会自动把流量切到健康的实例,用户无感知。
五、第四步(进阶):接入弹性伸缩 AS
手动加机器是反模式——你不可能半夜爬起来加 ECS。弹性伸缩(AS)能根据流量自动增减实例。
5.1 创建伸缩配置
伸缩配置定义了"新加的 ECS 长什么样":
- 镜像:用你的私有镜像(已预装 Nginx + 应用)
- 规格:和现有 ECS 一致
- 网络:同一个 VPC + 公网子网
- 安全组:
sg-web
5.2 创建伸缩组
| 参数 | 设置 |
|---|---|
| 伸缩配置 | 上一步创建的 |
| 负载均衡 | 关联你的 ELB 后端服务器组 |
| 期望实例数 | 2(最少保持 2 台) |
| 最小实例数 | 2 |
| 最大实例数 | 10(防止失控烧钱) |
5.3 配置伸缩策略
告警触发策略(推荐):
- CPU 利用率 > 70% 持续 5 分钟 → 加 1 台
- CPU 利用率 < 30% 持续 10 分钟 → 减 1 台
这样流量高峰自动扩容,低谷自动缩容,既扛得住流量,又不浪费钱。
注意:缩容时 AS 会随机选一台实例删除。如果你的实例上有本地缓存或会话数据,缩容会丢失。解决方案:用 Redis 做分布式缓存,让实例无状态化。
六、安全清单:上线前逐条过一遍
| # | 检查项 | 为什么重要 |
|---|---|---|
| 1 | 数据库安全组入方向没有 0.0.0.0/0 |
防止数据库被公网扫描爆破 |
| 2 | SSH 端口 22 只允许你的运维 IP | 防止暴力破解 |
| 3 | ECS 不挂 EIP,流量统一走 ELB | 减少攻击面,便于审计 |
| 4 | HTTPS 监听器已配置有效证书 | 防中间人劫持,浏览器不报红 |
| 5 | ELB 健康检查已开启且路径有效 | 故障实例自动摘除 |
| 6 | 伸缩组最大实例数有上限 | 防止 bug 导致无限扩容烧钱 |
| 7 | 关键操作开启了操作日志(CTS) | 出事能追溯 |
| 8 | 数据库有定期备份策略 | 灾难恢复的最后一道防线 |
七、成本估算参考
以 cn-north-4(北京四)为例,一套最小高可用架构的月成本:
| 资源 | 规格 | 数量 | 月费(估) |
|---|---|---|---|
| ECS | s6.large.2 | 2 | ~¥200 |
| ELB | 独享型小型 | 1 | ~¥200 |
| EIP | 5Mbps | 1 | ~¥25 |
| EVS 系统盘 | 40GB 通用型 SSD | 2 | ~¥40 |
| VPC/子网/安全组 | — | — | 免费 |
| 合计 | ~¥465/月 |
这是粗略估算,实际价格以控制台询价为准。包年会有明显折扣。
八、总结
回顾一下我们做了什么:
- VPC 划定了网络边界,公网子网和私网子网分离
- 安全组 精确控制了谁能访问谁,数据库不裸奔
- 两台 ECS 跨可用区部署,消除单点故障
- ELB 统一公网入口,健康检查自动摘除故障实例
- AS 按需自动扩缩容,扛得住流量波动
这套架构不是最复杂的,但覆盖了高可用最核心的三个维度:冗余、分发、弹性。对于大多数中小型 Web 应用,这个配置已经足够上生产了。
后续如果需要进一步演进,可以考虑:
- 数据库层:从自建 MySQL 迁移到 RDS,获得自动备份、主备切换、读写分离
- 缓存层:加入 DCS Redis,减轻数据库压力
- CDN:静态资源走 CDN 加速,回源到 OBS 桶
- 容器化:应用打包成镜像,用 CCE(云容器引擎)替代 ECS + AS,获得更细粒度的弹性
每一步演进都解决一个具体的瓶颈,不要一上来就全用上——过度架构和不架构一样危险。
本文基于华为云 2024 年控制台界面编写,产品功能可能随版本更新有变化,请以实际控制台为准。如有疑问,欢迎留言讨论。
- 点赞
- 收藏
- 关注作者
评论(0)