通过CDN加速访问OSS

更新时间:
一键部署
我的部署

分发对象存储OSS中的静态资源(如图片、音视频、文档)时,通过配置CDN加速,可以显著提升访问速度、降低网络延迟,并削减流量成本。

工作原理

CDN加速OSS采用分布式缓存架构,将存储在OSS Bucket(源站)中的静态内容主动分发并缓存到遍布全球的CDN边缘节点上,通过就近访问机制实现加速效果。

  1. 用户首次请求资源时,请求通过智能DNS解析被路由到地理位置最近且网络状况最优的CDN节点。

  2. CDN节点检测到本地无此资源缓存,随即向OSS源站发起回源请求获取资源内容。

  3. OSS响应资源内容后,CDN节点根据预设缓存规则将资源存储在本地,同时向用户返回资源内容。

  4. 后续用户请求相同资源时,CDN节点直接从本地缓存响应,无需回源获取。这一机制大幅缩短访问路径,降低网络延迟,实现访问加速的同时减少源站负载。

image

配置CDN加速

配置CDN加速前,请确保已拥有一个已注册的域名或注册一个新域名,支持绑定非阿里云注册的域名。如果加速区域包含中国内地,用于加速的域名必须完成ICP备案

步骤一:添加CDN加速域名并配置源站

  1. 前往CDN控制台,单击添加域名

  2. 选择加速区域业务类型,填写加速域名,加速域名支持主域名(如 example.cn)或自定义的子域名(如 oss.example.cn),建议使用子域名以便于管理和扩展。

  3. 按下图所示添加源站信息,将OSS Bucket域名配置为回源地址,然后单击下一步,完成域名添加。

    image

步骤二:配置CNAME解析规则

通过DNS CNAME记录将加速域名指向CDN分配的CNAME地址,实现域名解析到CDN节点的路由功能。

  1. 推荐配置页面单击打开配置向导,或者返回域名管理页面,将鼠标移动至域名右侧的待配置处,在提示窗口单击打开配置向导

    image

  2. 复制CNAME记录值(如 example.cn.w.kunlunap.com),该地址用于DNS解析配置。

  3. 前往云解析DNS控制台,在目标域名操作列单击解析设置

  4. 单击添加记录,按照下方配置列表填写记录信息,其余配置项可保持默认设置。如果已存在CNAME解析记录,请单击解析记录操作列的修改,将记录值修改为复制CNAME记录值。

    • 记录类型:选择CNAME

    • 主机记录:如果绑定的是主域名(如 example.cn),填写@。如果绑定的是子域名,填写子域名前缀,如绑定 oss.example.cn,则主机记录填写oss

    • 记录值:填写复制的CNAME记录值。

  5. 单击确定,然后在弹出的解析变更确认窗口,再次单击确定,完成域名解析配置。

    DNS解析的生效时间取决于记录的TTL(生存时间)设置,完全生效通常需要几分钟到几小时。配置后立即访问无效属于正常现象,请耐心等待或尝试清除本地DNS缓存。

步骤三:设置回源私有Bucket

默认情况下,新创建的Bucket读写权限为私有,通过CDN访问时需要开启私有Bucket回源功能,授权CDN节点访问私有资源。如果将Bucket读写权限设为公共读,CDN可直接访问,无需开启此功能。

  1. 前往CDN控制台,单击目标域名,然后在左侧导航栏单击回源配置

  2. 阿里云OSS私有Bucket回源部分按照下图所示开启私有Bucket回源。

    image

重要

