跳转至

06 - 云服务与CDN

云服务与CDN

本章核心: 掌握云服务基础,熟练使用OSS和CDN加速静态资源访问


📖 章节导航

前序章节: 01-网络基础.md02-域名与DNS.md 后续章节: 07-Docker网络.md08-实战应用场景.md 快速参考: 网络工具箱.md 第1章 故障排查: 故障排查手册.md 第2章


📚 目录

  1. 引言
  2. 云服务基础
  3. 对象存储(OSS)详解
  4. 阿里云OSS实战
  5. CDN(内容分发网络)
  6. CDN配置实战
  7. OSS与CDN结合使用
  8. 常见问题

1. 引言

🤔 为什么需要云服务和CDN?

想象一下,你开发了一个网站或应用,用户越来越多,问题也随之而来:

问题1:性能瓶颈

Text Only
用户 → 服务器(北京)
    响应慢!因为:
    - 距离远(广东用户访问北京服务器)
    - 带宽有限(1000人同时访问就卡顿)
    - 服务器压力大(CPU、内存不够用)

问题2:可靠性风险

Text Only
传统服务器:
┌─────────────────┐
│  单台服务器     │  ← 如果这台服务器坏了,整个网站就挂了
│  └─ 硬盘坏了    │
│  └─ 网络断了    │
│  └─ 停电了      │
└─────────────────┘

问题3:成本高昂

Text Only
自己建服务器:
✗ 购买服务器硬件(几万到几十万)
✗ 租用机房(每月几千到几万)
✗ 配置维护(需要专业人员)
✗ 扩容困难(用户多了就要买新服务器)

✨ 云服务和CDN的解决方案

Text Only
云服务 + CDN:
用户(广东) → CDN节点(广州) → 直接返回内容 ✓
              (缓存了内容)

用户(上海) → CDN节点(上海) → 直接返回内容 ✓
              (缓存了内容)

用户(北京) → CDN节点(北京) → 没有缓存 → 云服务器 → 返回内容
                                        缓存到节点

核心优势: - 🚀 性能提升:用户访问就近节点,延迟降低 - 🛡️ 高可靠性:云服务自动容灾,CDN多节点冗余 - 💰 成本优化:按需付费,无需前期投入 - 📈 弹性扩展:用户多了自动扩容,少了自动缩容


2. 云服务基础

📖 什么是云计算?

简单理解:云计算就是把计算资源(服务器、存储、数据库等)放到云端,像水电一样按需使用。

Text Only
传统模式 vs 云计算模式:

传统模式:
公司 → 买服务器 → 安装软件 → 维护 → 扩容困难

云计算模式:
公司 → 租用云服务 → 直接使用 → 自动维护 → 弹性扩容

☁️ 云计算的三种服务类型

1️⃣ IaaS(基础设施即服务)

定义:提供基础的计算、存储、网络资源

Text Only
IaaS 提供什么?
┌─────────────────────────────────┐
│  虚拟机(ECS)                   │
│  存储(OSS、EBS)                │
│  网络(VPC、负载均衡)           │
│  数据库(RDS)                   │
└─────────────────────────────────┘
    你需要自己:
    - 安装操作系统
    - 安装软件环境
    - 开发应用程序

    例子:阿里云ECS、腾讯云CVM

2️⃣ PaaS(平台即服务)

定义:提供开发平台和运行环境

Text Only
PaaS 提供什么?
┌─────────────────────────────────┐
│  应用运行环境                    │
│  数据库服务                      │
│  缓存服务                        │
│  消息队列                        │
└─────────────────────────────────┘
    你只需要:
    - 上传代码
    - 配置参数

    例子:阿里云函数计算、腾讯云SCF

3️⃣ SaaS(软件即服务)

定义:提供完整的软件应用

Text Only
SaaS 提供什么?
┌─────────────────────────────────┐
│  完整的软件应用                  │
│  直接使用,无需开发              │
└─────────────────────────────────┘
    你只需要:
    - 注册账号
    - 使用软件

    例子:阿里云邮箱、腾讯文档

对比总结:

类型 你需要管理 云服务商管理 自由度 使用难度
IaaS 操作系统、应用、数据 硬件、虚拟化
PaaS 应用、数据 操作系统、运行环境
SaaS 所有 最低

🏢 国内主流云服务商对比

阿里云

优势: - 🥇 市场份额第一,生态最完善 - 🌐 全球节点最多(200+) - 📦 产品线最丰富 - 🛠️ 文档和社区支持最好

