CloudFront 标准模式与 Multi-tenant 模式详解
一、背景
在使用 Amazon CloudFront 做 CDN 加速时,通常有两种模式:
- 标准模式(Standard CloudFront)
- 多租户模式(Multi-tenant CloudFront)
本文基于实际操作,从:
- CDN 原理
- 标准 CloudFront 使用
- Multi-tenant 实战
- 缓存机制
- SaaS 架构设计
进行完整讲解。
二、核心区别
| 模式 | 描述 |
|---|---|
| 标准 CloudFront | 一个 Distribution 对应一个业务 |
| Multi-tenant | 一个 Distribution 支持多个业务(tenant) |
👉 本质:
- 标准:资源隔离
- 多租户:资源复用 + 逻辑隔离
三、标准 CloudFront 实战
3.1 原始状态(无 CDN)
首先搭建一个 Web 服务,并创建一个站点:
https://ceshi1827.xingfu.com/
此时:
- 域名直接解析到服务器 IP
- 请求直接访问源站(EC2)
📌 页面如下:
3.2 修改源站资源
替换网站中的图片资源(例如交换两张图片名称)
📌 文件变化:
image1.png ↔ image2.png
3.3 刷新页面结果
关闭浏览器重新访问:
👉 页面已经更新(因为没有缓存)
📌 页面效果:
四、引入标准 CloudFront
4.1 架构变化
客户端 → CloudFront → 源站(EC2)
域名解析变为:
ceshi1827.xingfu.com → dxxxxx.cloudfront.net
4.2 CDN 工作机制
CloudFront 会缓存:
- HTML
- JS / CSS
- 图片等静态资源
4.3 再次修改源站
再次替换图片资源。
4.4 页面访问结果
刷新页面后:
❌ 页面没有变化
📌 页面效果:
4.5 原因分析
因为:
CloudFront 缓存了旧资源
4.6 解决方法:缓存失效
进入 Distribution:
👉 Invalidation → Create Invalidation
本质:
删除 CDN 缓存 → 强制回源
五、Multi-tenant CloudFront 实战
5.1 架构
一个 Distribution
↓
多个 tenant
↓
多个域名
示例:
alextest
├── cloudfront1 → ceshi1827.filmtest.cc
└── cloudfront2 → ceshi2873.filmtest.cc
5.2 关键区别
- 所有 tenant 共用一个 Distribution
- 每个 tenant 绑定自己的域名
- 请求通过域名路由到 tenant
5.3 Endpoint 说明
Multi-tenant 下:
- 所有 tenant 共用一个 Endpoint
- 类似标准 CloudFront 的
dxxxxx.cloudfront.net
5.4 初始状态
创建:
- cloudfront1
- cloudfront2
此时两个 tenant 页面一致。
📌 页面:
5.5 修改源站资源
替换图片资源。
5.6 页面访问结果
刷新:
❌ 页面仍为旧内容
原因:
CDN 缓存未更新
5.7 只刷新 cloudfront2
使用 AWS CLI:
aws cloudfront create-invalidation-for-distribution-tenant \
--id "dt_xxx" \
--invalidation-batch '{
"Paths": {
"Quantity": 1,
"Items": ["/*"]
},
"CallerReference": "'$(date +%s)'"
}' \
--profile cloudfront1
5.8 刷新结果
| tenant | 页面 |
|---|---|
| cloudfront1 | ❌ 旧 |
| cloudfront2 | ✅ 新 |
📌 页面:
六、缓存机制详解(重要修正)
CloudFront 缓存基于:
Cache Key = Host + Path + Query + Header
6.1 Multi-tenant 缓存逻辑
不同 tenant:
ceshi1827.filmtest.cc ≠ ceshi2873.filmtest.cc
👉 Host 不同 → Cache Key 不同
👉 缓存天然隔离
6.2 正确认识缓存
| 说法 | 正确性 |
|---|---|
| tenant 缓存完全共享 | ❌ |
| tenant 缓存完全独立 | ❌ |
| 按 Host 隔离 | ✅ |
七、实现真正多租户(核心)
7.1 原理
CloudFront 转发:
Host: a.example.com
7.2 Nginx 配置
server {
server_name a.example.com;
root /var/www/a;
}
server {
server_name b.example.com;
root /var/www/b;
}
7.3 目录结构
/var/www/a
/var/www/b
7.4 效果
不同域名返回不同内容。
八、SaaS 架构设计(进阶)
推荐架构:
CloudFront(Multi-tenant)
↓
ALB
↓
EC2集群
↓
Nginx / 应用
九、CLI 操作总结
获取 tenant ID
aws cloudfront get-distribution-tenant \
--identifier cloudfront1 \
--query 'DistributionTenant.Id' \
--output text \
--profile cloudfront1
刷新缓存
aws cloudfront create-invalidation-for-distribution-tenant \
--id <tenant-id> \
--invalidation-batch '{
"Paths": {
"Quantity": 1,
"Items": ["/*"]
},
"CallerReference": "'$(date +%s)'"
}'
十、总结
- Distribution = CDN 实例
- Tenant = 子业务
- Multi-tenant = 多业务共享 CDN
- 缓存按 Host 隔离
- 支持 SaaS 架构
十一、适用场景
- SaaS 平台
- 多客户系统
- 白标网站
- 多品牌平台
以上内容最后是用AI优化过的 (完)