DigitalOcean Spaces CDN 指南 2026 — 加速您的网站
DigitalOcean Spaces 配备了内置的 CDN,无需依赖外部服务即可立即启用。它有助于减少静态文件(如图像、视频和下载)在全球用户中的加载时间。本文深入探讨 CDN 功能——从启用端点、使用 SSL 绑定自定义子域,到管理许多开发者经常配置错误的缓存清除和 TTL 设置。
目录
Spaces CDN 是什么,如何与对象存储配合使用?
Spaces 是 DigitalOcean 的对象存储服务,与 S3 API 兼容,用于存储静态文件,如图像、视频、备份或可下载文件。每个创建的 Space 自动包含内置 CDN,无需支付超出标准 Spaces 定价的额外费用即可启用。这与某些提供商不同,他们对 CDN 服务单独收费,或需要与 Cloudflare 或 Fastly 等第三方集成。
它的工作原理是:启用 CDN 后,DigitalOcean 创建一个新端点,格式为 your-space.region.cdn.digitaloceanspaces.com,与源端点(origin)的 your-space.region.digitaloceanspaces.com 不同。当通过 CDN 端点请求文件时,系统首先检查它是否缓存在用户附近的边缘服务器上。如果缓存命中,文件立即返回,无需从源 Space 获取。如果缓存未命中,系统从源获取文件,将其存储在边缘,然后将其交付给用户。在后续请求同一文件时(来自附近地区),将立即导致缓存命中。
这种架构的主要优势是为远离源地区的用户降低延迟。例如,如果您的 Space 在 sgp1(新加坡),欧洲用户通过 CDN 请求文件将从更近的边缘位置获得,而不是跨地区等待。它还减少了源 Space 的带宽负载,因为缓存后的大多数请求不会直接到达它。
重要的是要理解,Spaces CDN 作为基于拉取的缓存,而不是推送 CDN。系统不会提前复制所有文件;相反,它仅在文件实际被请求时才拉取和缓存文件(延迟缓存)。这适合拥有许多文件且访问不均等的网站,因为您无需预加载所有内容。由于 Spaces 使用相同的 S3 兼容 API,启用 CDN 不会影响上传或管理文件的现有代码——您只需将 URL 引用从源端点更改为 CDN 端点。
- CDN 内置于每个 Space,可直接从控制面板启用
- CDN 端点与源端点分离(在区域前包含 'cdn.')
- 作为基于拉取的缓存工作,仅在实际请求时从源获取文件
- 使用相同的 S3 兼容 API;无需更改上传文件的方式
- 降低延迟和源 Space 的带宽负载,无额外成本
定价从 $5/月起(包含 CDN)
DigitalOcean Spaces 起价 $5/月,CDN 功能包含在此层中,无额外单独收费。这与某些按带宽使用量单独收费的 CDN 的服务不同,使预算预测对预算有限的团队更简单(截至 2026 年 7 月——在 DigitalOcean 官方定价页面上检查最新定价和存储/带宽配额,因为配额详情可能会更改)。 对于新用户,DigitalOcean 提供 $200 免费试用额度,在注册后 60 天内有效(需要信用卡或 PayPal 验证)。这足以测试启用带 CDN 的 Space 并尝试上传/缓存清除工作流,然后再承诺长期使用。如果感兴趣,您可以在 获取 $200 免费额度 → 开始 一个成本考虑是超额费用。如果您使用的存储或带宽超过 $5/月计划中的含量,您将被收取超额费用。对于高流量网站或大型媒体文件(如高清视频),您应定期通过计费仪表板监控使用情况,以避免意外收费。与自己在 Droplet 上运行存储的替代方案进行比较(这没有内置 CDN,需要使用 Cloudflare 或单独的 CDN 服务进行额外设置)。 在比较方面,Spaces CDN 适合希望简单的团队——不需要单独的源服务器设置、无需手动缓存层管理,存储/CDN 计费合并。与整合来自不同提供商的第三方 CDN 与存储相比,这降低了复杂性。
- Spaces 起价 $5/月,CDN 包含在内;无单独的 CDN 费用
- 新用户获得 $200 免费试用额度,在注册后 60 天内有效
- 始终在 DigitalOcean 官方页面上验证最新定价,因为配额可能会更改
启用 CDN 端点
通过 DigitalOcean 控制面板为 Space 启用 CDN 很简单。导航到 Spaces,选择您的 Space,转到"设置"选项卡,您将找到启用 CDN 的选项。启用后,系统立即创建一个新端点,格式为 your-space.region.cdn.digitaloceanspaces.com。您可以复制此 URL 并在您的网站或应用程序代码中立即使用它,而不是原始源端点。
对于更喜欢命令行管理的人,您可以使用 doctl(DigitalOcean 的官方 CLI)。使用个人访问令牌进行身份验证后,基本 CDN 端点命令在 doctl compute cdn 下,例如 doctl compute cdn create --origin your-space.sgp1.digitaloceanspaces.com --ttl 3600,它创建一个链接到指定源的 CDN 端点,初始 TTL 设置。这种方法非常适合希望在部署管道中使用基础设施即代码或自动化的团队。
创建端点后,您可以使用 doctl compute cdn list 列出您账户中的所有 CDN 端点,它显示 ID、源、端点 URL 和当前 TTL 值。ID 对于未来的命令(如更新 TTL、绑定自定义域或清除缓存)是必需的。
一件要注意的事是:CDN 端点覆盖整个 Space——您不能仅为某些路径或特定对象启用 CDN。如果您需要对不同文件类型使用不同的缓存行为,请考虑将它们分离到不同的 Spaces(一个用于长生命周期的静态资产,另一个用于频繁更新的文件)。另外,启用 CDN 前,请确保想通过 CDN 访问的对象的权限设置为 public-read;否则,即使创建了端点,CDN 也会返回错误而不是文件。
- 从 Spaces → 选择您的 Space → 控制面板中的"设置"选项卡启用 CDN
- 使用 doctl compute cdn create --origin ... --ttl ... 通过 CLI 创建端点
- 使用 doctl compute cdn list 列出现有端点
- CDN 覆盖整个 Space;您不能仅为特定路径启用它
设置自定义子域 + SSL
默认情况下,DigitalOcean 创建的 CDN 端点使用格式 your-space.region.cdn.digitaloceanspaces.com,它立即使用 DigitalOcean 的 SSL 证书。但是,对于希望品牌一致性的网站(例如让静态文件 URL 以您自己的域开头,如 cdn.yourdomain.com),您可以将自定义子域绑定到 CDN 端点。
首先登录您的 DNS 提供商(无论是 DigitalOcean DNS 还是其他服务),创建一条 CNAME 记录,从您所需的子域(例如 cdn)指向您的 CDN 端点,如 cdn.yourdomain.com CNAME your-space.sgp1.cdn.digitaloceanspaces.com。然后返回您 Space 的"设置"页面,找到 CDN 部分,输入自定义子域,并选择 SSL 证书。
对于 SSL,您有两个主要选择:使用 DigitalOcean 通过其证书管理器自动发布的 Let's Encrypt 证书(带自动续期),或上传您从另一个提供商已有的证书。您必须在自定义子域设置期间选择其中一个才能正确使用 HTTPS。跳过此步骤将在通过 HTTPS 访问自定义域时导致证书错误,因为证书不会覆盖绑定的域。
通过 CLI,您可以使用 doctl compute cdn update <cdn-id> --domain cdn.yourdomain.com --certificate-id <certificate-id> 更新现有 CDN 端点以绑定自定义域和证书,其中 certificate-id 必须是已通过"证书"菜单在您的账户中上传或发布的证书。常见错误包括忘记等待 DNS 传播,或创建指向源端点而不是 CDN 端点的 CNAME,这会破坏缓存优势。
- 在控制面板中绑定前,创建一条 CNAME 记录,将您的子域指向 CDN 端点
- 在 Let's Encrypt 证书(自动续期)或上传您自己的之间选择
- 使用 doctl compute cdn update 配合 domain 和 certificate-id 标志通过 CLI 更新
- 等待 DNS 传播并首先选择证书,否则 HTTPS 将出错
缓存清除和 TTL 管理
TTL(生存时间)是文件在边缘缓存中停留多长时间,然后系统检查源 Space 中的更改。您在创建 CDN 端点时通过 --ttl 参数(以秒为单位)设置此值,稍后可通过控制面板和 doctl compute cdn update 命令调整。通常,为很少变化的文件(如徽标、字体或固定版本库)设置较长的 TTL 以最大化缓存命中,为频繁更新的内容设置较短的 TTL。
当您在源 Space 更新文件但边缘缓存仍然保留旧版本(因为 TTL 尚未过期)时,用户可能会看到过期的内容,直到缓存过期。解决方案是清除缓存——DigitalOcean 称之为 flush——可以从控制面板选择您的 Space,转到 CDN 部分,然后单击 flush,或通过 CLI 使用 doctl compute cdn flush <cdn-id> --files "*" 清除所有内容,或 --files "images/logo.png" 仅清除特定文件而不影响其他缓存内容。
太频繁地清除所有内容会暂时降低缓存命中率,因为清除后的每个请求都会导致缓存未命中,再次从源获取。这会增加源负载,可能会在缓存重建时暂时减慢某些用户的响应。更好的方法是仅清除实际更改的文件,而不是每次更新都清除整个 Space。
另一种减少频繁清除的技术是通过文件名版本控制进行缓存破坏。不使用 style.css,而是使用 style.a1b2c3.css 等每次更新都更改文件名。新 URL 不会自动匹配旧缓存,无需清除命令,也避免了客户端浏览器可能忽略 CDN TTL 的浏览器端缓存问题。
- 在创建端点时通过 --ttl 设置 TTL,稍后通过面板或 CLI 更新
- 从控制面板或使用 doctl compute cdn flush 清除/冲洗缓存
- 在 flush 命令中指定特定文件路径以避免影响其他缓存文件
何时使用此功能(真实用例)
当您的网站或应用程序需要将许多静态文件交付给地理上分散的用户时,Spaces CDN 效果很好。最常见的例子是具有许多产品图像的 WordPress 或电子商务网站。将所有媒体文件移至 Spaces 并启用 CDN 会减少运行 WordPress 的 Droplet 的磁盘 I/O 和带宽负载,加快网站对服务器和最终用户的速度。 另一个场景是涉及用户上传/下载的应用程序,如文件共享平台、文档管理系统或具有用户生成内容的应用程序(如头像和短视频)。使用 Spaces 作为主要存储与 CDN 意味着文件每次被查看时都不需要通过应用程序服务器,减少后端负载并在用户数增长时实现更轻松的扩展。 对于分发下载项目(安装程序、固件)或静态 Web 应用资产(JavaScript 包、字体、CSS)的软件开发团队,使用 CDN 端点而不是让单个 Droplet 为所有文件提供服务会降低服务器在同时下载期间超载的风险,例如在发布新版本时。 相反,Spaces CDN 不适合实时、不断变化的内容(如实时 API 响应或根据用户动态渲染的页面)。这些应该留在您的 Droplet 或 App Platform 上作为正常内容;仅将 CDN 用于静态资产。另外,如果您需要高级功能(如边缘计算、内置 WAF 或自动图像优化),您可能需要在 Spaces 前添加 Cloudflare 或专业 CDN。
- WordPress/电子商务,有许多产品图像;减少 Droplet 负载
- 具有用户生成内容(如头像、短视频、附件)的应用程序
- 分发下载,如安装程序、固件或 Web 应用静态资产
- 不适合需要每次请求最新数据的动态/实时内容
- 需要 WAF 或图像优化等高级功能?在前面添加 Cloudflare
常见错误及解决方法
在实际使用中,最常见的错误是在上传前忘记将对象权限设置为 public-read。即使 CDN 端点创建成功且 URL 看起来正确,请求文件会返回错误而不是实际文件。要解决此问题,请检查控制面板中每个对象的 ACL,或在通过 API/SDK 上传期间将默认权限设置为 public-read,这样您不必之后调整每个文件。
另一个常见的混淆是混淆源端点与 CDN 端点。一些开发团队即使打算使用 CDN 也继续在应用程序代码中引用 your-space.region.digitaloceanspaces.com,因此每个请求都直接进入源,根本不受益于缓存。始终验证存储静态文件基本 URL 的配置或环境变量指向包含 cdn. 的端点。
文件更改后缓存不更新是另一个常见问题,特别是对于使用相同文件名编辑 CSS/JS 并忘记清除的团队。用户看到过期内容的时间比预期要长。短期修复:仅清除更改的文件缓存。长期修复:更新您的部署工作流以自动使用缓存破坏文件名。
在 DNS 传播前测试自定义子域会让人们认为配置失败了,但事实并非如此。DNS 可能需要几分钟到几小时才能全局传播(取决于旧 DNS 记录的 TTL),所以在断定存在 DigitalOcean 问题前,请使用 dig 或 nslookup 检查。
最后,在从不同域在 Spaces 中获取文件时不设置 CORS 头会造成问题。例如,如果您的主网站从不同域上的 CDN 端点调用字体或 JavaScript,浏览器会使用 CORS 错误阻止它们,除非您在 Space 级别配置 CORS 策略,即使直接打开文件时它们是公开的。
- 忘记将对象权限设置为 public-read,导致 CDN 错误而不是文件
- 在代码中引用源端点而不是 CDN 端点,完全错过缓存优势
- 更新文件但忘记清除缓存,让用户看到过期版本太久
- 在 DNS 传播前测试自定义子域,错误地断定设置失败
最佳实践
要有效使用 Spaces CDN 并从一开始就避免上述常见错误,请遵循多个最佳实践。首先,按用例分离 Spaces:一个 Space 用于静态网站资产(长缓存 TTL),另一个用于用户上传的文件或频繁变化的内容。这使您可以为每个组适当配置 TTL 和权限而不会冲突。 其次,使缓存破坏文件名成为频繁更新的静态文件(如 CSS/JS 包)的标准。向文件名添加内容哈希或构建编号,这样您就不依赖手动清除,也避免了客户端浏览器缓存问题。这是现代构建工具(如 Webpack 和 Vite)已经支持的标准实践。 第三,根据文件类型适当设置 TTL,而不是到处使用一个值。很少变化的文件(字体、图标)应该有较长的 TTL 以最大化缓存命中,而可更新文件应该有较短的 TTL 或使用缓存破坏。通过在通过 CDN 获取文件后检查响应头来测试实际缓存行为,以确认设置按预期工作。 第四,从一开始就在 Space 级别系统地管理权限和 CORS 策略,而不是稍后按文件管理。设置覆盖所有实际将使用它们的域的默认 ACL 和 CORS 规则,并仅限制在必要的域内,而不是为了安全起见允许通配符。 最后,定期通过计费仪表板监控带宽和存储使用情况,特别是在流量激增期间(促销、病毒式内容)以保持在计划配额内。如果您需要基础设施即代码,请通过 Terraform 的官方 DigitalOcean 提供程序而不是手动面板配置来管理 CDN 端点的创建/更新,这样设置就是版本控制的,在重新创建环境时可重现。
- 按用例分离 Spaces 以为每个组设置适当的 TTL/权限
- 使用缓存破坏文件名(内容哈希)而不是手动清除
- 设置适当于文件类型的 TTL 并测试响应头以验证行为
- 从早期在 Space 级别配置默认 ACL/CORS 策略;仅限制到必要的域
- 通过计费仪表板监控带宽/存储;使用 Terraform 进行基础设施即代码管理