核心产品: - ECS(云服务器) - OSS(对象存储) - RDS(云数据库) - CDN(内容分发网络)

适合场景: - 大型企业 - 电商网站 - 全球业务

腾讯云

优势: - 🎮 游戏行业经验丰富 - 💬 社交生态整合(微信、QQ) - 📱 移动端服务优秀 - 💰 价格相对便宜

核心产品: - CVM(云服务器) - COS(对象存储) - MySQL/TDSQL(云数据库)

适合场景: - 游戏开发 - 社交应用 - 中小企业

华为云

优势: - 🔒 安全性高(政企首选) - 🏭 企业级服务强 - 🌐 国际化程度高 - 🤖 AI服务丰富

核心产品: - ECS(弹性云服务器) - OBS(对象存储服务) - GaussDB(云数据库)

适合场景: - 政府机构 - 大型企业 - 对安全要求高的场景

百度云

优势: - 🔍 AI能力强 - 📊 大数据分析优秀 - 🚀 智能云服务 - 💡 技术创新快

核心产品: - BCC(云服务器) - BOS(对象存储) - 云数据库

适合场景: - AI应用 - 大数据分析 - 智能化项目

💡 云服务的核心优势

1️⃣ 弹性伸缩

Text Only
传统服务器:
固定配置 → 用户多了不够用 → 需要购买新服务器 → 耗时几天

云服务:
自动伸缩 → 用户多了自动扩容 → 几分钟完成
         → 用户少了自动缩容 → 节省成本

时间轴:
00:00   10:00   20:00   30:00   40:00
   ↓       ↓       ↓       ↓       ↓
  1台    5台     10台    5台     1台
(自动根据流量调整)

2️⃣ 高可靠性

Text Only
云服务的容灾机制:

主数据中心 ────────┐
                 │ → 用户访问
备数据中心 ────────┘(主数据中心故障时自动切换)

数据多副本:
原始数据 → 复制1 → 复制2 → 复制3
(一个坏了,其他还能用)

3️⃣ 成本优化

Text Only
传统服务器成本:
购买服务器:50000元(一次性)
机房租金:5000元/月
维护成本:3000元/月
扩容成本:每次需要购买新服务器

云服务成本:
按需付费:0.1元/小时
流量费用:0.5元/GB
存储费用:0.12元/GB/月
弹性计费:用多少付多少

对比:
传统模式:前期投入大,资源浪费
云服务模式:前期零投入,按需付费

3. 对象存储(OSS)详解

📦 什么是OSS?

OSS(Object Storage Service):对象存储服务

简单理解:就像一个超级大的网盘,可以存储任何类型的文件(图片、视频、文档等),并且可以通过API访问。

Text Only
传统文件系统 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(存储空间)

定义:存储对象的容器,类似于文件夹

Text Only
Bucket的特点:
┌─────────────────────────────────┐
│  Bucket名称(全局唯一)          │
│  ├─ 存储区域(北京、上海等)     │
│  ├─ 访问权限(公共读、私有)     │
│  └─ 存储类型(标准、低频、归档) │
└─────────────────────────────────┘
    存储对象(文件)

命名规则: - 只能包含小写字母、数字、短横线(-) - 长度:3-63个字符 - 必须全局唯一(整个阿里云内不能重复) - 不能以短横线开头或结尾

示例:

Text Only
✅ 正确的Bucket名称:
- my-bucket-123
- myapp-storage
- test-bucket

❌ 错误的Bucket名称:
- MyBucket(包含大写字母)
- my_bucket(包含下划线)
- -bucket(以短横线开头)
- bucket-(以短横线结尾)

2️⃣ Object(对象)

定义:OSS中存储的基本单元,就是文件

Text Only
Object的结构:
┌─────────────────────────────────┐
│  Key(对象键)                   │
│  ├─ 类似于文件路径               │
│  └─ 示例:photos/image.jpg       │
├─────────────────────────────────┤
│  Value(对象值)                 │
│  ├─ 文件的实际内容               │
│  └─ 可以是任何类型               │
├─────────────────────────────────┤
│  Metadata(元数据)              │
│  ├─ Content-Type(文件类型)     │
│  ├- Content-Length(文件大小)   │
│  ├- Last-Modified(最后修改时间) │
│  └- 自定义元数据                 │
└─────────────────────────────────┘

Key的设计建议:

Text Only
好的Key设计:
photos/2024/01/image.jpg
videos/tutorial/part1.mp4
documents/report.pdf

