OSS 和 CDN 到底是什么关系?一份给开发者的存储加速实战指南
别把存储和加速搞混了
接触过阿里云、腾讯云、AWS 的同学,对 OSS 和 CDN 这两个词应该不陌生。
但在实际项目里,我发现很多人对它们的关系理解是模糊的。有把 OSS 当成 CDN 用的 —— 直接把图片链接丢给用户访问;也有把 CDN 当成存储用的 —— 以为 CDN 能存文件。
这两个服务经常被搭配使用,但它们是两个完全不同的东西。
OSS 解决的是"文件放哪里"的问题。 CDN 解决的是"文件怎么快"的问题。
搞清楚这个区别,你的架构才不会有问题。
OSS:你家楼下的仓库
OSS 全称 Object Storage Service,对象存储服务。阿里云叫 OSS、AWS 叫 S3、腾讯云叫 COS。换个马甲你也认得它。
简单理解,OSS 就是一个可以无限扩容的网盘。不,比网盘更专业。你往里面扔文件,它帮你存着,你需要的时候拿回来。上传、下载、删、管理权限,就这些事。
OSS 的核心特点
容量无限。 不用操心磁盘满了怎么办。理论上是无限的,扩容是云厂商的事,你只管用。
按量付费。 存多少付多少,下载流量另算。适合大文件、低频访问的场景。
安全可控。 可以设置公开还是私有,支持 URL 签名、防盗链、跨域配置。
上传下载方便。 SDK 一把梭,支持断点续传、分片上传。
// 阿里云 OSS 上传——几行代码的事
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
ossClient.putObject("my-bucket", "images/avatar.jpg", new File("/local/avatar.jpg"));
ossClient.shutdown();
存好了之后,你会得到一个 URL:
https://my-bucket.oss-cn-hangzhou.aliyuncs.com/images/avatar.jpg
把链接贴到浏览器打开,图片确实能显示。那问题来了——我直接拿这个 URL 给用户访问行不行?
行,但不推荐。
原因就在于 OSS 只管存不管送。虽然它能提供文件访问能力,但它的"配送"网络就是普通的公共互联网,没有针对下载速度做专门优化。
一个用户在新疆访问你杭州节点的 OSS 文件,下载速度可能只有几十 KB/s。用户直接关网页走人。
CDN:遍布全国的快递站
CDN 全称 Content Delivery Network,内容分发网络。它的核心思路很简单:把文件提前部署到离用户近的节点上,用户就近下载。
你在乌鲁木齐访问百度图片,如果没有 CDN,流量要横跨整个中国到北京服务器取数据。有了 CDN,在就近的节点上就能直接返回,不用跑那么远。
CDN 的核心特点
就近访问。 全球几千个节点,用户从最近的节点拉文件,延迟从几百毫秒降到十几毫秒。
缓存加速。 热门的文件会被缓存在 CDN 节点上,不必每次都回源站拉。
带宽卸载。 访问压力分散到 CDN 节点上,源站的负载大幅降低。
抗突发流量。 瞬间几百万的并发,CDN 能扛住,源站直接被打穿。
要理解 CDN 的原理,记住一个关键点:CDN 不回源拿文件的时候,才是最快的。
第一次访问一个文件,CDN 节点上还没有缓存,它得去源站拉一份,这叫"回源"。有了缓存之后,后面的用户直接从节点取,不走源站。
OSS + CDN:仓库配快递
OSS 和 CDN 搭配起来,就是这个效果:
用户 → CDN 节点(加速) → OSS(源站)
用户请求一个文件,CDN 节点上如果有缓存,直接返回。没有缓存,CDN 回源到 OSS 拉一份,存到自己节点上,再返回给用户。下次相同用户或者其他用户请求同一个文件,CDN 直接命中缓存。
这就是最经典的"OSS + CDN"架构。
为什么要这么搭配?
OSS 独挑大梁的最大问题是带宽和地域。OSS 的出网带宽有限,而且地域固定。一个热门资源突然火起来,大量用户同时下载,OSS 带宽被打满,所有人一起卡。
套上 CDN 之后:
- 流量压力分散到数百个 CDN 节点
- OSS 只需承担一次回源流量
- 用户访问速度翻几倍
- OSS 回源流量费用降到几乎可以忽略
代价也有:第一次访问会慢一点(因为 CDN 没缓存需要回源),而且 CDN 有流量费。
实际成本对比
一张 500KB 的图片,日均访问 10 万次,月流量约 1.5TB:
- OSS 直出:按 0.5 元/GB 算,约 768 元/月。如果突发热门,费用翻倍。
- OSS + CDN:CDN 流量约 0.24 元/GB,加上 OSS 回源流量,约 380 元/月。费用减半,速度翻倍。
算下来,OSS + CDN 比 OSS 裸奔便宜,而且快得多。
配置流程
在阿里云上配一套 OSS + CDN,基本步骤是这样的:
第一步:创建 OSS Bucket
建一个 bucket,设置好权限。如果要给 CDN 用,bucket 需要设置为"公共读"。
第二步:上传资源
上传你的图片、文件到 OSS。可以用控制台、SDK、或者 ossutil 命令行工具。
第三步:创建 CDN 加速域名
在 CDN 控制台添加域名,比如 cdn.yourdomain.com。源站类型选 OSS,选择对应的 bucket。
第四步:配置 CNAME
CDN 会生成一个 CNAME 地址,去 DNS 控制台把 cdn.yourdomain.com 指向这个 CNAME。
第五步:验证生效
执行 ping cdn.yourdomain.com,看解析到的 IP 是不是 CDN 节点 IP。是的话就通了。
使用场景划分
只 OSS 就够了
私有文件存储。 用户上传的身份证照片、合同文件、日志备份。这些文件只有指定的人能访问,不需要加速,控制好权限就行。
低频访问的归档数据。 数据库备份、历史日志、合规归档。文件存着就行,一年也用不了几次,没必要套 CDN。
内网应用。 部署在内网的业务系统,用户就在同一机房或同城专线内,访问延迟本来就低,OSS 直连足够了。
OSS + CDN 必须上
大量图片展示。 电商网站的商品图、社区的头像和帖子图、社交平台的用户上传图片。用户量大、图片多、访问并发高,CDN 是刚需。
音视频分发。 点播视频、知识付费课程音频、直播回放。文件大且访问集中,没有 CDN 的话,OSS 带宽会直接被干爆。
软件包下载。 APK 安装包、桌面端安装程序、固件升级包。批量下载、流量突发,CDN 必须上。
静态资源加速。 网站的 JS、CSS、字体文件。首屏加载性能直接影响用户体验,CDN 是标配。
小坑提醒
OSS + CDN 是绝配,但不是配好就完事了,有几个坑需要注意:
缓存刷新。 资源更新后,CDN 节点上可能还是老版本。需要手动刷新 CDN 缓存,或者在资源名上加版本号(avatar.jpg?v=2)。推荐第二种做法,成本最低。
HTTPS 证书。 CDN 配了 HTTPS,OSS 也要配。如果源站的证书过期或者不一致,CDN 回源会失败。域名和证书最好统一管理。
防盗链。 OSS 配了防盗链只允许 CDN 回源访问,用户直接访问 OSS 地址返回 403。CDN 这边也要配 Referer 白名单。两层防护更安全。
跨域配置。 前端页面在 www.yourdomain.com,图片从 cdn.yourdomain.com 加载,域名不同就会触发跨域问题。虽然图片 <img> 标签不受跨域限制,但如果用 JavaScript 读取图片数据(Canvas 操作),OSS 和 CDN 都需要配置 CORS。
一张简单的架构图
文字不如画图,但你凑合看这个链路:
┌─────────────┐
│ 用户 │
└──────┬──────┘
│
┌──────▼──────┐
│ CDN 节点 │ ← 全球数百节点就近服务
└──────┬──────┘
│ 缓存未命中时回源
┌──────▼──────┐
│ OSS 源站 │ ← 真正的存储
└─────────────┘
用户访问 → DNS 解析到最近 CDN 节点 → 节点有缓存直接返回 → 没缓存回源 OSS → CDN 缓存并返回用户 → 后续请求全部命中缓存。
总结
OSS 是仓库,管存储。CDN 是快递网络,管分发。
OSS 不套 CDN = 仓库直接开店,顾客少还行,顾客多了体验极差。
OSS 套了 CDN = 仓库配快递站,顾客从楼下小店提货,又快又便宜。
选型建议很简单:
- 资源要公开访问、访问量大、对速度有要求 → OSS + CDN
- 文件私密、访问量小、对速度不敏感 → 单用 OSS
配置不复杂,成本省一半,速度翻几倍。这笔账算下来,没有不上 CDN 的理由。