开启私有Bucket回源后,CDN将获得访问私有Bucket的授权,并自动在回源请求中添加签名信息。因此,客户端必须使用不包含签名参数URL(如http://example.cn/dest.jpg)进行访问。若URL中仍携带ExpiresSignature等签名参数,将导致OSS鉴权失败,返回403错误。

步骤四:验证加速效果

配置完成后,通过对比测试验证CDN加速域名的性能提升效果。

  1. 上传文件到Bucket

    Bucket列表页面单击Bucket名称,然后在文件列表页面单击上传文件,选择需要上传的静态资源(如dest.jpg),按页面提示完成上传。

  2. 获取文件访问URL

    • OSS默认访问URL:在文件列表页面单击目标文件操作列的详情,然后在详情页单击复制文件URL

      image

    • CDN加速访问URL:使用CDN加速域名和文件名,构造一个不包含签名信息的访问URL,例如 http://example.cn/dest.jpg,其中 example.cnCDN加速域名。

  3. 验证加速效果

    使用专业的测速平台或工具(如云监控一次性拨测工具),对比OSS默认访问URLCDN加速访问URL访问同一个文件的加载时间。

    说明

    测试数据仅供参考,因不同的网络环境、地理位置等因素,访问速度提升的比例存在差异。首次检测时,因CDN节点无缓存,需回源获取资源,加速效果可能不明显。请于首次检测后,待CDN缓存生效后再次进行测试,以验证CDN加速效果。

    image

  4. 检查缓存命中状态

    通过浏览器的开发者工具(F12),查看资源请求的响应头(Response Headers)中X-Cache字段的值,判断请求是否命中CDN缓存。

    • 若值以HIT开头,表示成功命中CDN缓存,实现了加速效果。

    • 若值以MISS开头,表示未命中CDN缓存,请求已回源至OSS获取资源。

配置回源多个Bucket

当业务架构依赖于多个OSS Bucket存储不同类型或归属的资源时,可以通过以下两种CDN多源配置方案来满足不同的业务需求。

方式一:独立子域名架构

为不同功能或资源类型的Bucket分配独立的、语义化的子域名,并为每个子域名配置单独的CDN加速,如图片资源使用子域名img.example.cn,音视频资源使用video.example.cn。语义化的子域名不仅便于开发团队识别和维护,还能在DNS层面实现流量分流,避免单一域名的并发连接限制。

这种架构将不同类型资源完全隔离,各Bucket的缓存策略、安全配置、监控告警都可以独立设置和调优:

  • 图片资源可配置长期缓存策略以提升访问速度

  • 视频资源可启用Range回源支持断点续传

  • 敏感文档可单独启用URL鉴权保障安全

独立的监控体系能够精确定位性能瓶颈和异常流量,实现精细化运营管理,同时降低不同业务间的相互影响风险。

方式二:统一域名路径路由

当多个Bucket分属不同业务或应用,却希望对外提供统一访问入口时,可配置单一CDN加速域名,利用规则引擎将不同访问路径的请求回源至指定Bucket。这样既能统一品牌形象,又能简化域名与SSL证书的维护,降低运维复杂度。采用两个Bucket(cdn-bucket1cdn-bucket2)为例说明配置方法。

  1. 添加路径规则

    首先,在CDN控制台单击目标加速域名,然后单击规则引擎 > 添加规则,按下图所示添加两条URL路径规则,分别用于匹配 http://example.cn/bucket1/*http://example.cn/bucket2/*。其中 example.cn 为加速域名,使用 bucket1 和 bucket2 作为虚拟路径分别指向 cdn-bucket1 和 cdn-bucket2* 为对象在Bucket内的真实路径。

    image

  2. 配置条件源站

    在加速域名的基本配置中配置两个条件源站,将先前创建的路径规则与各自的目标Bucket源站地址进行绑定,实现请求根据路径规则自动路由到对应源站。

    image

  3. 指定源站回源HOST

    配置条件源站路由后,还需在加速域名的回源配置中为每个源站指定源站回源HOST,确保回源请求能够正确到达目标Bucket。

    image

  4. 重写回源URL

    为确保源站能正确定位资源,需在加速域名的回源配置中重写回源URL,在回源时自动剥离用于路由的虚拟路径(如 /bucket1),使回源请求路径与Bucket内的对象实际存储路径保持一致。

    image

  5. 效果验证

    配置完成后,即可使用单一CDN加速域名根据不同路径访问不同的OSS Bucket资源,实现统一入口的多源站访问。

    image

应用于生产环境

最佳实践

  • 安全传输:启用HTTPS

    为加速域名配置HTTPS证书,并启用强制HTTPS跳转,实现客户端到CDN节点间的数据加密传输。HTTPS不仅能有效防止数据在传输过程中被窃取或篡改,还能避免浏览器地址栏出现"不安全"警告,提升用户信任度与品牌形象,同时满足现代Web安全标准要求。

  • 性能优化:配置综合缓存策略

    缓存策略是CDN性能的核心要素。一个完善的缓存策略应包含缓存有效期和参数处理两个维度,以实现最优的性能和功能兼容性。

    • 设置缓存有效期:通过设置合理的缓存周期,最大化缓存命中率,显著降低回源请求频次和带宽成本。

      • 不常更新的静态文件(如图片、音视频、应用安装包):建议设置较长的缓存时间,例如1个月以上,减少不必要的回源请求。

      • 频繁更新的静态文件(如JS、CSS):根据业务更新频率设置为数小时或数天,并配合版本号(例如style.v1.1.css)进行版本管理。

      • 动态文件或API(如PHP、JSP):缓存时间应设置为0秒(不缓存),确保每次请求都能获取最新内容。

    • 配置参数处理以启用图片处理:OSS的图片处理(如缩放、裁剪、水印)是高频使用功能。默认情况下,CDN为最大化缓存命中率会“过滤全部参数”,这会导致?x-oss-process类的图片处理指令失效。为正常使用此功能,必须前往CDN控制台域名管理 > 目标加速域名 > 性能优化,修改忽略参数配置。

  • 可用性保障:使用资源预热与自动刷新

    启用缓存后,源站文件的更新将无法立即同步到CDN边缘节点。为确保用户能及时访问最新资源,并保障在版本发布等关键时期的服务稳定性,建议采用以下策略。

    • 资源预热:在版本发布或运营活动前,使用CDN刷新和预热功能将热点资源提前分发至全球节点。这可以避免上线瞬间大量回源请求对源站造成冲击,保障用户首次访问的流畅体验。

    • 缓存自动刷新:在OSS控制台的Bucket配置 > 域名管理页面为绑定的域名开启“CDN缓存自动刷新”。当通过API更新OSS文件时,OSS会自动触发CDN刷新任务,确保用户能及时访问到最新资源。

      说明

      此功能不保证绝对的及时性。对于时效性要求极高的场景,建议在更新文件后主动使用CDN的刷新功能。

  • 跨域访问:配置CORS策略

    当前端应用需要跨域访问CDN加速的OSS资源时,仅在OSS Bucket上配置CORS规则可能因CDN缓存机制而失效。这是因为浏览器收到的可能是缓存中不含CORS响应头的旧资源。为确保跨域策略稳定生效,最佳实践是在CDN层面直接配置CORS相关响应头。

    1. CDN控制台页面单击加速域名或加速域名操作列的管理

    2. 缓存配置 > 修改出站响应头页面按下图所示配置响应头参数和响应头值。

      说明

      参数设置仅供参考,请结合实际业务场景进行调整。

      image

      配置完成后,通过CDN节点访问OSS资源时,响应中将稳定包含指定的CORS头,确保跨域请求正常通过浏览器校验。

      image

  • 性能优化:提升大文件与数据传输效率

    • 开启Range回源:对于音视频点播、大文件分发等场景,开启Range回源功能至关重要。它允许CDN节点按需分片请求大文件,不仅能实现视频拖动播放等高级功能,还能显著减少不必要的回源流量和首屏等待时间。

    • 优化数据传输:为减小JS、CSS、HTML等文本文件的传输体积,提高传输效率,可以在CDN控制台开启Gzip压缩页面优化功能。Gzip压缩会对资源进行压缩后返回,页面优化则会自动删除HTML页面、内嵌JavaScriptCSS中的注释及重复空白符等冗余内容。

      说明
      • 开启页面优化或Gzip压缩功能会改变文件的Content-LengthContent-MD5值。如果业务逻辑依赖这些值进行校验,请谨慎开启。

      • 若同时开启了页面优化和Gzip压缩功能,页面优化功能将会失效,CDN只会对文件进行Gzip压缩。

  • 平滑上线:零停机域名切换 在将现有业务从OSS Bucket域名切换至CDN加速域名时,应采用分阶段切换策略以确保服务连续性和业务稳定。

    1. 准备阶段:完成CDN加速域名的所有配置,并在测试环境中充分验证其功能和性能表现。

    2. 灰度发布阶段(建议在业务低峰期):采用灰度发布的方式将部分业务流量切换至CDN加速域名,通过逐步放量降低切换风险。

    3. 验证阶段:密切监控业务访问日志和错误率,分析响应时间、成功率等关键指标,确保灰度发布服务正常且业务运行平稳。

    4. 全量发布阶段:经过充分验证后,将全量业务流量切换至CDN加速域名,完成域名迁移。

    5. 回滚预案:如遇问题,立即回滚至Bucket域名,并详细分析问题根因后重新部署。

风险防范

  • 流量盗用防护:配置Referer防盗链与URL鉴权 为防止资源被非法站点盗用,产生不必要的流量费用和带宽消耗,必须配置安全防护策略。

    • Referer防盗链配置Referer黑/白名单,通过校验HTTP请求头中的Referer字段,仅允许来自指定域名的访问,这是最基础有效的防盗链手段。

    • URL鉴权:针对私有权限的OSS Bucket,开启CDN的“私有Bucket回源”后,CDN节点即获得访问授权,这使得原本需要签名的私有资源能通过CDN域名被公开访问。为恢复对私有资源的安全控制,建议在CDN层面启用URL鉴权。该功能通过校验URL中的加密串和时间戳,可有效防止私有内容被恶意下载和传播,实现对资源的精细化访问保护。

  • 回源链路保障:配置回源SNI与回源HOST

    确保CDNOSS之间的回源通信稳定且安全,是服务可用性的关键保障。

    • 配置回源SNI:为避免不带SNI(Server Name Indication)的CDN回源请求导致OSS访问异常,需在CDN配置回源SNI,并设置其与回源HOST相同(回源HOST默认为加速域名)。当回源请求携带SNI时,OSS能够在TLS握手阶段精准识别业务域名,从而返回匹配的证书,为域名提供访问防护。若OSS接收到不携带SNI的请求,将无法进行业务域名的精准识别,只能返回默认证书。在TLS握手阶段,所有不带SNI的请求会被视为同类处理,可能触发更严格的流量限制,进而影响正常访问。

    • 隐藏源站信息

      默认情况下,CDN使用Bucket域名回源。当回源出错时(如文件不存在),错误信息中可能暴露OSS Bucket域名,存在安全风险。

      image

      为隐藏源站信息,提升安全性,可按以下步骤将回源HOST修改为CDN加速域名:

      1. Bucket列表页面单击目标Bucket名称,然后在Bucket配置 > 域名管理中将CDN加速域名绑定到Bucket。

        image

      2. CDN控制台页面单击目标加速域名,然后在回源配置 > 默认回源HOST中单击修改配置,并将域名类型修改为加速域名

  • 行为审计与排障:启用访问日志 生产环境必须具备完善的日志记录能力,以便进行安全审计、性能分析和故障排查。建议在CDN控制台配置实时日志推送,将访问日志投递到日志服务SLS。通过SLS,可以对访问行为、流量分布、热门资源、错误请求等进行深度分析和监控告警,为业务优化和安全防护提供数据支撑。

计费说明

  • CDN费用:配置CDN加速访问OSS会产生CDN流量费用,具体费用说明请参见CDN计费概述

  • OSS费用:CDN节点缓存未命中时需要回源到OSS获取资源,会产生CDN回源流出流量费用,具体费用说明请参见OSS流量费用

常见问题

为什么CDN回源时出现 5xx 报错?

5xx 错误表示CDN无法成功从OSS源站获取资源,需要从以下方面进行排查:

  • 源站配置:检查CDN控制台配置的OSS源站地址是否正确。

  • 回源协议:如果CDN配置了HTTPS回源或协议跟随回源,请确保源站支持HTTPS访问且SSL证书配置正确。

  • 网络链路:测试CDN节点或本地到OSS源站的网络连通性。CDN节点都是公网上的节点,CDN配置的源站必须要连通公网,如果配置的源站IP公网不可达、端口不通或者源站域名没有解析,则会导致CDN回源请求源站失败。

  • 源站压力:在CDN实时监控页面观察是否存在突增的带宽和流量,大量的回源请求可能会导致源站压力过高,导致回源响应超时。对于热点资源,应在资源发布时进行资源预热设置合理的缓存周期

为什么配置静态页面后通过CDN加速访问报错 403 ForbiddenYou are forbidden to list buckets

原因分析:此问题通常发生在为配置了“静态网站托管”的私有Bucket开启CDN加速后。根本原因在于两种访问机制的冲突:

  • CDN私有回源:CDN回源至OSS时,会携带签名信息进行身份验证。

  • OSS静态网站托管:其默认首页功能(如访问/时自动返回index.html)要求访问请求必须是匿名的。

当用户访问加速域名的根目录时,CDN会发起一个带签名的请求访问Bucket的根目录。OSS收到此签名请求后,因其非匿名而不会触发静态网站托管逻辑,转而尝试执行ListObjects(列举文件)操作。由于访问策略通常禁止此类操作,最终导致返回403 Forbidden错误。

解决方案:绕过OSS的静态网站托管机制,直接在CDN层面通过配置URL改写规则实现同样效果。

  • 待重写的Path^/$ (匹配根目录访问)

  • 目标Path/index.html (或实际首页文件名)

  • 执行规则:选择Redirect

是否可以通过CDN域名上传文件到OSS?

出于安全考虑,不建议通过CDN域名上传文件到OSS。如果CDN被设置为公共写入,这意味着任何人不需要身份验证或授权都可以通过CDN上传文件到OSS,容易受到恶意上传和数据篡改的攻击。建议在限制最小权限的前提下,使用OSS域名上传文件。

使用CDN加速后OSS下行流量是否会变少?

如果CDN缓存的文件被频繁命中,OSS的公网流出流量会显著降低,从而减少OSS流量成本。

CDN缓存文件被频繁命中的前提是,业务场景中的部分数据在某段时间内被频繁访问,例如网站访问、图片文件下载、游戏发行等场景。缓存命中率越高,回源流量越少,成本节省效果越明显。

如何统计文件的真实访问次数?

启用CDN加速后,OSS的访问日志将无法记录由CDN缓存直接响应的终端用户访问请求,可通过以下方式统计文件的真实访问次数: