跳到主要内容

阿里云OSS-CDN-SLB实战

1. 架构

前端项目在阿里云的典型架构:

用户

[域名] → [CDN] → [OSS(静态)] / [SLB → ECS(API)]
  • OSS:对象存储,存静态文件
  • CDN:边缘加速 + 缓存
  • SLB:负载均衡到后端 ECS

2. OSS 静态托管

2.1 创建 Bucket + 开启静态网站

# 安装 ossutil
brew install ossutil # 或下载二进制

# 配置
ossutil config

# 建 bucket
ossutil mb oss://my-frontend --acl public-read --storage-class Standard

# 开静态网站
ossutil website --method put oss://my-frontend index.html --error-document index.html

控制台 → Bucket → 基础设置 → 静态页面:

  • 默认首页:index.html
  • 默认 404:index.html(SPA fallback)

2.2 上传

# 同步整个 dist
ossutil sync ./dist oss://my-frontend/ --delete # --delete 删除 oss 上多余文件

# 上传时设缓存头
ossutil cp -r ./dist oss://my-frontend/ \
--include "*.js" --include "*.css" \
--meta "Cache-Control:public, max-age=31536000, immutable"

ossutil cp ./dist/index.html oss://my-frontend/index.html \
--meta "Cache-Control:no-cache"

2.3 CORS 配置

<!-- bucket 控制台 -->
<CORSRule>
<AllowedOrigin>https://app.example.com</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<AllowedMethod>HEAD</AllowedMethod>
<AllowedHeader>*</AllowedHeader>
<ExposeHeader>ETag</ExposeHeader>
<MaxAgeSeconds>3600</MaxAgeSeconds>
</CORSRule>

2.4 直传 STS

前端直传文件到 OSS,避免文件经服务器:

// 前端
import OSS from 'ali-oss'

const res = await fetch('/api/oss/sts') // 后端签发 STS
const { credentials } = await res.json()

const client = new OSS({
region: 'oss-cn-hangzhou',
accessKeyId: credentials.AccessKeyId,
accessKeySecret: credentials.AccessKeySecret,
stsToken: credentials.SecurityToken,
bucket: 'my-frontend'
})

await client.put('uploads/file.png', file)

后端用 RAM 角色签 STS 临时凭证(短时效)。

3. CDN 配置

3.1 加速域名

控制台 → CDN → 域名管理 → 添加域名:

  • 加速域名:cdn.example.com
  • 业务类型:图片小文件 / 大文件 / 视音频
  • 源站:OSS(自动出现 bucket 列表)/ IP / 域名
  • 加速区域:中国内地 / 全球

3.2 CNAME

CDN 给一个 cdn.example.com.w.kunlunsl.com 之类,去 DNS 加 CNAME:

cdn.example.com. CNAME cdn.example.com.w.kunlunsl.com. TTL 600

3.3 关键配置

配置推荐值
HTTPS必开。证书选阿里云签发或自上传
HTTP/2
强制跳转HTTP → HTTPS
缓存规则hash 文件 1 年 immutable,HTML no-cache
回源 Host改写为 OSS bucket 域
Range 回源大文件开
Brotli开(比 gzip 小 20%)
智能压缩
HSTSpreload 准备好后开
Referer 防盗链按需

3.4 缓存配置

路径: /*.js /*.css /*.woff2 → 缓存时间: 1 年
路径: /index.html → 缓存时间: 0 秒
路径: / → 缓存时间: 0 秒

或在 OSS 上传时 meta 写 Cache-Control,CDN 跟随源站。

3.5 刷新与预热

# 刷新(清缓存)
aliyun cdn RefreshObjectCaches \
--ObjectPath "https://cdn.example.com/index.html" \
--ObjectType File

# 目录刷新(慢,配额少)
aliyun cdn RefreshObjectCaches \
--ObjectPath "https://cdn.example.com/" \
--ObjectType Directory

# 预热(推到节点)
aliyun cdn PushObjectCache \
--ObjectPath "https://cdn.example.com/app.abc.js"

CI 部署后调 API 自动刷新 + 预热。

4. SLB(负载均衡)

ECS 后端做高可用必装。

4.1 创建 ALB / NLB

类型适合
ALB(应用层 LB)HTTP/HTTPS、按 path 路由
NLB(网络层 LB)TCP/UDP、四层、性能高
CLB(经典)老产品

ALB 推荐,对前端友好(HTTP/2、WAF 集成、cert 管理)。

4.2 配置流程

  1. 建 VPC + 交换机
  2. 建 ALB 实例(公网/私网)
  3. 建后端服务器组(添加 ECS)
  4. 配监听器(443 → 后端 8080)
  5. 上传/绑定证书
  6. 域名 CNAME 到 ALB

4.3 健康检查

协议: HTTPS
路径: /health
端口: 8080
间隔: 5s
超时: 3s
健康阈值: 2
不健康阈值: 3

后端必须实现 /health 端点。

5. 域名与备案

国内服务器必须备案域名。流程:

  • 主体备案(公司/个人)→ 网站备案 → 通信管局审核
  • 周期 3-20 工作日
  • 备案后才能解析到国内服务器

未备案:

  • 用境外 / 香港节点(CDN 可选不在中国大陆加速)
  • 阿里云轻量香港 / 腾讯香港 ECS

6. 成本估算(小型站点)

月费用估算
OSS 存储10GB ≈ 1.2 元
OSS 流出流量100GB ≈ 50 元(走 CDN 不计)
CDN 流量100GB ≈ 24 元
ECS(2C4G)200-400 元
ALB200 元起步
域名 + SSL免费 + 60 元/年

7. 常见反模式

  • OSS 不开 CDN 直接对外:流量贵 + 慢
  • 未备案用国内节点:阿里云强制下线
  • CDN 不配 HTTPS:明文流量
  • CDN 缓存策略不分 HTML/JS:发版用户拿不到新版
  • ALB 不配健康检查:挂掉的 ECS 还接流量
  • OSS bucket 公开写:被恶意上传当图床
  • STS 凭证太长有效期:泄露后影响大。生产 15 分钟以下
  • 不监控流量异常:被刷流量到月底账单爆炸

8. 延伸阅读