不好的Key设计:
image.jpg(没有分类)
photo_image_2024_01_01.jpg(命名太长)

3️⃣ AccessKey(访问密钥)

定义:用于身份验证的密钥对

Text Only
AccessKey组成:
┌─────────────────────────────────┐
│  AccessKey ID                    │
│  ├─ 类似于用户名                 │
│  └─ 示例:LTAI5t1234567890abc   │
├─────────────────────────────────┤
│  AccessKey Secret                │
│  ├─ 类似于密码                   │
│  └─ 示例:abc123def456...       │
└─────────────────────────────────┘

使用方式:
API请求 + AccessKey ID + AccessKey Secret
    服务器验证身份
    允许访问

安全提示: - ⚠️ AccessKey Secret非常重要,不要泄露 - 🔐 建议使用RAM子账号,不要使用主账号 - 🔄 定期轮换AccessKey - 📝 记录AccessKey的使用情况

🎯 OSS的应用场景

1️⃣ 图片存储

Text Only
场景:用户上传头像、商品图片

传统方式:
用户 → 服务器 → 保存到服务器磁盘
    问题:
    - 服务器磁盘满了怎么办?
    - 备份麻烦
    - 访问速度慢

OSS方式:
用户 → 服务器 → 上传到OSS
    优势:
    - 无限存储空间
    - 自动备份
    - 可以配置CDN加速
    - 可以做图片处理(缩放、裁剪)

2️⃣ 文件下载

Text Only
场景:软件安装包、文档下载

传统方式:
用户 → 服务器 → 下载文件
    问题:
    - 服务器带宽压力大
    - 下载速度慢
    - 并发限制

OSS方式:
用户 → OSS → 下载文件
    优势:
    - 带宽无限
    - 下载速度快
    - 支持断点续传
    - 可以配置CDN加速

3️⃣ 静态网站托管

Text Only
场景:个人博客、文档网站

传统方式:
购买服务器 → 配置Nginx → 上传HTML文件
    问题:
    - 需要维护服务器
    - 成本高

OSS方式:
创建Bucket → 开启静态网站托管 → 上传HTML文件
    优势:
    - 无需服务器
    - 成本低
    - 自动HTTPS
    - 可以配置CDN加速

4️⃣ 视频点播

Text Only
场景:在线视频课程、短视频平台

传统方式:
用户 → 服务器 → 播放视频
    问题:
    - 视频文件大
    - 播放卡顿
    - 服务器压力大

OSS方式:
用户 → OSS + CDN → 播放视频
    优势:
    - 视频存储在OSS
    - CDN加速播放
    - 支持多种格式
    - 可以做视频转码

📊 OSS与传统文件系统的区别

特性 传统文件系统 OSS
存储结构 层级目录结构 扁平key-value结构
访问方式 文件系统API HTTP REST API
容量限制 受限于磁盘容量 理论上无限
扩展性 需要手动扩容 自动弹性扩展
可靠性 单点故障风险 多副本容灾
访问速度 受限于服务器带宽 可配置CDN加速
成本 固定成本 按需付费
适用场景 本地文件管理 云端存储和分发

4. 阿里云OSS实战

🎯 实战目标

通过本节学习,你将能够: - ✅ 创建OSS Bucket - ✅ 配置访问权限 - ✅ 上传和下载文件 - ✅ 配置自定义域名和HTTPS - ✅ 使用Python SDK操作OSS

📋 前置准备

  1. 注册阿里云账号:https://www.aliyun.com
  2. 完成实名认证
  3. 开通OSS服务
  4. 创建AccessKey

🚀 步骤1:创建OSS Bucket

通过控制台创建

Text Only
操作步骤:

1. 登录阿里云控制台
   https://oss.console.aliyun.com

2. 点击"创建Bucket"

3. 填写Bucket信息:
   ┌─────────────────────────────────┐
   │  Bucket名称:my-first-bucket    │
   │  (全局唯一,只能小写字母、数字、-)│
   ├─────────────────────────────────┤
   │  地域:华东1(杭州)            │
   │  (选择离用户近的地域)          │
   ├─────────────────────────────────┤
   │  存储类型:标准存储              │
   │  (标准存储:适合频繁访问)      │
   │  (低频访问:适合不常访问)      │
   │  (归档存储:适合长期保存)      │
   ├─────────────────────────────────┤
   │  读写权限:私有                  │
   │  (私有:需要授权才能访问)      │
   │  (公共读:任何人可读,只有你可写)│
   │  (公共读写:不推荐)            │
   └─────────────────────────────────┘

