本站包含联盟链接——如果你通过链接注册,我们可能获得佣金。 Affiliate links.

DigitalOcean Spaces CDN 指南 2026 — 加速您的网站

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 端点。

定价从 $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 与存储相比,这降低了复杂性。

启用 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 也会返回错误而不是文件。

  1. 从 Spaces → 选择您的 Space → 控制面板中的"设置"选项卡启用 CDN
  2. 使用 doctl compute cdn create --origin ... --ttl ... 通过 CLI 创建端点
  3. 使用 doctl compute cdn list 列出现有端点
  4. 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 端点
  1. 在控制面板中绑定前,创建一条 CNAME 记录,将您的子域指向 CDN 端点
  2. 在 Let's Encrypt 证书(自动续期)或上传您自己的之间选择
  3. 使用 doctl compute cdn update 配合 domain 和 certificate-id 标志通过 CLI 更新
  4. 等待 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 的浏览器端缓存问题。

何时使用此功能(真实用例)

当您的网站或应用程序需要将许多静态文件交付给地理上分散的用户时,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。

常见错误及解决方法

在实际使用中,最常见的错误是在上传前忘记将对象权限设置为 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 问题前,请使用 dignslookup 检查。 最后,在从不同域在 Spaces 中获取文件时不设置 CORS 头会造成问题。例如,如果您的主网站从不同域上的 CDN 端点调用字体或 JavaScript,浏览器会使用 CORS 错误阻止它们,除非您在 Space 级别配置 CORS 策略,即使直接打开文件时它们是公开的。

最佳实践

要有效使用 Spaces CDN 并从一开始就避免上述常见错误,请遵循多个最佳实践。首先,按用例分离 Spaces:一个 Space 用于静态网站资产(长缓存 TTL),另一个用于用户上传的文件或频繁变化的内容。这使您可以为每个组适当配置 TTL 和权限而不会冲突。 其次,使缓存破坏文件名成为频繁更新的静态文件(如 CSS/JS 包)的标准。向文件名添加内容哈希或构建编号,这样您就不依赖手动清除,也避免了客户端浏览器缓存问题。这是现代构建工具(如 Webpack 和 Vite)已经支持的标准实践。 第三,根据文件类型适当设置 TTL,而不是到处使用一个值。很少变化的文件(字体、图标)应该有较长的 TTL 以最大化缓存命中,而可更新文件应该有较短的 TTL 或使用缓存破坏。通过在通过 CDN 获取文件后检查响应头来测试实际缓存行为,以确认设置按预期工作。 第四,从一开始就在 Space 级别系统地管理权限和 CORS 策略,而不是稍后按文件管理。设置覆盖所有实际将使用它们的域的默认 ACL 和 CORS 规则,并仅限制在必要的域内,而不是为了安全起见允许通配符。 最后,定期通过计费仪表板监控带宽和存储使用情况,特别是在流量激增期间(促销、病毒式内容)以保持在计划配额内。如果您需要基础设施即代码,请通过 Terraform 的官方 DigitalOcean 提供程序而不是手动面板配置来管理 CDN 端点的创建/更新,这样设置就是版本控制的,在重新创建环境时可重现。

领取 $200 免费额度 →

常见问题(FAQ)

Spaces CDN 端点与源端点有什么区别?
源端点(your-space.region.digitaloceanspaces.com)每次请求时都直接从存储后端提供文件。CDN 端点(your-space.region.cdn.digitaloceanspaces.com)在用户附近的边缘服务器上缓存文件,减少延迟并从直接请求中减少源负载。
启用 CDN 会增加超过 Spaces 定价的成本吗?
否,CDN 包含在从 $5/月起的 Spaces 包中。但是,如果存储或带宽使用超过计划的配额,根据实际使用情况收取超额费用。始终检查 DigitalOcean 官方定价页面以获取最新费率。
我可以在没有设置 SSL 证书的情况下绑定自定义域吗?
从技术上讲,HTTP 是可以的,但不推荐。现代网站强制使用 HTTPS,浏览器将对混合内容显示不安全警告。始终与自定义子域一起设置 Let's Encrypt 证书或上传您自己的。
我可以仅清除特定文件的缓存,还是必须清除所有内容?
您可以使用 doctl compute cdn flush 配合 --files 参数清除特定文件,以便仅针对更改的文件,避免影响其他缓存内容。
Spaces CDN 在所有区域都可用吗?
Spaces(标准版)在 nyc1 和 nyc2 区域不可用。支持 Spaces 的其他区域也有 CDN 可用。对于泰国的用户,sgp1(新加坡)是最接近的选择,其次是 blr1(班加罗尔)。
我可以将 Spaces CDN 与 Cloudflare 一起使用吗?
可以,一些团队在 Spaces CDN 端点前放置 Cloudflare 以获得其他功能,如 WAF 或高级页面规则。但是,仅用于基本静态资产加速,通常 Spaces CDN 本身就足够了,无需增加复杂性。