跳到主要内容

阿里云 CDN 教程

CDN (Content Delivery Network,内容分发网络) 是一种分布式网络架构,通过将内容缓存到全球各地的边缘节点,加速用户访问,提升网站性能。

CDN 基础概念

什么是 CDN

CDN 通过智能调度系统,将用户的请求分配到最近的边缘节点,从而:

  • 🚀 加速内容访问速度
  • 📉 降低源站带宽压力
  • 🛡️ 提供 DDoS 防护
  • 🌍 改善全球访问体验

核心概念

  • 源站: 存储原始内容的服务器
  • 边缘节点: CDN 在各地部署的缓存服务器
  • 回源: 当边缘节点没有缓存时,向源站获取内容
  • 缓存: 将内容临时存储在边缘节点
  • 刷新: 清除边缘节点的缓存内容
  • 预热: 提前将内容推送到边缘节点

开通 CDN 服务

1. 前置准备

  1. 拥有阿里云账号
  2. 完成实名认证
  3. 域名已备案(中国大陆节点必需)
  4. 准备好源站服务器或 OSS

2. 开通步骤

  1. 登录 阿里云控制台
  2. 搜索 "CDN" 进入 CDN 控制台
  3. 点击 "立即开通"
  4. 选择计费方式:
    • 按流量计费(适合流量波动大的场景)
    • 按带宽计费(适合流量稳定的场景)
  5. 确认开通

添加加速域名

基础配置

  1. 进入 CDN 控制台
  2. 点击 "域名管理" → "添加域名"
  3. 填写配置信息:
加速域名: cdn.example.com
业务类型:
- 图片小文件:适用于网站、电商、游戏等
- 大文件下载:适用于软件、游戏安装包等
- 视音频点播:适用于音视频点播加速
- 全站加速:适用于动态内容或动静态混合场景
源站信息:
- IP 源站:直接填写服务器 IP
- OSS 域名:选择 OSS Bucket
- 源站域名:填写源站域名
端口: 80 / 443
加速区域:
- 仅中国大陆
- 全球(不含中国大陆)
- 全球

配置示例

配置静态网站加速

加速域名: static.example.com
业务类型: 图片小文件
源站类型: IP 源站
源站地址: 192.168.1.100
端口: 80
加速区域: 全球

配置 OSS 加速

加速域名: cdn.example.com
业务类型: 图片小文件
源站类型: OSS 域名
OSS Bucket: my-bucket.oss-cn-hangzhou.aliyuncs.com
端口: 80
加速区域: 仅中国大陆

HTTPS 配置

1. 上传证书

  1. 进入域名管理 → 选择域名 → HTTPS 配置
  2. 点击 "修改配置"
  3. 开启 "HTTPS 安全加速"
  4. 证书来源:
    • 免费证书:阿里云提供的免费 DV 证书
    • 云盾证书:已购买的 SSL 证书
    • 自定义上传:上传自己的证书

2. 上传自定义证书

证书名称: example.com
证书内容:
-----BEGIN CERTIFICATE-----
[证书内容]
-----END CERTIFICATE-----

私钥内容:
-----BEGIN RSA PRIVATE KEY-----
[私钥内容]
-----END RSA PRIVATE KEY-----

3. HTTPS 高级设置

HTTP/2: 开启 # 提升性能
强制跳转: HTTPS # HTTP 自动跳转到 HTTPS
TLS 版本: TLSv1.2 及以上
HSTS: 开启 # 增强安全性

缓存配置

缓存规则设置

  1. 进入域名管理 → 缓存配置 → 缓存过期时间
  2. 添加缓存规则

推荐配置

文件类型目录/文件过期时间优先级
HTML.html1 小时90
图片.jpg,.png,.gif,.webp7 天80
CSS/JS.css,.js7 天80
视频.mp4,.avi,.flv30 天70
字体.woff,.woff2,.ttf30 天70
其他/1 天60

配置示例

类型: 目录
路径: /static/images/
过期时间: 30 天
权重: 90

类型: 文件后缀
路径: jpg,png,gif,webp,svg
过期时间: 7 天
权重: 80

类型: 文件后缀
路径: css,js
过期时间: 3 天
权重: 80

类型: 文件后缀
路径: html,htm
过期时间: 10 分钟
权重: 90

忽略参数配置

对于带参数的 URL,可以配置是否忽略参数:

# 忽略所有参数(提高缓存命中率)
保留参数: 关闭