4. 点击"确定"创建

存储类型选择建议:

存储类型 适合场景 价格 访问延迟
标准存储 频繁访问的文件 较高
低频访问 不常访问的文件 中等 中等
归档存储 长期保存的文件 最低 高(需要解冻)

🔐 步骤2:配置访问权限

设置Bucket权限

Text Only
控制台操作:

1. 进入Bucket详情页
2. 点击"权限管理"
3. 选择"Bucket授权策略"

权限类型:
┌─────────────────────────────────┐
│  私有(推荐)                    │
│  - 只有授权用户可以访问          │
│  - 安全性最高                    │
├─────────────────────────────────┤
│  公共读                          │
│  - 任何人可以读取                │
│  - 只有你可以写入                │
│  - 适合图片、视频等静态资源      │
├─────────────────────────────────┤
│  公共读写(不推荐)              │
│  - 任何人都可以读写              │
│  - 安全风险高                    │
└─────────────────────────────────┘

设置跨域配置(CORS)

Text Only
场景:前端通过AJAX访问OSS

配置步骤:
1. 进入Bucket详情页
2. 点击"数据安全" → "跨域设置"
3. 点击"创建规则"

配置示例:
┌─────────────────────────────────┐
│  来源:*                        │
│  (或指定域名:https://example.com)│
├─────────────────────────────────┤
│  允许Methods:GET, POST, PUT    │
├─────────────────────────────────┤
│  允许Headers:*                 │
├─────────────────────────────────┤
│  暴露Headers:ETag              │
├─────────────────────────────────┤
│  缓存时间:600                   │
└─────────────────────────────────┘

📤 步骤3:上传和下载文件

方式1:通过控制台上传

Text Only
操作步骤:

1. 进入Bucket详情页
2. 点击"文件管理"
3. 点击"上传文件"
4. 选择要上传的文件
5. 点击"上传"

上传选项:
┌─────────────────────────────────┐
│  文件目录:photos/               │
│  (可以指定上传到哪个目录)       │
├─────────────────────────────────┤
│  文件ACL:继承Bucket             │
│  (或单独设置权限)              │
├─────────────────────────────────┤
│  上传回调:可选                  │
│  (上传成功后通知服务器)         │
└─────────────────────────────────┘

方式2:通过命令行工具(ossutil)

Text Only
安装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:

Bash
pip install oss2

完整示例代码:

Python
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

配置自定义域名

Text Only
场景:
- 原始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

Text Only
配置步骤:

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:设置生命周期规则

Text Only
场景:自动清理过期文件,节省成本

配置步骤:

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):内容分发网络

简单理解:把你的内容复制到全国/全球各地的服务器上,用户访问时自动连接最近的服务器,速度更快。

Text Only
没有CDN:
用户(广东) → 服务器(北京)
            距离远、速度慢

有CDN:
用户(广东) → CDN节点(广州)✓ 快速返回
用户(上海) → CDN节点(上海)✓ 快速返回
用户(北京) → CDN节点(北京)✓ 快速返回

🔍 CDN的工作原理

Text Only
CDN工作流程图:

第1次访问:
用户 → CDN节点(广州)
    检查缓存:没有
    回源:向源站(OSS/服务器)请求
    源站返回内容
    CDN节点缓存内容
    返回给用户

第2次访问:
用户 → CDN节点(广州)
    检查缓存:有 ✓
    直接返回给用户(不需要回源)

ASCII图示:

