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 的理由。