# 保留指定参数
保留参数: 开启
保留参数列表: version,lang

回源配置

回源 HOST

回源 HOST 类型:
- 加速域名: 使用 CDN 加速域名作为回源 HOST
- 源站域名: 使用源站域名作为回源 HOST
- 自定义域名: 自定义回源 HOST

回源协议

回源协议:
- HTTP: 仅使用 HTTP 回源
- HTTPS: 仅使用 HTTPS 回源
- 协议跟随: 跟随用户请求协议

回源请求头

添加自定义回源请求头:

X-Forwarded-For: $client_ip
X-Real-IP: $client_ip
X-CDN-Provider: Aliyun

访问控制

IP 黑白名单

# IP 白名单(仅允许指定 IP 访问)
类型: 白名单
IP 列表:
- 192.168.1.0/24
- 10.0.0.1

# IP 黑名单(禁止指定 IP 访问)
类型: 黑名单
IP 列表:
- 8.8.8.8
- 1.1.1.1

Referer 防盗链

防盗链类型: 白名单
允许空 Referer:
Referer 白名单:
- *.example.com
- example.com
- trusted-site.com

URL 鉴权

A 类型鉴权(推荐)

鉴权类型: A 类型
主 KEY: your-primary-key
备 KEY: your-backup-key
有效时间: 1800 秒

生成的 URL 格式:
http://cdn.example.com/path/file.jpg?auth_key=timestamp-rand-uid-md5hash

鉴权算法

import hashlib
import time
import random

def generate_auth_url(uri, key, expire_time=1800):
"""
生成阿里云 CDN A 类型鉴权 URL

:param uri: 资源路径,如 /path/file.jpg
:param key: 鉴权密钥
:param expire_time: 有效时间(秒)
:return: 完整的鉴权 URL
"""
# 生成过期时间戳
timestamp = int(time.time()) + expire_time

# 生成随机数
rand = random.randint(0, 100)

# UID(可选,默认为 0)
uid = 0

# 拼接字符串: uri-timestamp-rand-uid-key
sstring = f"{uri}-{timestamp}-{rand}-{uid}-{key}"

# 计算 MD5
md5hash = hashlib.md5(sstring.encode()).hexdigest()

# 生成鉴权参数
auth_key = f"{timestamp}-{rand}-{uid}-{md5hash}"

# 返回完整 URL
return f"{uri}?auth_key={auth_key}"

# 使用示例
url = generate_auth_url("/video/sample.mp4", "your-secret-key")
print(f"鉴权 URL: https://cdn.example.com{url}")

User-Agent 黑白名单

类型: 黑名单
User-Agent:
- *bot*
- *spider*
- *crawler*

性能优化

智能压缩

开启 Gzip 压缩,减少传输数据量:

智能压缩: 开启
压缩文件类型:
- text/html
- text/css
- text/javascript
- application/javascript
- application/json
- application/xml

页面优化

HTML 优化: 开启 # 删除注释、压缩空白
CSS 优化: 开启 # 压缩 CSS 文件
JavaScript 优化: 开启 # 压缩 JS 文件

Brotli 压缩

Brotli 压缩: 开启 # 比 Gzip 更高的压缩率

Range 回源

Range 回源: 开启 # 支持断点续传

刷新和预热

刷新缓存

URL 刷新

刷新类型: URL
URL 列表:
https://cdn.example.com/path/file.jpg
https://cdn.example.com/path/file2.jpg

说明: 每次最多 2000 个 URL,每天限额 2000 个

目录刷新

刷新类型: 目录
目录列表:
https://cdn.example.com/images/
https://cdn.example.com/css/

说明: 每次最多 100 个目录,每天限额 100 个

预热内容

URL 列表:
https://cdn.example.com/popular/video.mp4
https://cdn.example.com/popular/image.jpg

说明: 每次最多 500 个 URL,每天限额 500 个

使用 API 刷新

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.request import CommonRequest

def refresh_cdn_cache(urls):
"""
刷新 CDN 缓存

:param urls: URL 列表,用 \n 分隔
"""
# 创建 AcsClient 实例
client = AcsClient(
'your-access-key-id',
'your-access-key-secret',
'cn-hangzhou'
)

# 创建 request
request = CommonRequest()
request.set_accept_format('json')
request.set_domain('cdn.aliyuncs.com')
request.set_method('POST')
request.set_version('2018-05-10')
request.set_action_name('RefreshObjectCaches')

