06 - 云服务与CDN¶
本章核心: 掌握云服务基础,熟练使用OSS和CDN加速静态资源访问
📖 章节导航¶
前序章节: 01-网络基础.md → 02-域名与DNS.md 后续章节: 07-Docker网络.md → 08-实战应用场景.md 快速参考: 网络工具箱.md 第1章 故障排查: 故障排查手册.md 第2章
📚 目录¶
1. 引言¶
🤔 为什么需要云服务和CDN?¶
想象一下,你开发了一个网站或应用,用户越来越多,问题也随之而来:
问题1:性能瓶颈
问题2:可靠性风险
传统服务器:
┌─────────────────┐
│ 单台服务器 │ ← 如果这台服务器坏了,整个网站就挂了
│ └─ 硬盘坏了 │
│ └─ 网络断了 │
│ └─ 停电了 │
└─────────────────┘
问题3:成本高昂
✨ 云服务和CDN的解决方案¶
云服务 + CDN:
用户(广东) → CDN节点(广州) → 直接返回内容 ✓
(缓存了内容)
用户(上海) → CDN节点(上海) → 直接返回内容 ✓
(缓存了内容)
用户(北京) → CDN节点(北京) → 没有缓存 → 云服务器 → 返回内容
↓
缓存到节点
核心优势: - 🚀 性能提升:用户访问就近节点,延迟降低 - 🛡️ 高可靠性:云服务自动容灾,CDN多节点冗余 - 💰 成本优化:按需付费,无需前期投入 - 📈 弹性扩展:用户多了自动扩容,少了自动缩容
2. 云服务基础¶
📖 什么是云计算?¶
简单理解:云计算就是把计算资源(服务器、存储、数据库等)放到云端,像水电一样按需使用。
☁️ 云计算的三种服务类型¶
1️⃣ IaaS(基础设施即服务)¶
定义:提供基础的计算、存储、网络资源
IaaS 提供什么?
┌─────────────────────────────────┐
│ 虚拟机(ECS) │
│ 存储(OSS、EBS) │
│ 网络(VPC、负载均衡) │
│ 数据库(RDS) │
└─────────────────────────────────┘
↓
你需要自己:
- 安装操作系统
- 安装软件环境
- 开发应用程序
例子:阿里云ECS、腾讯云CVM
2️⃣ PaaS(平台即服务)¶
定义:提供开发平台和运行环境
PaaS 提供什么?
┌─────────────────────────────────┐
│ 应用运行环境 │
│ 数据库服务 │
│ 缓存服务 │
│ 消息队列 │
└─────────────────────────────────┘
↓
你只需要:
- 上传代码
- 配置参数
例子:阿里云函数计算、腾讯云SCF
3️⃣ SaaS(软件即服务)¶
定义:提供完整的软件应用
SaaS 提供什么?
┌─────────────────────────────────┐
│ 完整的软件应用 │
│ 直接使用,无需开发 │
└─────────────────────────────────┘
↓
你只需要:
- 注册账号
- 使用软件
例子:阿里云邮箱、腾讯文档
对比总结:
| 类型 | 你需要管理 | 云服务商管理 | 自由度 | 使用难度 |
|---|---|---|---|---|
| IaaS | 操作系统、应用、数据 | 硬件、虚拟化 | 高 | 中 |
| PaaS | 应用、数据 | 操作系统、运行环境 | 中 | 低 |
| SaaS | 无 | 所有 | 低 | 最低 |
🏢 国内主流云服务商对比¶
阿里云¶
优势: - 🥇 市场份额第一,生态最完善 - 🌐 全球节点最多(200+) - 📦 产品线最丰富 - 🛠️ 文档和社区支持最好
核心产品: - ECS(云服务器) - OSS(对象存储) - RDS(云数据库) - CDN(内容分发网络)
适合场景: - 大型企业 - 电商网站 - 全球业务
腾讯云¶
优势: - 🎮 游戏行业经验丰富 - 💬 社交生态整合(微信、QQ) - 📱 移动端服务优秀 - 💰 价格相对便宜
核心产品: - CVM(云服务器) - COS(对象存储) - MySQL/TDSQL(云数据库)
适合场景: - 游戏开发 - 社交应用 - 中小企业
华为云¶
优势: - 🔒 安全性高(政企首选) - 🏭 企业级服务强 - 🌐 国际化程度高 - 🤖 AI服务丰富
核心产品: - ECS(弹性云服务器) - OBS(对象存储服务) - GaussDB(云数据库)
适合场景: - 政府机构 - 大型企业 - 对安全要求高的场景
百度云¶
优势: - 🔍 AI能力强 - 📊 大数据分析优秀 - 🚀 智能云服务 - 💡 技术创新快
核心产品: - BCC(云服务器) - BOS(对象存储) - 云数据库
适合场景: - AI应用 - 大数据分析 - 智能化项目
💡 云服务的核心优势¶
1️⃣ 弹性伸缩¶
传统服务器:
固定配置 → 用户多了不够用 → 需要购买新服务器 → 耗时几天
云服务:
自动伸缩 → 用户多了自动扩容 → 几分钟完成
→ 用户少了自动缩容 → 节省成本
时间轴:
00:00 10:00 20:00 30:00 40:00
↓ ↓ ↓ ↓ ↓
1台 5台 10台 5台 1台
(自动根据流量调整)
2️⃣ 高可靠性¶
云服务的容灾机制:
主数据中心 ────────┐
│ → 用户访问
│
备数据中心 ────────┘(主数据中心故障时自动切换)
数据多副本:
原始数据 → 复制1 → 复制2 → 复制3
(一个坏了,其他还能用)
3️⃣ 成本优化¶
传统服务器成本:
购买服务器:50000元(一次性)
机房租金:5000元/月
维护成本:3000元/月
扩容成本:每次需要购买新服务器
云服务成本:
按需付费:0.1元/小时
流量费用:0.5元/GB
存储费用:0.12元/GB/月
弹性计费:用多少付多少
对比:
传统模式:前期投入大,资源浪费
云服务模式:前期零投入,按需付费
3. 对象存储(OSS)详解¶
📦 什么是OSS?¶
OSS(Object Storage Service):对象存储服务
简单理解:就像一个超级大的网盘,可以存储任何类型的文件(图片、视频、文档等),并且可以通过API访问。
传统文件系统 vs OSS:
传统文件系统:
C:/Users/username/photos/
├── image1.jpg
├── image2.jpg
└── folder/
└── image3.jpg
特点:
- 有层级结构(文件夹)
- 需要挂载到操作系统
- 适合本地文件管理
OSS:
bucket-name/
├── photos/image1.jpg
├── photos/image2.jpg
└── videos/video1.mp4
特点:
- 扁平结构(key-value形式)
- 通过HTTP访问
- 适合云端存储和分发
🔑 OSS的核心概念¶
1️⃣ Bucket(存储空间)¶
定义:存储对象的容器,类似于文件夹
Bucket的特点:
┌─────────────────────────────────┐
│ Bucket名称(全局唯一) │
│ ├─ 存储区域(北京、上海等) │
│ ├─ 访问权限(公共读、私有) │
│ └─ 存储类型(标准、低频、归档) │
└─────────────────────────────────┘
↓
存储对象(文件)
命名规则: - 只能包含小写字母、数字、短横线(-) - 长度:3-63个字符 - 必须全局唯一(整个阿里云内不能重复) - 不能以短横线开头或结尾
示例:
✅ 正确的Bucket名称:
- my-bucket-123
- myapp-storage
- test-bucket
❌ 错误的Bucket名称:
- MyBucket(包含大写字母)
- my_bucket(包含下划线)
- -bucket(以短横线开头)
- bucket-(以短横线结尾)
2️⃣ Object(对象)¶
定义:OSS中存储的基本单元,就是文件
Object的结构:
┌─────────────────────────────────┐
│ Key(对象键) │
│ ├─ 类似于文件路径 │
│ └─ 示例:photos/image.jpg │
├─────────────────────────────────┤
│ Value(对象值) │
│ ├─ 文件的实际内容 │
│ └─ 可以是任何类型 │
├─────────────────────────────────┤
│ Metadata(元数据) │
│ ├─ Content-Type(文件类型) │
│ ├- Content-Length(文件大小) │
│ ├- Last-Modified(最后修改时间) │
│ └- 自定义元数据 │
└─────────────────────────────────┘
Key的设计建议:
好的Key设计:
photos/2024/01/image.jpg
videos/tutorial/part1.mp4
documents/report.pdf
不好的Key设计:
image.jpg(没有分类)
photo_image_2024_01_01.jpg(命名太长)
3️⃣ AccessKey(访问密钥)¶
定义:用于身份验证的密钥对
AccessKey组成:
┌─────────────────────────────────┐
│ AccessKey ID │
│ ├─ 类似于用户名 │
│ └─ 示例:LTAI5t1234567890abc │
├─────────────────────────────────┤
│ AccessKey Secret │
│ ├─ 类似于密码 │
│ └─ 示例:abc123def456... │
└─────────────────────────────────┘
使用方式:
API请求 + AccessKey ID + AccessKey Secret
↓
服务器验证身份
↓
允许访问
安全提示: - ⚠️ AccessKey Secret非常重要,不要泄露 - 🔐 建议使用RAM子账号,不要使用主账号 - 🔄 定期轮换AccessKey - 📝 记录AccessKey的使用情况
🎯 OSS的应用场景¶
1️⃣ 图片存储¶
场景:用户上传头像、商品图片
传统方式:
用户 → 服务器 → 保存到服务器磁盘
↓
问题:
- 服务器磁盘满了怎么办?
- 备份麻烦
- 访问速度慢
OSS方式:
用户 → 服务器 → 上传到OSS
↓
优势:
- 无限存储空间
- 自动备份
- 可以配置CDN加速
- 可以做图片处理(缩放、裁剪)
2️⃣ 文件下载¶
场景:软件安装包、文档下载
传统方式:
用户 → 服务器 → 下载文件
↓
问题:
- 服务器带宽压力大
- 下载速度慢
- 并发限制
OSS方式:
用户 → OSS → 下载文件
↓
优势:
- 带宽无限
- 下载速度快
- 支持断点续传
- 可以配置CDN加速
3️⃣ 静态网站托管¶
场景:个人博客、文档网站
传统方式:
购买服务器 → 配置Nginx → 上传HTML文件
↓
问题:
- 需要维护服务器
- 成本高
OSS方式:
创建Bucket → 开启静态网站托管 → 上传HTML文件
↓
优势:
- 无需服务器
- 成本低
- 自动HTTPS
- 可以配置CDN加速
4️⃣ 视频点播¶
场景:在线视频课程、短视频平台
传统方式:
用户 → 服务器 → 播放视频
↓
问题:
- 视频文件大
- 播放卡顿
- 服务器压力大
OSS方式:
用户 → OSS + CDN → 播放视频
↓
优势:
- 视频存储在OSS
- CDN加速播放
- 支持多种格式
- 可以做视频转码
📊 OSS与传统文件系统的区别¶
| 特性 | 传统文件系统 | OSS |
|---|---|---|
| 存储结构 | 层级目录结构 | 扁平key-value结构 |
| 访问方式 | 文件系统API | HTTP REST API |
| 容量限制 | 受限于磁盘容量 | 理论上无限 |
| 扩展性 | 需要手动扩容 | 自动弹性扩展 |
| 可靠性 | 单点故障风险 | 多副本容灾 |
| 访问速度 | 受限于服务器带宽 | 可配置CDN加速 |
| 成本 | 固定成本 | 按需付费 |
| 适用场景 | 本地文件管理 | 云端存储和分发 |
4. 阿里云OSS实战¶
🎯 实战目标¶
通过本节学习,你将能够: - ✅ 创建OSS Bucket - ✅ 配置访问权限 - ✅ 上传和下载文件 - ✅ 配置自定义域名和HTTPS - ✅ 使用Python SDK操作OSS
📋 前置准备¶
- 注册阿里云账号:https://www.aliyun.com
- 完成实名认证
- 开通OSS服务
- 创建AccessKey
🚀 步骤1:创建OSS Bucket¶
通过控制台创建¶
操作步骤:
1. 登录阿里云控制台
https://oss.console.aliyun.com
2. 点击"创建Bucket"
3. 填写Bucket信息:
┌─────────────────────────────────┐
│ Bucket名称:my-first-bucket │
│ (全局唯一,只能小写字母、数字、-)│
├─────────────────────────────────┤
│ 地域:华东1(杭州) │
│ (选择离用户近的地域) │
├─────────────────────────────────┤
│ 存储类型:标准存储 │
│ (标准存储:适合频繁访问) │
│ (低频访问:适合不常访问) │
│ (归档存储:适合长期保存) │
├─────────────────────────────────┤
│ 读写权限:私有 │
│ (私有:需要授权才能访问) │
│ (公共读:任何人可读,只有你可写)│
│ (公共读写:不推荐) │
└─────────────────────────────────┘
4. 点击"确定"创建
存储类型选择建议:
| 存储类型 | 适合场景 | 价格 | 访问延迟 |
|---|---|---|---|
| 标准存储 | 频繁访问的文件 | 较高 | 低 |
| 低频访问 | 不常访问的文件 | 中等 | 中等 |
| 归档存储 | 长期保存的文件 | 最低 | 高(需要解冻) |
🔐 步骤2:配置访问权限¶
设置Bucket权限¶
控制台操作:
1. 进入Bucket详情页
2. 点击"权限管理"
3. 选择"Bucket授权策略"
权限类型:
┌─────────────────────────────────┐
│ 私有(推荐) │
│ - 只有授权用户可以访问 │
│ - 安全性最高 │
├─────────────────────────────────┤
│ 公共读 │
│ - 任何人可以读取 │
│ - 只有你可以写入 │
│ - 适合图片、视频等静态资源 │
├─────────────────────────────────┤
│ 公共读写(不推荐) │
│ - 任何人都可以读写 │
│ - 安全风险高 │
└─────────────────────────────────┘
设置跨域配置(CORS)¶
场景:前端通过AJAX访问OSS
配置步骤:
1. 进入Bucket详情页
2. 点击"数据安全" → "跨域设置"
3. 点击"创建规则"
配置示例:
┌─────────────────────────────────┐
│ 来源:* │
│ (或指定域名:https://example.com)│
├─────────────────────────────────┤
│ 允许Methods:GET, POST, PUT │
├─────────────────────────────────┤
│ 允许Headers:* │
├─────────────────────────────────┤
│ 暴露Headers:ETag │
├─────────────────────────────────┤
│ 缓存时间:600 │
└─────────────────────────────────┘
📤 步骤3:上传和下载文件¶
方式1:通过控制台上传¶
操作步骤:
1. 进入Bucket详情页
2. 点击"文件管理"
3. 点击"上传文件"
4. 选择要上传的文件
5. 点击"上传"
上传选项:
┌─────────────────────────────────┐
│ 文件目录:photos/ │
│ (可以指定上传到哪个目录) │
├─────────────────────────────────┤
│ 文件ACL:继承Bucket │
│ (或单独设置权限) │
├─────────────────────────────────┤
│ 上传回调:可选 │
│ (上传成功后通知服务器) │
└─────────────────────────────────┘
方式2:通过命令行工具(ossutil)¶
安装ossutil:
1. 下载ossutil
https://help.aliyun.com/document_detail/120075.html
2. 配置ossutil
ossutil config
配置信息:
配置文件路径:/root/.ossutilconfig
Endpoint:oss-cn-hangzhou.aliyuncs.com
AccessKeyID:你的AccessKey ID
AccessKeySecret:你的AccessKey Secret
stsToken:(可选)
3. 上传文件
ossutil cp local.txt oss://my-bucket/
4. 上传文件夹
ossutil cp -r ./photos oss://my-bucket/
5. 下载文件
ossutil cp oss://my-bucket/file.txt ./
6. 下载文件夹
ossutil cp -r oss://my-bucket/photos ./
7. 列出文件
ossutil ls oss://my-bucket/
8. 删除文件
ossutil rm oss://my-bucket/file.txt
方式3:通过Python SDK¶
安装SDK:
完整示例代码:
import oss2
# 配置信息
access_key_id = '你的AccessKey ID'
access_key_secret = '你的AccessKey Secret'
endpoint = 'https://oss-cn-hangzhou.aliyuncs.com'
bucket_name = 'my-first-bucket'
# 创建Bucket对象
auth = oss2.Auth(access_key_id, access_key_secret)
bucket = oss2.Bucket(auth, endpoint, bucket_name)
# 1. 上传文件
def upload_file(local_path, object_name):
"""
上传文件到OSS
参数:
local_path: 本地文件路径
object_name: OSS中的对象名称
"""
try:
result = bucket.put_object_from_file(object_name, local_path)
print(f'上传成功:{object_name}')
print(f'ETag: {result.etag}')
return True
except oss2.exceptions.OssError as e:
print(f'上传失败:{e}')
return False
# 使用示例
upload_file('./image.jpg', 'photos/image.jpg')
# 2. 下载文件
def download_file(object_name, local_path):
"""
从OSS下载文件
参数:
object_name: OSS中的对象名称
local_path: 本地保存路径
"""
try:
bucket.get_object_to_file(object_name, local_path)
print(f'下载成功:{object_name}')
return True
except oss2.exceptions.OssError as e:
print(f'下载失败:{e}')
return False
# 使用示例
download_file('photos/image.jpg', './downloaded_image.jpg')
# 3. 列出文件
def list_files(prefix=''):
"""
列出Bucket中的文件
参数:
prefix: 前缀过滤(例如:'photos/')
"""
try:
for obj in oss2.ObjectIterator(bucket, prefix=prefix):
print(f'文件名:{obj.key}')
print(f'大小:{obj.size} bytes')
print(f'最后修改:{obj.last_modified}')
print('-' * 50)
except oss2.exceptions.OssError as e:
print(f'列出文件失败:{e}')
# 使用示例
list_files('photos/')
# 4. 删除文件
def delete_file(object_name):
"""
删除OSS中的文件
参数:
object_name: OSS中的对象名称
"""
try:
bucket.delete_object(object_name)
print(f'删除成功:{object_name}')
return True
except oss2.exceptions.OssError as e:
print(f'删除失败:{e}')
return False
# 使用示例
delete_file('photos/image.jpg')
# 5. 生成签名URL(用于临时访问)
def generate_signed_url(object_name, expires=3600):
"""
生成签名URL
参数:
object_name: OSS中的对象名称
expires: 过期时间(秒)
"""
try:
url = bucket.sign_url('GET', object_name, expires)
print(f'签名URL:{url}')
return url
except oss2.exceptions.OssError as e:
print(f'生成URL失败:{e}')
return None
# 使用示例
url = generate_signed_url('photos/image.jpg', expires=3600)
# 6. 批量上传
def batch_upload(local_dir, prefix=''):
"""
批量上传文件夹
参数:
local_dir: 本地文件夹路径
prefix: OSS中的前缀
"""
import os
try:
for root, dirs, files in os.walk(local_dir):
for file in files:
local_path = os.path.join(root, file)
# 计算相对路径
rel_path = os.path.relpath(local_path, local_dir)
object_name = f'{prefix}{rel_path}' if prefix else rel_path
# 替换路径分隔符
object_name = object_name.replace('\\', '/')
upload_file(local_path, object_name)
except Exception as e:
print(f'批量上传失败:{e}')
# 使用示例
batch_upload('./local_photos', 'photos/')
# 7. 获取文件信息
def get_file_info(object_name):
"""
获取文件信息
参数:
object_name: OSS中的对象名称
"""
try:
info = bucket.get_object_meta(object_name)
print(f'文件信息:{object_name}')
print(f'大小:{info.content_length} bytes')
print(f'类型:{info.content_type}')
print(f'最后修改:{info.last_modified}')
print(f'ETag:{info.etag}')
return info
except oss2.exceptions.OssError as e:
print(f'获取文件信息失败:{e}')
return None
# 使用示例
get_file_info('photos/image.jpg')
# 8. 检查文件是否存在
def file_exists(object_name):
"""
检查文件是否存在
参数:
object_name: OSS中的对象名称
"""
try:
bucket.head_object(object_name)
print(f'文件存在:{object_name}')
return True
except oss2.exceptions.NoSuchKey:
print(f'文件不存在:{object_name}')
return False
except oss2.exceptions.OssError as e:
print(f'检查失败:{e}')
return False
# 使用示例
file_exists('photos/image.jpg')
🌐 步骤4:配置自定义域名和HTTPS¶
配置自定义域名¶
场景:
- 原始URL:https://my-bucket.oss-cn-hangzhou.aliyuncs.com/image.jpg <!-- ⚠️ 需要访问权限 -->
- 自定义域名:https://cdn.example.com/image.jpg
配置步骤:
1. 在Bucket中添加域名
进入Bucket详情 → 域名管理 → 绑定用户域名
输入:cdn.example.com
2. 配置DNS解析
在域名服务商处添加CNAME记录:
记录类型:CNAME
主机记录:cdn
记录值:my-bucket.oss-cn-hangzhou.aliyuncs.com
3. 等待DNS生效(通常10分钟-24小时)
4. 验证配置
访问:https://cdn.example.com/image.jpg
配置HTTPS¶
配置步骤:
1. 申请SSL证书
- 免费证书:Let's Encrypt、阿里云免费证书
- 付费证书:DigiCert、GlobalSign
2. 在OSS中上传证书
进入Bucket详情 → 域名管理 → 证书托管
上传证书文件和私钥
3. 启用HTTPS
勾选"开启HTTPS"
4. 强制HTTPS(可选)
勾选"强制HTTPS",HTTP请求会自动跳转到HTTPS
验证:
访问 https://cdn.example.com/image.jpg
浏览器地址栏显示锁图标 ✓
⏰ 步骤5:设置生命周期规则¶
场景:自动清理过期文件,节省成本
配置步骤:
1. 进入Bucket详情
2. 点击"生命周期"
3. 点击"创建规则"
规则配置示例:
┌─────────────────────────────────┐
│ 规则名称:cleanup-temp-files │
├─────────────────────────────────┤
│ 应用范围:temp/ │
│ (只对temp/目录下的文件生效) │
├─────────────────────────────────┤
│ 过期策略: │
│ - 文件创建30天后删除 │
│ - 或指定日期删除 │
├─────────────────────────────────┤
│ 转换策略: │
│ - 60天后转为低频访问存储 │
│ - 180天后转为归档存储 │
└─────────────────────────────────┘
实际应用:
1. 临时文件:创建7天后删除
2. 日志文件:创建30天后删除
3. 备份文件:创建90天后转为归档存储
5. CDN(内容分发网络)¶
📖 什么是CDN?¶
CDN(Content Delivery Network):内容分发网络
简单理解:把你的内容复制到全国/全球各地的服务器上,用户访问时自动连接最近的服务器,速度更快。
没有CDN:
用户(广东) → 服务器(北京)
↓
距离远、速度慢
有CDN:
用户(广东) → CDN节点(广州)✓ 快速返回
用户(上海) → CDN节点(上海)✓ 快速返回
用户(北京) → CDN节点(北京)✓ 快速返回
🔍 CDN的工作原理¶
CDN工作流程图:
第1次访问:
用户 → CDN节点(广州)
↓
检查缓存:没有
↓
回源:向源站(OSS/服务器)请求
↓
源站返回内容
↓
CDN节点缓存内容
↓
返回给用户
第2次访问:
用户 → CDN节点(广州)
↓
检查缓存:有 ✓
↓
直接返回给用户(不需要回源)
ASCII图示:
┌─────────────────┐
│ 源站 │
│ (OSS/服务器) │
└────────┬────────┘
│
┌──────────────┼──────────────┐
│ │ │
┌─────▼─────┐ ┌─────▼─────┐ ┌─────▼─────┐
│ CDN节点1 │ │ CDN节点2 │ │ CDN节点3 │
│ (广州) │ │ (上海) │ │ (北京) │
└─────┬─────┘ └─────┬─────┘ └─────┬─────┘
│ │ │
┌─────▼─────┐ ┌─────▼─────┐ ┌─────▼─────┐
│ 用户A │ │ 用户B │ │ 用户C │
│ (广东) │ │ (上海) │ │ (北京) │
└───────────┘ └───────────┘ └───────────┘
访问流程:
用户A(广东)→ CDN节点1(广州)→ 有缓存 → 快速返回 ✓
用户B(上海)→ CDN节点2(上海)→ 有缓存 → 快速返回 ✓
用户C(北京)→ CDN节点3(北京)→ 有缓存 → 快速返回 ✓
🎯 CDN的核心概念¶
2024-2025 CDN行业发展趋势¶
根据 Cloudflare 2024年度报告: - 全球互联网流量增长 17.2% - CDN 采用率持续攀升,主要驱动因素: - AI/ML 应用对低延迟的需求 - 视频流媒体流量激增 - 边缘计算场景扩展
主流CDN服务商对比(2024):
| 服务商 | 全球节点数 | 特色功能 | 适用场景 |
|---|---|---|---|
| Cloudflare | 300+ | 免费套餐、DDoS防护、Workers边缘计算 | 中小企业、开发者 |
| 阿里云CDN | 2800+ | 国内覆盖好、OSS集成 | 国内业务 |
| AWS CloudFront | 400+ | 与AWS生态集成 | AWS用户 |
| Fastly | 100+ | 实时配置更新、边缘计算 | 大型互联网企业 |
| 腾讯云CDN | 2000+ | 国内优化、游戏加速 | 游戏、视频 |
1️⃣ 节点(Node)¶
定义:CDN部署在世界各地的服务器
节点类型:
┌─────────────────────────────────┐
│ 边缘节点 │
│ - 距离用户最近 │
│ - 数量最多 │
│ - 缓存静态资源 │
├─────────────────────────────────┤
│ 区域节点 │
│ - 覆盖一个区域 │
│ - 作为边缘节点的上级 │
│ - 缓存热点内容 │
├─────────────────────────────────┤
│ 中心节点 │
│ - 数量最少 │
│ - 负责回源 │
│ - 缓存最热门的内容 │
└─────────────────────────────────┘
2️⃣ 缓存(Cache)¶
定义:CDN节点存储的副本内容
缓存策略:
┌─────────────────────────────────┐
│ 缓存时间 │
│ - 短缓存:1分钟(动态内容) │
│ - 中缓存:1小时(普通静态资源) │
│ - 长缓存:1天(不常更新的资源) │
├─────────────────────────────────┤
│ 缓存规则 │
│ - 按文件类型:.jpg缓存1天 │
│ - 按目录:/static/缓存1小时 │
│ - 按URL参数:忽略或包含参数 │
├─────────────────────────────────┤
│ 缓存更新 │
│ - 主动刷新:手动清除缓存 │
│ - 过期自动更新:缓存时间到了 │
│ - 预热:提前加载到节点 │
└─────────────────────────────────┘
3️⃣ 回源(Origin Pull)¶
定义:CDN节点从源站获取内容的过程
回源流程:
CDN节点 → 检查缓存 → 没有缓存
↓
回源请求
↓
源站(OSS)
↓
返回内容
↓
CDN节点缓存
↓
返回给用户
回源类型:
┌─────────────────────────────────┐
│ 协议回源 │
│ - HTTP回源 │
│ - HTTPS回源 │
├─────────────────────────────────┤
│ 权限回源 │
│ - 公共回源 │
│ - 私有回源(需要鉴权) │
├─────────────────────────────────┤
│ 条件回源 │
│ - 404回源 │
│ - 5xx回源 │
└─────────────────────────────────┘
🌟 CDN的应用场景¶
1️⃣ 静态资源加速¶
场景:网站图片、CSS、JS文件
加速效果:
没有CDN:
加载时间:5秒
用户体验:差
有CDN:
加载时间:1秒
用户体验:好 ✓
加速的资源:
- 图片:.jpg, .png, .gif, .webp
- 样式:.css
- 脚本:.js
- 字体:.woff, .ttf
- 媒体:.mp4, .mp3
2️⃣ 视频点播¶
场景:在线视频网站
问题:
- 视频文件大(几百MB到几GB)
- 用户多时服务器压力大
- 播放卡顿
CDN解决方案:
视频 → OSS → CDN → 用户
↓
优势:
- 就近访问,播放流畅
- 支持断点续传
- 支持多种格式
- 自动转码
3️⃣ 直播¶
场景:直播平台
直播流程:
主播 → 推流服务器 → CDN节点 → 观众
↓
实时分发
CDN优势:
- 低延迟(1-3秒)
- 高并发(支持百万观众)
- 全球覆盖
- 自动切换节点
4️⃣ 下载加速¶
6. CDN配置实战¶
🎯 实战目标¶
通过本节学习,你将能够: - ✅ 添加CDN加速域名 - ✅ 配置CNAME解析 - ✅ 设置缓存规则 - ✅ 配置HTTPS - ✅ 刷新和预热缓存
🚀 步骤1:添加加速域名¶
操作步骤:
1. 登录阿里云CDN控制台
https://cdn.console.aliyun.com
2. 点击"添加域名"
3. 填写域名信息:
┌─────────────────────────────────┐
│ 加速域名:cdn.example.com │
│ (你的自定义域名) │
├─────────────────────────────────┤
│ 业务类型:图片小文件 │
│ (图片小文件、大文件下载、视频点播)│
├─────────────────────────────────┤
│ 源站类型:OSS域名 │
│ (IP地址、域名、OSS) │
├─────────────────────────────────┤
│ 源站地址:my-bucket.oss-cn-... │
│ (你的OSS域名) │
├─────────────────────────────────┤
│ 加速区域:中国大陆 │
│ (中国大陆、全球、仅海外) │
└─────────────────────────────────┘
4. 点击"下一步"完成配置
业务类型选择建议:
| 业务类型 | 适合场景 | 特点 |
|---|---|---|
| 图片小文件 | 网站、APP | 频繁访问的小文件 |
| 大文件下载 | 软件下载 | 文件较大,访问频率低 |
| 视频点播 | 在线视频 | 支持视频优化 |
| 直播流媒体 | 直播平台 | 低延迟,高并发 |
🔗 步骤2:配置CNAME解析¶
什么是CNAME?
CNAME(Canonical Name):别名记录
把你的域名指向CDN的域名
配置步骤:
1. 在CDN控制台获取CNAME
域名管理 → 找到你的域名 → 查看CNAME
示例:cdn.example.com.w.kunlunle.com
2. 在域名服务商处添加DNS记录
登录域名服务商(阿里云、腾讯云等)
添加记录:
记录类型:CNAME
主机记录:cdn
记录值:cdn.example.com.w.kunlunle.com
TTL:10分钟(默认)
3. 等待DNS生效(通常10分钟-24小时)
4. 验证配置
在CDN控制台查看域名状态
状态显示"正常运行" ✓
DNS配置示例:
域名:example.com
记录类型 主机记录 记录值
A @ 1.2.3.4(服务器IP)
CNAME cdn cdn.example.com.w.kunlunle.com
A www 1.2.3.4(服务器IP)
访问:
- example.com → 服务器
- cdn.example.com → CDN
- www.example.com → 服务器
⚙️ 步骤3:缓存配置¶
配置步骤:
1. 进入CDN控制台
2. 点击"域名管理" → "缓存配置"
3. 添加缓存规则
缓存规则示例:
┌─────────────────────────────────┐
│ 规则1: │
│ 目录:/static/ │
│ 缓存时间:3600秒(1小时) │
│ 权重:1 │
├─────────────────────────────────┤
│ 规则2: │
│ 文件后缀:.jpg, .png, .gif │
│ 缓存时间:86400秒(1天) │
│ 权重:2 │
├─────────────────────────────────┤
│ 规则3: │
│ 文件后缀:.php, .jsp, .asp │
│ 缓存时间:0秒(不缓存) │
│ 权重:3 │
└─────────────────────────────────┘
权重说明:
权重越大,优先级越高
权重3的规则会先匹配
缓存时间建议:
| 资源类型 | 缓存时间 | 原因 |
|---|---|---|
| 图片(.jpg, .png) | 1天 | 不常更新 |
| CSS/JS | 1小时 | 可能更新 |
| 字体 | 7天 | 很少更新 |
| 视频 | 1天 | 不常更新 |
| HTML | 不缓存 | 动态内容 |
| API接口 | 不缓存 | 实时数据 |
高级缓存配置:
1. 忽略参数
场景:URL参数不影响内容
配置:忽略所有参数
示例:
- image.jpg?v=1
- image.jpg?v=2
两个URL缓存相同内容
2. 参数保留
场景:URL参数影响内容
配置:保留指定参数
示例:
- image.jpg?size=large
- image.jpg?size=small
两个URL缓存不同内容
3. 缓存键规则
配置:根据URL、Header、Cookie生成缓存键
🔒 步骤4:HTTPS配置¶
配置步骤:
1. 申请SSL证书
- 免费证书:阿里云免费证书(有效期1年)
- 付费证书:DigiCert、GlobalSign
2. 在CDN控制台上传证书
域名管理 → HTTPS配置 → 修改配置
配置信息:
┌─────────────────────────────────┐
│ HTTPS状态:开启 │
├─────────────────────────────────┤
│ 证书方式:自有证书 │
├─────────────────────────────────┤
│ 证书内容: │
│ -----BEGIN CERTIFICATE----- │
│ ... │
│ -----END CERTIFICATE----- │
├─────────────────────────────────┤
│ 私钥: │
│ -----BEGIN PRIVATE KEY----- │
│ ... │
│ -----END PRIVATE KEY----- │
├─────────────────────────────────┤
│ 强制HTTPS:开启 │
│ (HTTP请求自动跳转到HTTPS) │
├─────────────────────────────────┤
│ HTTP2.0:开启 │
│ (提升性能) │
└─────────────────────────────────┘
3. 保存配置
4. 验证HTTPS
访问:https://cdn.example.com/image.jpg
浏览器地址栏显示锁图标 ✓
🔄 步骤5:刷新和预热缓存¶
刷新缓存:
场景:更新了文件,需要让CDN重新获取
操作步骤:
1. 进入CDN控制台
2. 点击"刷新预热"
3. 选择"刷新"
刷新类型:
┌─────────────────────────────────┐
│ URL刷新 │
│ - 刷新单个URL │
│ - 示例:https://cdn.example.com/image.jpg │
│ - 适合:更新了少量文件 │
├─────────────────────────────────┤
│ 目录刷新 │
│ - 刷新整个目录 │
│ - 示例:https://cdn.example.com/photos/ │
│ - 适合:更新了多个文件 │
└─────────────────────────────────┘
刷新频率限制:
- 每个账号每天最多刷新2000次
- 每次最多刷新1000个URL
- 每次最多刷新100个目录
预热缓存:
场景:提前把文件加载到CDN节点
操作步骤:
1. 进入CDN控制台
2. 点击"刷新预热"
3. 选择"预热"
预热配置:
┌─────────────────────────────────┐
│ URL:https://cdn.example.com/image.jpg │
│ (要预热的URL) │
├─────────────────────────────────┤
│ 任务类型:URL预热 │
└─────────────────────────────────┘
预热频率限制:
- 每个账号每天最多预热500次
- 每次最多预热1000个URL
预热场景:
- 新网站上线
- 大促活动前
- 热门内容发布前
Python SDK操作CDN缓存:
from aliyunsdkcore.client import AcsClient
from aliyunsdkcdn.request.v20180510.RefreshObjectCachesRequest import RefreshObjectCachesRequest
# 配置信息
access_key_id = '你的AccessKey ID'
access_key_secret = '你的AccessKey Secret'
region_id = 'cn-hangzhou'
# 创建客户端
client = AcsClient(access_key_id, access_key_secret, region_id)
# 刷新URL
def refresh_url(url):
"""
刷新URL
参数:
url: 要刷新的URL
"""
request = RefreshObjectCachesRequest()
request.set_ObjectType('File')
request.set_ObjectPath(url)
try:
response = client.do_action_with_exception(request)
print(f'刷新成功:{url}')
print(f'响应:{response}')
return True
except Exception as e:
print(f'刷新失败:{e}')
return False
# 使用示例
refresh_url('https://cdn.example.com/image.jpg')
# 刷新目录
def refresh_dir(dir_url):
"""
刷新目录
参数:
dir_url: 要刷新的目录URL
"""
request = RefreshObjectCachesRequest()
request.set_ObjectType('Directory')
request.set_ObjectPath(dir_url)
try:
response = client.do_action_with_exception(request)
print(f'刷新成功:{dir_url}')
print(f'响应:{response}')
return True
except Exception as e:
print(f'刷新失败:{e}')
return False
# 使用示例
refresh_dir('https://cdn.example.com/photos/')
7. OSS与CDN结合使用¶
🤔 为什么需要OSS+CDN组合?¶
单独使用OSS:
用户 → OSS → 返回内容
↓
问题:
- 距离远,速度慢
- 带宽费用高
- 并发能力有限
单独使用CDN:
用户 → CDN → 源站(服务器)→ 返回内容
↓
问题:
- 源站压力大
- 需要维护服务器
OSS + CDN:
用户 → CDN → OSS → 返回内容
↓
CDN缓存
↓
下次直接返回
优势:
✓ OSS:无限存储,自动备份
✓ CDN:就近访问,速度快
✓ 成本:按需付费,节省带宽
✓ 维护:无需管理服务器
⚙️ 配置OSS作为CDN的源站¶
配置步骤:
1. 创建OSS Bucket
(参考前面章节)
2. 添加CDN域名
源站类型:OSS域名
源站地址:my-bucket.oss-cn-hangzhou.aliyuncs.com
3. 配置CNAME
cdn.example.com → CDN CNAME
4. 配置缓存规则
静态资源:缓存1天
动态内容:不缓存
5. 配置HTTPS
OSS和CDN都配置HTTPS
6. 测试访问
https://cdn.example.com/image.jpg
配置检查清单:
📊 访问流程图¶
完整访问流程:
第1次访问:
用户浏览器
↓
输入URL:https://cdn.example.com/image.jpg
↓
DNS解析:cdn.example.com → CDN节点IP
↓
访问CDN节点(广州)
↓
检查缓存:没有
↓
回源请求:向OSS请求
↓
OSS返回内容
↓
CDN节点缓存内容
↓
返回给用户
第2次访问:
用户浏览器
↓
输入URL:https://cdn.example.com/image.jpg
↓
DNS解析:cdn.example.com → CDN节点IP
↓
访问CDN节点(广州)
↓
检查缓存:有 ✓
↓
直接返回给用户(不需要回源)
ASCII图示:
┌─────────────────┐
│ OSS │
│ (源站存储) │
└────────┬────────┘
│
回源请求
│
┌──────────────▼──────────────┐
│ CDN中心节点 │
│ (回源、缓存热点) │
└──────────────┬──────────────┘
│
分发内容
│
┌────────────────────┼────────────────────┐
│ │ │
┌────▼─────┐ ┌────▼─────┐ ┌────▼─────┐
│CDN节点1 │ │CDN节点2 │ │CDN节点3 │
│ (广州) │ │ (上海) │ │ (北京) │
└────┬─────┘ └────┬─────┘ └────┬─────┘
│ │ │
┌────▼─────┐ ┌────▼─────┐ ┌────▼─────┐
│ 用户A │ │ 用户B │ │ 用户C │
│ (广东) │ │ (上海) │ │ (北京) │
└──────────┘ └──────────┘ └──────────┘
流程:
1. 用户A访问 → CDN节点1 → 没有缓存 → 回源OSS → 缓存 → 返回
2. 用户B访问 → CDN节点2 → 没有缓存 → 回源OSS → 缓存 → 返回
3. 用户C访问 → CDN节点3 → 没有缓存 → 回源OSS → 缓存 → 返回
4. 用户A再次访问 → CDN节点1 → 有缓存 ✓ → 直接返回
💰 成本优化策略¶
1️⃣ 选择合适的存储类型¶
OSS存储类型对比:
标准存储:
- 价格:0.12元/GB/月
- 适合:频繁访问的文件
- 示例:网站图片、视频
低频访问存储:
- 价格:0.08元/GB/月
- 适合:不常访问的文件
- 示例:备份文件、历史数据
- 注意:有最低存储时间(30天)
归档存储:
- 价格:0.033元/GB/月
- 适合:长期保存的文件
- 示例:日志归档、合规数据
- 注意:需要解冻才能访问(1-5分钟)
冷归档存储:
- 价格:0.015元/GB/月
- 适合:极少访问的文件
- 示例:历史档案
- 注意:解冻需要1-12小时
2️⃣ 合理设置缓存时间¶
缓存时间优化:
短缓存(1-5分钟):
- 适合:动态内容
- 优点:内容更新快
- 缺点:回源频繁,成本高
中缓存(1小时):
- 适合:可能更新的内容
- 优点:平衡更新和成本
- 缺点:更新有延迟
长缓存(1天以上):
- 适合:不常更新的内容
- 优点:回源少,成本低
- 缺点:更新慢
建议:
- 图片、视频:1天
- CSS、JS:1小时
- HTML:不缓存
- API:不缓存
3️⃣ 使用生命周期规则¶
自动转换存储类型:
规则示例:
┌─────────────────────────────────┐
│ 60天后:标准 → 低频访问 │
│ 180天后:低频访问 → 归档 │
│ 365天后:归档 → 删除 │
└─────────────────────────────────┘
成本节省:
- 标准存储:0.12元/GB/月
- 低频访问:0.08元/GB/月(节省33%)
- 归档存储:0.033元/GB/月(节省72%)
示例:
100GB数据,存储1年:
- 全部标准存储:100 × 0.12 × 12 = 144元
- 自动转换:约50元(节省65%)
4️⃣ 使用CDN节省带宽¶
带宽费用对比:
直接访问OSS:
- 外网流出流量:0.5元/GB
- 100GB流量:50元
使用CDN:
- CDN流量:0.24元/GB
- 100GB流量:24元(节省52%)
CDN回源费用:
- 回源流量:0.15元/GB
- 假设回源率10%:100GB × 10% × 0.15 = 1.5元
总费用:24 + 1.5 = 25.5元
节省:50 - 25.5 = 24.5元(节省49%)
5️⃣ 使用预留资源包¶
OSS资源包:
- 标准存储包:0.09元/GB/月(比按量便宜25%)
- 低频访问包:0.06元/GB/月(比按量便宜25%)
- 回源流量包:0.12元/GB(比按量便宜20%)
CDN资源包:
- 流量包:0.18元/GB(比按量便宜25%)
- 请求次数包:适合高并发场景
购买建议:
- 根据历史使用量购买
- 大包更便宜
- 注意有效期
8. 常见问题¶
❓ 问题1:OSS和CDN的区别¶
回答:
OSS vs CDN 对比:
OSS(对象存储):
┌─────────────────────────────────┐
│ 功能:存储文件 │
│ 作用:云端硬盘 │
│ 特点: │
│ - 无限存储空间 │
│ - 自动备份 │
│ - 提供API访问 │
│ - 可以托管静态网站 │
└─────────────────────────────────┘
CDN(内容分发):
┌─────────────────────────────────┐
│ 功能:加速访问 │
│ 作用:全球缓存 │
│ 特点: │
│ - 就近访问 │
│ - 减少延迟 │
│ - 节省带宽 │
│ - 提升并发 │
└─────────────────────────────────┘
关系:
OSS + CDN = 最佳组合
OSS负责存储,CDN负责加速
比喻:
OSS = 仓库(存放货物)
CDN = 连锁店(就近销售)
❓ 问题2:如何选择合适的存储类型?¶
回答:
选择存储类型的决策树:
文件访问频率?
├─ 高(每天多次)
│ └─ 标准存储 ✓
│ 价格:0.12元/GB/月
│ 示例:网站图片、视频
│
├─ 中(每周几次)
│ └─ 低频访问存储 ✓
│ 价格:0.08元/GB/月
│ 示例:备份文件、历史数据
│
└─ 低(每月几次或更少)
└─ 归档存储 ✓
价格:0.033元/GB/月
示例:日志归档、合规数据
特殊情况:
- 临时文件:标准存储 + 生命周期规则
- 重要数据:标准存储 + 跨区域复制
- 合规数据:归档存储 + 合规保留
实际案例:
案例1:电商网站
商品图片:标准存储(频繁访问)
用户头像:标准存储(频繁访问)
订单数据:低频访问(偶尔查询)
历史订单:归档存储(长期保存)
案例2:视频网站
热门视频:标准存储(频繁播放)
普通视频:低频访问(偶尔播放)
冷门视频:归档存储(很少播放)
案例3:日志系统
实时日志:标准存储(需要查询)
7天前日志:低频访问(偶尔查询)
30天前日志:归档存储(合规保存)
❓ 问题3:CDN缓存不生效怎么办?¶
回答:
CDN缓存不生效排查步骤:
1. 检查缓存配置
- 缓存时间是否为0?
- 缓存规则是否正确?
- 是否匹配了正确的规则?
2. 检查URL参数
- URL是否包含随机参数?
- 是否配置了忽略参数?
- 示例:
image.jpg?v=123
image.jpg?v=456
两个URL会缓存不同内容
3. 检查HTTP响应头
- Cache-Control是否设置?
- Expires是否设置?
- 示例:
Cache-Control: no-cache(不缓存)
Cache-Control: max-age=3600(缓存1小时)
4. 检查CDN节点
- 是否回源成功?
- 源站是否返回200?
- 查看CDN日志
5. 手动刷新缓存
- 使用CDN控制台刷新
- 使用API刷新
- 等待刷新完成
6. 清除浏览器缓存
- Ctrl + F5强制刷新
- 使用无痕模式测试
- 使用curl测试
7. 检查CNAME配置
- DNS是否生效?
- 是否指向正确的CDN节点?
- 使用nslookup检查
排查工具:
# 1. 检查DNS解析
nslookup cdn.example.com
# 2. 检查HTTP响应头
curl -I https://cdn.example.com/image.jpg
# 3. 检查是否命中缓存
curl -I https://cdn.example.com/image.jpg
# 查看X-Cache: HIT(命中)或MISS(未命中)
# 4. 强制刷新
curl -H "Pragma: no-cache" https://cdn.example.com/image.jpg
❓ 问题4:如何监控OSS和CDN的使用情况?¶
回答:
监控OSS使用情况:
1. 控制台监控
- 登录OSS控制台
- 点击"监控"
- 查看实时监控数据:
* 存储用量
* 请求次数
* 流量
* 延迟
2. 配置告警
- 点击"告警"
- 创建告警规则:
* 存储用量超过阈值
* 请求次数异常
* 错误率过高
- 配置通知方式:
* 短信
* 邮件
* 钉钉
监控CDN使用情况:
1. 控制台监控
- 登录CDN控制台
- 点击"监控"
- 查看实时监控数据:
* 流量
* 带宽
* 请求数
* 命中率
* 回源流量
2. 配置告警
- 点击"告警"
- 创建告警规则:
* 流量超过阈值
* 带宽超过阈值
* 命中率过低
* 错误率过高
3. 查看日志
- 点击"日志服务"
- 下载访问日志
- 分析访问情况
Python SDK监控示例:
import oss2
from aliyunsdkcore.client import AcsClient
from aliyunsdkcdn.request.v20180510.DescribeCdnDomainDetailRequest import DescribeCdnDomainDetailRequest
# 监控OSS
def monitor_oss(bucket_name):
"""
监控OSS使用情况
参数:
bucket_name: Bucket名称
"""
auth = oss2.Auth('你的AccessKey ID', '你的AccessKey Secret')
bucket = oss2.Bucket(auth, 'https://oss-cn-hangzhou.aliyuncs.com', bucket_name)
# 获取存储用量
storage_usage = bucket.get_bucket_stat().storage_size_in_bytes
print(f'存储用量:{storage_usage / 1024 / 1024 / 1024:.2f} GB')
# 获取对象数量
object_count = bucket.get_bucket_stat().object_count
print(f'对象数量:{object_count}')
# 列出文件
count = 0
for obj in oss2.ObjectIterator(bucket):
count += 1
if count > 10: # 只显示前10个
break
print(f'文件:{obj.key}, 大小:{obj.size} bytes')
# 监控CDN
def monitor_cdn(domain_name):
"""
监控CDN使用情况
参数:
domain_name: 域名
"""
client = AcsClient('你的AccessKey ID', '你的AccessKey Secret', 'cn-hangzhou')
request = DescribeCdnDomainDetailRequest()
request.set_DomainName(domain_name)
try: # try/except捕获异常
response = client.do_action_with_exception(request)
print(f'CDN域名详情:{domain_name}')
print(f'响应:{response}')
except Exception as e:
print(f'监控失败:{e}')
# 使用示例
monitor_oss('my-bucket')
monitor_cdn('cdn.example.com')
❓ 问题5:如何保证OSS数据安全?¶
回答:
OSS数据安全措施:
1. 访问控制
- 使用RAM子账号,不要使用主账号
- 设置最小权限原则
- 定期轮换AccessKey
- 使用STS临时凭证
2. 数据加密
- 服务器端加密(SSE)
- 客户端加密
- 传输加密(HTTPS)
3. 数据备份
- 开启版本控制
- 配置跨区域复制
- 定期备份到其他存储
4. 安全策略
- 设置防盗链
- 配置IP白名单
- 设置Referer白名单
5. 审计日志
- 开启访问日志
- 配置日志分析
- 监控异常访问
版本控制配置:
配置步骤:
1. 进入Bucket详情
2. 点击"数据安全" → "版本控制"
3. 开启版本控制
版本控制作用:
- 防止误删除
- 可以恢复历史版本
- 追溯文件变更
成本:
- 每个版本都会收费
- 建议设置生命周期规则,自动清理旧版本
❓ 问题6:CDN和OSS如何处理HTTPS?¶
回答:
HTTPS配置方案:
方案1:OSS + CDN都配置HTTPS
┌─────────────────────────────────┐
│ 用户 → HTTPS → CDN → HTTPS → OSS │
│ (全程加密) │
│ 优点:安全性最高 │
│ 缺点:配置复杂 │
└─────────────────────────────────┘
方案2:CDN配置HTTPS,OSS使用HTTP
┌─────────────────────────────────┐
│ 用户 → HTTPS → CDN → HTTP → OSS │
│ (部分加密) │
│ 优点:配置简单 │
│ 缺点:CDN到OSS不加密 │
└─────────────────────────────────┘
推荐:方案1(全程加密)
证书配置:
证书类型:
1. 免费证书
- Let's Encrypt
- 阿里云免费证书
- 有效期:3个月-1年
- 适合:个人网站、测试环境
2. 付费证书
- DigiCert
- GlobalSign
- 有效期:1-2年
- 适合:企业网站、生产环境
证书申请:
1. 生成CSR文件
2. 提交给CA机构
3. 验证域名所有权
4. 下载证书文件
5. 上传到CDN和OSS
📝 总结¶
🎯 核心要点¶
- 云服务:提供弹性、可靠、低成本的计算资源
- OSS:对象存储服务,适合云端存储和分发
- CDN:内容分发网络,提升访问速度
- OSS + CDN:最佳组合,存储+加速
🚀 实战技能¶
- ✅ 创建和配置OSS Bucket
- ✅ 使用Python SDK操作OSS
- ✅ 配置CDN加速域名
- ✅ 设置缓存规则和HTTPS
- ✅ 优化成本和性能
📚 延伸学习¶
- 阿里云官方文档:https://help.aliyun.com/product/31815.html
- OSS最佳实践:https://help.aliyun.com/document_detail/31827.html
- CDN最佳实践:https://help.aliyun.com/document_detail/27101.html
💡 下一步建议¶
- 实践:创建自己的OSS Bucket
- 实验:上传文件并配置CDN
- 优化:设置生命周期规则和缓存策略
- 监控:配置告警和日志分析
9. 多云服务商对比¶
9.1 四大云厂商产品对比¶
| 服务类型 | 阿里云 | 腾讯云 | 华为云 | AWS |
|---|---|---|---|---|
| 计算服务 | ||||
| 云服务器 | ECS | CVM | ECS | EC2 |
| 容器服务 | ACK | TKE | CCE | ECS/EKS |
| 无服务器 | 函数计算 | SCF | FunctionGraph | Lambda |
| 存储服务 | ||||
| 对象存储 | OSS | COS | OBS | S3 |
| 块存储 | EBS | CBS | EVS | EBS |
| 文件存储 | NAS | CFS | SFS | EFS |
| 网络服务 | ||||
| VPC | VPC | VPC | VPC | VPC |
| 负载均衡 | SLB | CLB | ELB | ELB |
| CDN | CDN | CDN | CDN | CloudFront |
| 数据库 | ||||
| 关系型 | RDS | CDB | RDS | RDS |
| NoSQL | MongoDB | MongoDB | DDS | DynamoDB |
| 缓存 | Redis | Redis | DCS | ElastiCache |
| AI/ML | ||||
| 机器学习 | PAI | TI-ONE | ModelArts | SageMaker |
| 语音识别 | 智能语音 | 语音识别 | 语音交互 | Transcribe |
| 图像识别 | 视觉智能 | 图像分析 | 图像识别 | Rekognition |
9.2 云厂商选择建议¶
选择决策树:
预算敏感?
├─ 是 → 腾讯云(价格优势明显)
└─ 否 → 业务类型?
├─ 电商/企业应用 → 阿里云(生态完善)
├─ 游戏/社交 → 腾讯云(微信生态)
├─ 政企/安全 → 华为云(安全可靠)
└─ 出海业务 → AWS(全球覆盖)
特殊需求?
├─ AI/ML → 阿里云PAI、华为云ModelArts
├─ 视频直播 → 腾讯云(音视频优势)
├─ 政企合规 → 华为云(国产化)
└─ 全球部署 → AWS、阿里云
9.3 多云架构设计¶
多云架构模式:
模式1:主备模式
┌─────────────────────────────────┐
│ 流量入口 │
│ (DNS负载均衡) │
└──────────────┬──────────────────┘
│
┌────────┴────────┐
│ │
┌─────▼─────┐ ┌─────▼─────┐
│ 阿里云 │ │ 腾讯云 │
│ (主) │ │ (备) │
│ 华东节点 │ │ 华南节点 │
└───────────┘ └───────────┘
特点:
- 主云承载主要流量
- 备云用于容灾
- 数据实时同步
- 故障自动切换
模式2:多活模式
┌─────────────────────────────────┐
│ 流量入口 │
│ (智能DNS/GSLB) │
└──────────────┬──────────────────┘
│
┌────────┼────────┐
│ │ │
┌─────▼───┐ ┌──▼───┐ ┌──▼───┐
│ 阿里云 │ │腾讯云 │ │华为云 │
│ 华北节点 │ │华东节点│ │华南节点│
└─────────┘ └──────┘ └──────┘
特点:
- 多云同时提供服务
- 就近访问
- 负载分担
- 互为备份
模式3:混合云模式
┌─────────────────────────────────┐
│ 企业内网 │
│ ┌─────────┐ ┌─────────┐ │
│ │ 私有云 │ │ 传统IDC │ │
│ │ (OpenStack)│ │ │
│ └────┬────┘ └────┬────┘ │
└─────────┼───────────┼──────────┘
│ │
└─────┬─────┘
│
┌─────▼─────┐
│ 专线/VPN │
└─────┬─────┘
│
┌─────────┼─────────┐
│ │ │
┌─────▼───┐ ┌───▼───┐ ┌───▼───┐
│ 阿里云 │ │ 腾讯云 │ │ AWS │
│ (公有云) │ │ │ │ │
└─────────┘ └───────┘ └───────┘
特点:
- 核心数据在私有云
- 弹性扩展用公有云
- 专线连接保证安全
- 统一管理和调度
10. 云原生网络¶
10.1 容器网络接口(CNI)¶
CNI(Container Network Interface):
┌─────────────────────────────────┐
│ Kubernetes集群 │
│ ┌─────────────────────────┐ │
│ │ Master节点 │ │
│ │ ┌─────────────────┐ │ │
│ │ │ API Server │ │ │
│ │ └────────┬────────┘ │ │
│ │ │ │ │
│ │ ┌────────▼────────┐ │ │
│ │ │ CNI插件 │ │ │
│ │ │ (Flannel/Calico) │ │ │
│ │ └────────┬────────┘ │ │
│ └────────────┼─────────────┘ │
│ │ │
│ ┌───────┴───────┐ │
│ │ │ │
│ ┌────▼────┐ ┌────▼────┐ │
│ │ Worker1 │ │ Worker2 │ │
│ │ ┌─────┐ │ │ ┌─────┐ │ │
│ │ │Pod1 │ │ │ │Pod3 │ │ │
│ │ │Pod2 │ │ │ │Pod4 │ │ │
│ │ └─────┘ │ │ └─────┘ │ │
│ └─────────┘ └─────────┘ │
└─────────────────────────────────┘
主流CNI插件对比:
| 特性 | Flannel | Calico | Cilium | Weave |
|------|---------|--------|--------|-------|
| 网络模型 | Overlay | BGP | eBPF | Mesh |
| 性能 | 中等 | 高 | 极高 | 中等 |
| 网络策略 | 不支持 | 支持 | 支持 | 支持 |
| 加密 | 不支持 | 可选 | 支持 | 支持 |
| 复杂度 | 简单 | 中等 | 中等 | 简单 |
| 适用场景 | 小型集群 | 生产环境 | 安全敏感 | 快速部署 |
10.2 Service Mesh¶
Service Mesh(服务网格):
传统微服务通信:
服务A ──HTTP/gRPC──→ 服务B
↓ ↓
需要处理:重试、超时、熔断、监控、认证...
Service Mesh架构:
服务A ──Sidecar──→ Sidecar ──→ 服务B
(Envoy) (Envoy)
↓ ↓
统一控制平面(Istio/Linkerd)
Istio核心组件:
┌─────────────────────────────────┐
│ 控制平面(Control Plane) │
│ ┌─────────┐ ┌─────────┐ │
│ │ Pilot │ │ Citadel │ │
│ │(服务发现)│ │(安全) │ │
│ └─────────┘ └─────────┘ │
│ ┌─────────┐ ┌─────────┐ │
│ │ Mixer │ │ Galley │ │
│ │(策略) │ │(配置) │ │
│ └─────────┘ └─────────┘ │
└─────────────────────────────────┘
│
│ xDS协议
│
┌─────────────────────────────────┐
│ 数据平面(Data Plane) │
│ Pod1 Pod2 Pod3 │
│ ┌───┐ ┌───┐ ┌───┐ │
│ │App│ │App│ │App│ │
│ └─┬─┘ └─┬─┘ └─┬─┘ │
│ ┌─▼───┐ ┌─▼───┐ ┌─▼───┐ │
│ │Envoy│ │Envoy│ │Envoy│ │
│ │代理 │ │代理 │ │代理 │ │
│ └──┬──┘ └──┬──┘ └──┬──┘ │
│ └─────────┴─────────┘ │
│ 服务间通信 │
└─────────────────────────────────┘
Service Mesh优势:
- 服务发现:自动发现服务实例
- 负载均衡:智能流量分发
- 流量控制:金丝雀发布、蓝绿部署
- 安全通信:mTLS自动加密
- 可观测性:统一监控和追踪
10.3 云原生网络最佳实践¶
# Kubernetes网络策略示例
apiVersion: networking.k8s.io/v1 # apiVersion指定K8s API版本
kind: NetworkPolicy # kind指定资源类型
metadata:
name: api-allow
namespace: production
spec: # spec定义资源的期望状态
podSelector:
matchLabels:
app: api-service
policyTypes:
- Ingress
- Egress
ingress:
# 只允许frontend访问
- from:
- podSelector:
matchLabels:
app: frontend
ports:
- protocol: TCP
port: 8080
egress:
# 只允许访问database
- to:
- podSelector:
matchLabels:
app: database
ports:
- protocol: TCP
port: 5432
恭喜你完成了云服务和CDN的学习! 🎉
现在你已经掌握了: - ☁️ 云服务的基础知识 - 📦 OSS的使用方法 - 🌐 CDN的配置技巧 - 💰 成本优化策略 - 🔀 多云架构设计 - 🚀 云原生网络技术
继续加油,探索更多云计算的奥秘! 🚀