cdn 是什么?
内容分发网络,Content Delivery Network
介绍
CDN(Content Delivery Network)是一种将内容分发到靠近用户的边缘服务器,以加速访问速度、减少延迟、降低源站压力的网络系统。
CDN 把网站的静态资源(如 HTML、JS、CSS、图片、视频等)缓存在全球各地的边缘节点服务器上,用户访问内容时,不再请求源站服务器,而是就近从边缘节点获取资源,实现更快加载。
- 图片、视频、CSS、JS、网页
- 文件下载、直播流媒体、API 返回结果(某些场景下)
- 用户请求某个资源(如图片);
- CDN 检查边缘节点是否缓存该资源;
- ✅ 有缓存:直接返回,快速响应;
- ❌ 无缓存:从源站拉取,缓存到节点,再返回用户;
- 下一次访问时,就可以直接命中缓存。
✅ CDN 的优势
优势 | 描述 |
---|---|
🚀 提升访问速度 | 用户从“就近”节点加载内容,减少跨区域传输延迟 |
🔥 降低服务器压力 | 静态内容从 CDN 返回,源站只需处理动态内容或首次请求 |
🌎 支持全球加速 | 用户身处世界任何地方都可获得类似体验(特别适合海外业务) |
🛡️ 提升可用性 | 某节点宕机时可自动切换其他节点,提高业务稳定性 |
⚔️ 抗流量攻击 | 能吸收大量请求流量,减缓 DDoS、CC 攻击压力 |
💰 降低带宽成本 | 部分 CDN 服务提供按量计费,能减少源站出流量费用 |
📚 应用场景举例
场景 | 描述 |
---|---|
网站加速 | 静态网页、图片、视频 |
App 更新 | CDN 分发安装包,提升下载速度 |
视频直播 | CDN 流媒体边缘推流分发 |
电商秒杀 | 减轻源站压力,提升并发能力 |
API 接口缓存 | 针对频繁请求、可缓存的 GET 接口 |
CDN 是“加速器”,不存储源数据本身,它与对象存储(如腾讯 COS、阿里 OSS)常常一起搭配使用:
- COS 提供原始数据存储;
- CDN 分发这些数据到边缘节点;
- 组合后即可实现全球访问加速 + 自动缓存更新。
cdn 文件响应头
这里 以腾讯云cos 和 jsdeliver 为例
jsDelivr cdn
jsDelivr 提供 全球加速的静态资源访问服务。
jsDelivr 会将这个文件:
- 首次请求:从 GitHub 拉取源文件;
- 后续请求:自动缓存到全球 CDN 节点;
- 用户访问时:从离用户最近的边缘节点返回,加快加载速度。
以这个jsDelivr链接为例:
curl 'https://cdn.jsdelivr.net/gh/jacinli/image-hosting@main/notes/20250413225016817.png' \-H 'accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7' \-H 'accept-language: en,en-US;q=0.9' \-H 'cache-control: no-cache' \-H 'pragma: no-cache' \-H 'priority: u=0, i' \-H 'sec-ch-ua: "Chromium";v="136", "Google Chrome";v="136", "Not.A/Brand";v="99"' \-H 'sec-ch-ua-mobile: ?0' \-H 'sec-ch-ua-platform: "macOS"' \-H 'sec-fetch-dest: document' \-H 'sec-fetch-mode: navigate' \-H 'sec-fetch-site: none' \-H 'sec-fetch-user: ?1' \-H 'upgrade-insecure-requests: 1' \-H 'user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36'
📦 基础字段(HTTP 通用响应头)
响应头键 | 含义 |
---|---|
content-type: image/png | 响应内容是 PNG 图片 |
content-length: 618053 | 响应内容大小为 618,053 字节(约 600 KB) |
date: Sat, 10 May 2025 14:26:31 GMT | 服务器返回的时间戳(UTC) |
etag: W/“96e45-…” | 响应内容的实体标签(用于缓存判断是否更新)资源的唯一标识值,用于缓存对比 |
vary: Accept-Encoding | 告诉缓存系统:是否使用 gzip、br 等编码决定缓存内容是否相同 |
🚀 CDN & 缓存相关字段
字段 | 含义 |
---|---|
cache-control: public, max-age=604800, s-maxage=43200 | 指定缓存策略:浏览器可缓存 7 天(604800 秒),CDN 节点缓存 12 小时(s-maxage) |
age: 5 | 表示缓存内容已经存在 CDN 中 5 秒 |
x-cache: HIT, HIT | 告诉你:CDN 命中了缓存,未从源站请求内容, |
x-served-by: cache-fra-etou8220102-FRA, cache-hkg17921-HKG | 表示响应经过的两个 CDN 边缘节点(法兰克福 + 香港) |
腾讯云cdn
腾讯云配置 cdn 一般是需要自己配域名的,然后用来挂载自己的 cos链接的
字段 | 含义 |
---|---|
cache-control: max-age=7776000 | 缓存时间 7776000 秒(90 天)——说明 CDN 会强缓存 90 天 |
x-cache-lookup: Cache Hit / Cache Miss | 有两个值说明这可能是多级 CDN 或 COS 回源结构:• 上层节点命中缓存(HIT)• 下层请求了源站或缓存层(MISS) |
accept-ranges: bytes | 支持断点续传(可用于视频分段加载) |
• 支持断点续传(适用于视频/大图) | |
Cloudflare R2
cloudfare cdn 流程:
Cloudflare R2 本身就天然接入了 Cloudflare 的 CDN 网络,不需要单独设置 CDN
✅ 你上传到 R2 的内容,默认就是通过 Cloudflare 的全球 CDN 节点进行分发的。
R2 = 对象存储(兼容 S3 协议) + 自动启用 CDN 加速(通过 Workers 或默认路由)
✅ 1. R2 是什么?
- 是 Cloudflare 推出的 S3 兼容对象存储;
- 不收出口流量费(Egress FREE);
- 可以通过 自定义域名 / Worker / Access Policy 接入访问控制。
它实际上就走了 Cloudflare 的边缘节点,也就是 CDN 网络:
- ✔ 自动分发到全球;
- ✔ 支持 HTTP 缓存、CDN 命中、Range 支持;
- ✔ 可通过自定义域名 + Cache Rule 优化命中率。
字段 | 含义 / CDN 作用 |
---|---|
cf-cache-status: MISS | 👉 表示本次请求未命中 CDN 缓存(首次访问),但 Cloudflare 已参与缓存判断;若是 HIT 就表示直接命中 CDN 缓存返回 |
cf-ray: 93da82da88cbe2e1-HKG | 👉 Cloudflare 的请求追踪 ID,-HKG 表示处理请求的边缘节点位于香港 |
server: cloudflare | 👉 响应是由 Cloudflare 边缘服务器返回的 |
alt-svc: h3=“:443”; ma=86400 | 👉 表示支持 HTTP/3 加速协议(CDN 常见优化) |
cache-control: max-age=14400 | 👉 表示内容在缓存层/浏览器中可缓存 4 小时,CDN 会基于它判断是否存储副本 |
accept-ranges: bytes | 👉 表示支持断点续传(CDN 文件分段加速的基础能力) |
- ✅ cf-cache-status: HIT | MISS | EXPIRED → 说明 Cloudflare CDN 有参与缓存;
cos响应为 cdn 链接
实际开发中,数据库通常存的是 COS(源站)链接,但对外展示(给前端或用户访问)时返回的是经过 CDN 加速的链接
因为:
- COS 链接带签名、私密、可控;
- CDN 链接更快、可缓存、抗压;
- 数据库只负责存“原始资源路径”,不应该与 CDN 地址耦合。
后端中间层封装
最常见也是最灵活的做法 —— 所有涉及到链接返回的地方,统一拼接成 CDN 地址:
CDN_PREFIX = "https://cdn.xxx.com"def build_cdn_url(cos_url: str):# 假设数据库只存 `/upload/image.jpg`return f"{CDN_PREFIX}{cos_url}"
✅ 实施位置:
- ✅ 后端返回接口统一封装
- ✅ 或放到 FastAPI/Django 的 Response Model 里 @property 字
- ✅ 或者放到序列化器、DTO、装饰器里统一转换
更推荐的做法是:在后端控制层封装返回 URL 的逻辑,避免在网关“篡改响应”!!!!