# 设置参数
request.add_query_param('ObjectPath', urls)
request.add_query_param('ObjectType', 'File')

# 发起请求
response = client.do_action_with_exception(request)
print(response)

# 使用示例
urls = """https://cdn.example.com/image1.jpg
https://cdn.example.com/image2.jpg"""

refresh_cdn_cache(urls)

DNS 解析配置

添加 CNAME 记录

  1. 在 CDN 控制台获取 CNAME 地址

    • 格式:xxx.xxx.com.w.kunlunsl.com
  2. 在域名 DNS 服务商处添加 CNAME 记录

阿里云 DNS 配置示例

记录类型: CNAME
主机记录: cdn
记录值: xxx.xxx.com.w.kunlunsl.com
解析线路: 默认
TTL: 10 分钟

验证 CNAME 配置

# Windows
nslookup cdn.example.com

# Linux / macOS
dig cdn.example.com

监控与统计

查看实时监控

  1. 进入 CDN 控制台 → 数据监控
  2. 查看指标:
    • 带宽
    • 流量
    • 请求次数
    • QPS
    • 命中率
    • 状态码分布

访问日志

开启日志服务

日志服务: 开启
存储位置: OSS Bucket
日志保存天数: 30 天

下载日志

  1. 进入日志管理
  2. 选择时间范围
  3. 下载日志文件

日志格式

[时间] [客户端IP] [域名] [请求URI] [HTTP状态码] [响应大小] [Referer] [User-Agent] [命中情况]

使用日志分析

# 统计访问最多的 URL
cat cdn.log | awk '{print $4}' | sort | uniq -c | sort -rn | head -20

# 统计状态码分布
cat cdn.log | awk '{print $5}' | sort | uniq -c

# 统计缓存命中率
cat cdn.log | grep "HIT" | wc -l
cat cdn.log | wc -l

常见问题

1. 缓存未生效

可能原因

  • 源站设置了 Cache-Control: no-cache
  • CDN 缓存规则未正确配置
  • 请求带有变化的参数

解决方案

# 检查源站响应头
Cache-Control: max-age=86400

# 设置 CDN 缓存规则
缓存时间: 1 天
忽略参数: 开启

2. HTTPS 证书错误

解决方案

  1. 检查证书是否过期
  2. 确认证书链完整
  3. 验证私钥与证书匹配

3. 回源失败

检查项

  • 源站是否正常
  • 安全组是否允许 CDN 回源 IP
  • 回源 HOST 是否正确
  • 源站端口是否开放

4. 访问速度慢

优化方案

  1. 开启智能压缩
  2. 优化缓存规则
  3. 启用 HTTP/2
  4. 预热热门内容

5. 流量异常

排查步骤

  1. 查看访问日志
  2. 检查 Referer
  3. 启用防盗链
  4. 设置 IP 黑名单

成本优化

1. 选择合适的计费方式

# 流量波动大
计费方式: 按流量

# 流量稳定
计费方式: 按带宽

2. 优化缓存策略

# 提高缓存命中率
静态资源缓存时间: 7-30 天
忽略 URL 参数: 开启

3. 使用资源包

  • 购买流量包或带宽包
  • 享受更优惠的价格

4. 清理无用域名

定期检查并删除不再使用的加速域名

最佳实践

1. 源站优化

# 启用 Gzip 压缩
gzip on;
gzip_types text/plain text/css application/json application/javascript;

# 设置合理的 Cache-Control
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 7d;
add_header Cache-Control "public, immutable";
}

2. 合理使用 CDN

✅ 适合 CDN 加速:
- 静态资源(图片、CSS、JS)
- 下载文件
- 视频点播
- 静态网页

❌ 不适合 CDN 加速:
- 实时性要求极高的内容
- 频繁更新的动态内容
- 需要实时鉴权的敏感内容

3. 安全配置

# 启用 HTTPS
HTTPS: 开启
强制跳转: HTTPS → HTTPS

# 防盗链
Referer 防盗链: 开启
URL 鉴权: 开启(重要资源)

# 访问控制
IP 黑名单: 配置恶意 IP
User-Agent 黑名单: 阻止爬虫

4. 监控告警

# 设置告警规则
带宽阈值: 超过 100 Mbps 告警
流量异常: 日流量增长超过 50% 告警
状态码异常: 5xx 错误率超过 5% 告警

参考资源