Text Only
                    ┌─────────────────┐
                    │     源站        │
                    │   (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部署在世界各地的服务器

Text Only
节点类型:
┌─────────────────────────────────┐
│  边缘节点                        │
│  - 距离用户最近                  │
│  - 数量最多                      │
│  - 缓存静态资源                  │
├─────────────────────────────────┤
│  区域节点                        │
│  - 覆盖一个区域                  │
│  - 作为边缘节点的上级            │
│  - 缓存热点内容                  │
├─────────────────────────────────┤
│  中心节点                        │
│  - 数量最少                      │
│  - 负责回源                      │
│  - 缓存最热门的内容              │
└─────────────────────────────────┘

2️⃣ 缓存(Cache)

定义:CDN节点存储的副本内容

Text Only
缓存策略:
┌─────────────────────────────────┐
│  缓存时间                        │
│  - 短缓存:1分钟(动态内容)     │
│  - 中缓存:1小时(普通静态资源) │
│  - 长缓存:1天(不常更新的资源) │
├─────────────────────────────────┤
│  缓存规则                        │
│  - 按文件类型:.jpg缓存1天       │
│  - 按目录:/static/缓存1小时     │
│  - 按URL参数:忽略或包含参数     │
├─────────────────────────────────┤
│  缓存更新                        │
│  - 主动刷新:手动清除缓存        │
│  - 过期自动更新:缓存时间到了    │
│  - 预热:提前加载到节点          │
└─────────────────────────────────┘

3️⃣ 回源(Origin Pull)

定义:CDN节点从源站获取内容的过程

Text Only
回源流程:
CDN节点 → 检查缓存 → 没有缓存
              回源请求
              源站(OSS)
              返回内容
              CDN节点缓存
              返回给用户

回源类型:
┌─────────────────────────────────┐
│  协议回源                        │
│  - HTTP回源                      │
│  - HTTPS回源                     │
├─────────────────────────────────┤
│  权限回源                        │
│  - 公共回源                      │
│  - 私有回源(需要鉴权)          │
├─────────────────────────────────┤
│  条件回源                        │
│  - 404回源                      │
│  - 5xx回源                      │
└─────────────────────────────────┘

🌟 CDN的应用场景

1️⃣ 静态资源加速

Text Only
场景:网站图片、CSS、JS文件

加速效果:
没有CDN:
加载时间:5秒
用户体验:差

有CDN:
加载时间:1秒
用户体验:好 ✓

加速的资源:
- 图片:.jpg, .png, .gif, .webp
- 样式:.css
- 脚本:.js
- 字体:.woff, .ttf
- 媒体:.mp4, .mp3

2️⃣ 视频点播

Text Only
场景:在线视频网站

问题:
- 视频文件大(几百MB到几GB)
- 用户多时服务器压力大
- 播放卡顿

CDN解决方案:
视频 → OSS → CDN → 用户
    优势:
    - 就近访问,播放流畅
    - 支持断点续传
    - 支持多种格式
    - 自动转码

3️⃣ 直播

Text Only
场景:直播平台

直播流程:
主播 → 推流服务器 → CDN节点 → 观众
                  实时分发

CDN优势:
- 低延迟(1-3秒)
- 高并发(支持百万观众)
- 全球覆盖
- 自动切换节点

4️⃣ 下载加速

Text Only
场景:软件下载、文件分享

CDN优势:
- 多线程下载
- 断点续传
- 下载速度快
- 节省带宽成本

6. CDN配置实战

🎯 实战目标

通过本节学习,你将能够: - ✅ 添加CDN加速域名 - ✅ 配置CNAME解析 - ✅ 设置缓存规则 - ✅ 配置HTTPS - ✅ 刷新和预热缓存

🚀 步骤1:添加加速域名

Text Only
操作步骤:

1. 登录阿里云CDN控制台
   https://cdn.console.aliyun.com

2. 点击"添加域名"

3. 填写域名信息:
   ┌─────────────────────────────────┐
   │  加速域名:cdn.example.com      │
   │  (你的自定义域名)              │
   ├─────────────────────────────────┤
   │  业务类型:图片小文件            │
   │  (图片小文件、大文件下载、视频点播)│
   ├─────────────────────────────────┤
   │  源站类型:OSS域名              │
   │  (IP地址、域名、OSS)          │
   ├─────────────────────────────────┤
   │  源站地址:my-bucket.oss-cn-... │
   │  (你的OSS域名)                │
   ├─────────────────────────────────┤
   │  加速区域:中国大陆             │
   │  (中国大陆、全球、仅海外)      │
   └─────────────────────────────────┘

4. 点击"下一步"完成配置

业务类型选择建议:

业务类型 适合场景 特点
图片小文件 网站、APP 频繁访问的小文件
大文件下载 软件下载 文件较大,访问频率低
视频点播 在线视频 支持视频优化
直播流媒体 直播平台 低延迟,高并发

🔗 步骤2:配置CNAME解析

Text Only
什么是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配置示例:

Text Only
域名: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:缓存配置

Text Only
配置步骤:

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接口 不缓存 实时数据

高级缓存配置:

Text Only
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配置

Text Only
配置步骤:

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:刷新和预热缓存

Text Only
刷新缓存:
场景:更新了文件,需要让CDN重新获取

操作步骤:
1. 进入CDN控制台
2. 点击"刷新预热"
3. 选择"刷新"

刷新类型:
┌─────────────────────────────────┐
│  URL刷新                        │
│  - 刷新单个URL                  │
│  - 示例:https://cdn.example.com/image.jpg │
│  - 适合:更新了少量文件          │
├─────────────────────────────────┤
│  目录刷新                        │
│  - 刷新整个目录                  │
│  - 示例:https://cdn.example.com/photos/ │
│  - 适合:更新了多个文件          │
└─────────────────────────────────┘

刷新频率限制:
- 每个账号每天最多刷新2000次
- 每次最多刷新1000个URL
- 每次最多刷新100个目录
Text Only
预热缓存:
场景:提前把文件加载到CDN节点

操作步骤:
1. 进入CDN控制台
2. 点击"刷新预热"
3. 选择"预热"

预热配置:
┌─────────────────────────────────┐
│  URL:https://cdn.example.com/image.jpg │
│  (要预热的URL)                  │
├─────────────────────────────────┤
│  任务类型:URL预热               │
└─────────────────────────────────┘

预热频率限制:
- 每个账号每天最多预热500次
- 每次最多预热1000个URL

预热场景:
- 新网站上线
- 大促活动前
- 热门内容发布前

Python SDK操作CDN缓存:

Python
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组合?

Text Only
单独使用OSS:
用户 → OSS → 返回内容
    问题:
    - 距离远,速度慢
    - 带宽费用高
    - 并发能力有限

单独使用CDN:
用户 → CDN → 源站(服务器)→ 返回内容
          问题:
          - 源站压力大
          - 需要维护服务器

OSS + CDN:
用户 → CDN → OSS → 返回内容
          CDN缓存
          下次直接返回

优势:
✓ OSS:无限存储,自动备份
✓ CDN:就近访问,速度快
✓ 成本:按需付费,节省带宽
✓ 维护:无需管理服务器

⚙️ 配置OSS作为CDN的源站

Text Only
配置步骤:

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

配置检查清单:

Text Only
✓ OSS Bucket已创建
✓ OSS权限已配置(公共读或私有)
✓ CDN域名已添加
✓ CNAME已解析
✓ 缓存规则已配置
✓ HTTPS已配置
✓ 测试访问正常

📊 访问流程图

Text Only
完整访问流程:

第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图示:

Text Only
                    ┌─────────────────┐
                    │      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️⃣ 选择合适的存储类型

Text Only
OSS存储类型对比:

标准存储:
- 价格:0.12元/GB/月
- 适合:频繁访问的文件
- 示例:网站图片、视频

低频访问存储:
- 价格:0.08元/GB/月
- 适合:不常访问的文件
- 示例:备份文件、历史数据
- 注意:有最低存储时间(30天)

归档存储:
- 价格:0.033元/GB/月
- 适合:长期保存的文件
- 示例:日志归档、合规数据
- 注意:需要解冻才能访问(1-5分钟)

冷归档存储:
- 价格:0.015元/GB/月
- 适合:极少访问的文件
- 示例:历史档案
- 注意:解冻需要1-12小时

2️⃣ 合理设置缓存时间

Text Only
缓存时间优化:

短缓存(1-5分钟):
- 适合:动态内容
- 优点:内容更新快
- 缺点:回源频繁,成本高

中缓存(1小时):
- 适合:可能更新的内容
- 优点:平衡更新和成本
- 缺点:更新有延迟

长缓存(1天以上):
- 适合:不常更新的内容
- 优点:回源少,成本低
- 缺点:更新慢

建议:
- 图片、视频:1天
- CSS、JS:1小时
- HTML:不缓存
- API:不缓存

3️⃣ 使用生命周期规则

Text Only
自动转换存储类型:

规则示例:
┌─────────────────────────────────┐
│  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节省带宽

Text Only
带宽费用对比:

直接访问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️⃣ 使用预留资源包

Text Only
OSS资源包:
- 标准存储包:0.09元/GB/月(比按量便宜25%)
- 低频访问包:0.06元/GB/月(比按量便宜25%)
- 回源流量包:0.12元/GB(比按量便宜20%)

CDN资源包:
- 流量包:0.18元/GB(比按量便宜25%)
- 请求次数包:适合高并发场景

购买建议:
- 根据历史使用量购买
- 大包更便宜
- 注意有效期

8. 常见问题

❓ 问题1:OSS和CDN的区别

回答:

Text Only
OSS vs CDN 对比:

OSS(对象存储):
┌─────────────────────────────────┐
│  功能:存储文件                  │
│  作用:云端硬盘                  │
│  特点:                          │
│  - 无限存储空间                  │
│  - 自动备份                      │
│  - 提供API访问                   │
│  - 可以托管静态网站              │
└─────────────────────────────────┘

CDN(内容分发):
┌─────────────────────────────────┐
│  功能:加速访问                  │
│  作用:全球缓存                  │
│  特点:                          │
│  - 就近访问                      │
│  - 减少延迟                      │
│  - 节省带宽                      │
│  - 提升并发                      │
└─────────────────────────────────┘

关系:
OSS + CDN = 最佳组合
OSS负责存储,CDN负责加速

比喻:
OSS = 仓库(存放货物)
CDN = 连锁店(就近销售)

❓ 问题2:如何选择合适的存储类型?

回答:

Text Only
选择存储类型的决策树:

文件访问频率?
├─ 高(每天多次)
│  └─ 标准存储 ✓
│     价格:0.12元/GB/月
│     示例:网站图片、视频
├─ 中(每周几次)
│  └─ 低频访问存储 ✓
│     价格:0.08元/GB/月
│     示例:备份文件、历史数据
└─ 低(每月几次或更少)
   └─ 归档存储 ✓
      价格:0.033元/GB/月
      示例:日志归档、合规数据

特殊情况:
- 临时文件:标准存储 + 生命周期规则
- 重要数据:标准存储 + 跨区域复制
- 合规数据:归档存储 + 合规保留

实际案例:

Text Only
案例1:电商网站
商品图片:标准存储(频繁访问)
用户头像:标准存储(频繁访问)
订单数据:低频访问(偶尔查询)
历史订单:归档存储(长期保存)

案例2:视频网站
热门视频:标准存储(频繁播放)
普通视频:低频访问(偶尔播放)
冷门视频:归档存储(很少播放)

案例3:日志系统
实时日志:标准存储(需要查询)
7天前日志:低频访问(偶尔查询)
30天前日志:归档存储(合规保存)

❓ 问题3:CDN缓存不生效怎么办?

回答:

Text Only
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检查

排查工具:

Bash
# 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的使用情况?

回答:

Text Only
监控OSS使用情况:

1. 控制台监控
   - 登录OSS控制台
   - 点击"监控"
   - 查看实时监控数据:
     * 存储用量
     * 请求次数
     * 流量
     * 延迟

2. 配置告警
   - 点击"告警"
   - 创建告警规则:
     * 存储用量超过阈值
     * 请求次数异常
     * 错误率过高
   - 配置通知方式:
     * 短信
     * 邮件
     * 钉钉
Text Only
监控CDN使用情况:

1. 控制台监控
   - 登录CDN控制台
   - 点击"监控"
   - 查看实时监控数据:
     * 流量
     * 带宽
     * 请求数
     * 命中率
     * 回源流量

2. 配置告警
   - 点击"告警"
   - 创建告警规则:
     * 流量超过阈值
     * 带宽超过阈值
     * 命中率过低
     * 错误率过高

3. 查看日志
   - 点击"日志服务"
   - 下载访问日志
   - 分析访问情况

Python SDK监控示例:

Python
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数据安全?

回答:

Text Only
OSS数据安全措施:

1. 访问控制
   - 使用RAM子账号,不要使用主账号
   - 设置最小权限原则
   - 定期轮换AccessKey
   - 使用STS临时凭证

2. 数据加密
   - 服务器端加密(SSE)
   - 客户端加密
   - 传输加密(HTTPS)

3. 数据备份
   - 开启版本控制
   - 配置跨区域复制
   - 定期备份到其他存储

4. 安全策略
   - 设置防盗链
   - 配置IP白名单
   - 设置Referer白名单

5. 审计日志
   - 开启访问日志
   - 配置日志分析
   - 监控异常访问

版本控制配置:

Text Only
配置步骤:
1. 进入Bucket详情
2. 点击"数据安全" → "版本控制"
3. 开启版本控制

版本控制作用:
- 防止误删除
- 可以恢复历史版本
- 追溯文件变更

成本:
- 每个版本都会收费
- 建议设置生命周期规则,自动清理旧版本

❓ 问题6:CDN和OSS如何处理HTTPS?

回答:

Text Only
HTTPS配置方案:

方案1:OSS + CDN都配置HTTPS
┌─────────────────────────────────┐
│  用户 → HTTPS → CDN → HTTPS → OSS │
│  (全程加密)                    │
│  优点:安全性最高                │
│  缺点:配置复杂                  │
└─────────────────────────────────┘

方案2:CDN配置HTTPS,OSS使用HTTP
┌─────────────────────────────────┐
│  用户 → HTTPS → CDN → HTTP → OSS │
│  (部分加密)                    │
│  优点:配置简单                  │
│  缺点:CDN到OSS不加密            │
└─────────────────────────────────┘

推荐:方案1(全程加密)

证书配置:

Text Only
证书类型:
1. 免费证书
   - Let's Encrypt
   - 阿里云免费证书
   - 有效期:3个月-1年
   - 适合:个人网站、测试环境

2. 付费证书
   - DigiCert
   - GlobalSign
   - 有效期:1-2年
   - 适合:企业网站、生产环境

证书申请:
1. 生成CSR文件
2. 提交给CA机构
3. 验证域名所有权
4. 下载证书文件
5. 上传到CDN和OSS

📝 总结

🎯 核心要点

  1. 云服务:提供弹性、可靠、低成本的计算资源
  2. OSS:对象存储服务,适合云端存储和分发
  3. CDN:内容分发网络,提升访问速度
  4. OSS + CDN:最佳组合,存储+加速

🚀 实战技能

  • ✅ 创建和配置OSS Bucket
  • ✅ 使用Python SDK操作OSS
  • ✅ 配置CDN加速域名
  • ✅ 设置缓存规则和HTTPS
  • ✅ 优化成本和性能

📚 延伸学习

💡 下一步建议

  1. 实践:创建自己的OSS Bucket
  2. 实验:上传文件并配置CDN
  3. 优化:设置生命周期规则和缓存策略
  4. 监控:配置告警和日志分析

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 云厂商选择建议

Text Only
选择决策树:

预算敏感?
├─ 是 → 腾讯云(价格优势明显)
└─ 否 → 业务类型?
         ├─ 电商/企业应用 → 阿里云(生态完善)
         ├─ 游戏/社交 → 腾讯云(微信生态)
         ├─ 政企/安全 → 华为云(安全可靠)
         └─ 出海业务 → AWS(全球覆盖)

特殊需求?
├─ AI/ML → 阿里云PAI、华为云ModelArts
├─ 视频直播 → 腾讯云(音视频优势)
├─ 政企合规 → 华为云(国产化)
└─ 全球部署 → AWS、阿里云

9.3 多云架构设计

Text Only
多云架构模式:

模式1:主备模式
┌─────────────────────────────────┐
│           流量入口               │
│         (DNS负载均衡)          │
└──────────────┬──────────────────┘
      ┌────────┴────────┐
      │                 │
┌─────▼─────┐     ┌─────▼─────┐
│  阿里云    │     │  腾讯云    │
│  (主)      │     │  (备)      │
│  华东节点  │     │  华南节点  │
└───────────┘     └───────────┘

特点:
- 主云承载主要流量
- 备云用于容灾
- 数据实时同步
- 故障自动切换

模式2:多活模式
┌─────────────────────────────────┐
│           流量入口               │
│      (智能DNS/GSLB)            │
└──────────────┬──────────────────┘
      ┌────────┼────────┐
      │        │        │
┌─────▼───┐ ┌──▼───┐ ┌──▼───┐
│ 阿里云   │ │腾讯云 │ │华为云 │
│ 华北节点 │ │华东节点│ │华南节点│
└─────────┘ └──────┘ └──────┘

特点:
- 多云同时提供服务
- 就近访问
- 负载分担
- 互为备份

模式3:混合云模式
┌─────────────────────────────────┐
│           企业内网               │
│    ┌─────────┐ ┌─────────┐     │
│    │ 私有云   │ │ 传统IDC │     │
│    │ (OpenStack)│         │     │
│    └────┬────┘ └────┬────┘     │
└─────────┼───────────┼──────────┘
          │           │
          └─────┬─────┘
          ┌─────▼─────┐
          │   专线/VPN │
          └─────┬─────┘
      ┌─────────┼─────────┐
      │         │         │
┌─────▼───┐ ┌───▼───┐ ┌───▼───┐
│ 阿里云   │ │ 腾讯云 │ │ AWS   │
│ (公有云) │ │       │ │       │
└─────────┘ └───────┘ └───────┘

特点:
- 核心数据在私有云
- 弹性扩展用公有云
- 专线连接保证安全
- 统一管理和调度

10. 云原生网络

10.1 容器网络接口(CNI)

Text Only
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

Text Only
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 云原生网络最佳实践

YAML
# 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的配置技巧 - 💰 成本优化策略 - 🔀 多云架构设计 - 🚀 云原生网络技术

继续加油,探索更多云计算的奥秘! 🚀