做站点的人早晚会跟 CDN 打交道。图片多的电商页、软件包下载站、音视频点播、小程序静态资源,甚至一些 API 场景,只要用户量一上来,回源带宽和首屏速度的问题就会冒出来。阿里云 CDN 是我用得比较久的加速服务之一,从最早的纯静态图片加速,到现在 OSS 私有 Bucket 回源、全站加速、HTTPS 证书自动续期这一套,踩过的坑足够写一篇长文。这篇文章不会去抄控制台的操作手册,而是把我实际接入和运维阿里云 CDN 时总结出来的完整思路、配置步骤和排查经验整理出来,给正准备上 CDN 或者已经被 CDN 问题困扰的朋友做个参考。无论是刚从服务器直连切换到 CDN 的新手,还是已经在用 CDN 但命中率一直上不去的运维,这篇文章应该都能给你一些可以落地的建议。
1. 先弄明白 CDN 在一套业务里到底扮演什么角色
1.1 它和普通服务器最本质的区别
很多朋友第一次接触 CDN 时,容易把它理解成“一台放在云上的缓存服务器”。这个理解不算错,但会限制你的排查思路。CDN 不是一台服务器,而是一整套由边缘节点、智能调度系统和源站组成的分布式结构。用户访问你的域名时,不会直接连到你的服务器,而是先通过 DNS 解析到一个离他最近的边缘节点,由这个节点响应用户请求。如果节点上已经有缓存内容,就直接返回,这个过程叫“命中”;如果节点上没有,边缘节点会代替用户向你的源站发起请求,拿到内容后缓存下来,再返回给用户,这个过程叫“回源”。
这一点非常重要。你在服务器上看到的访问日志,其实只是 CDN 回源产生的请求,而不是用户真实访问的全部流量。刚开始用 CDN 的人经常会有个疑问:为什么我的 Nginx 日志里流量这么少,但 CDN 控制台显示的带宽很高?答案就在这里,大部分请求都被边缘节点截胡了,只有没命中缓存的请求才真正到达源站。这也意味着,你评估源站压力时不能只看 Nginx 日志,还要结合 CDN 的命中率曲线一起看。
1.2 什么样的业务值得上 CDN
不是所有业务都适合直接套 CDN。我见过最典型的错误是把登录接口、支付回调、实时消息这类强动态请求也一股脑挂到 CDN 上,结果缓存没配上,所有请求全部回源,带宽没省多少,反而多了一层链路,延迟还变高了。根据我的经验,适合 CDN 加速的场景主要有这几类:
- 静态资源分发:HTML、CSS、JS、图片、字体这类文件,内容不常变化,缓存友好度最高,上线后往往能把源站压力降低 80% 以上。
- 大文件下载和软件分发:安装包、镜像文件、模型权重文件等。这类场景 CDN 有专门的 Range 回源支持,用户在下载时拖动进度或者分段请求,不需要回源下载整个文件,对源站和网络都友好。
- 音视频点播:短视频、长视频、音频课程等,边缘节点的缓存和流媒体分发能力能明显降低首帧时间和卡顿率。
- 动态内容加速:有些业务接口响应本身不快,但网络链路才是瓶颈,比如跨地域调用、移动网络环境复杂。阿里云的全站加速(DCDN)可以做链路优化,但注意这不是靠缓存解决的,而是通过智能路由和连接优化来减少时延。
判断一个业务适不适合 CDN,我有一个笨办法:看你的响应内容是否具备“可复用性”。同一个 URL 在短时间内反复被不同用户请求,返回内容基本一致,那它就可以缓存;如果每个用户看到的都不一样,那就不能缓存,只能走链路优化。图片、静态文件当然没问题,一些只读的列表页 API、配置下发接口其实也可以做短时间缓存,前提是业务方接受一定延迟。
1.3 CDN 节点、回源和 DNS 调度之间的关系
理解了“命中”和“回源”这两个概念,你就能看懂 CDN 的运作链条了。整个流程大致是这样的:
- 用户在浏览器输入你的加速域名。
- 本地 DNS 向权威 DNS 发起解析请求。
- CDN 的 GSLB(全局负载均衡)系统根据用户 IP、地理位置、运营商、节点负载情况,返回一个最优的边缘节点 IP。
- 用户浏览器直接请求这个边缘节点。
- 边缘节点检查缓存,命中则直接返回,未命中则回源站拉取内容并缓存。
这里有一个很多人忽略的细节:CDN 边缘节点也是有分层的。国内大型 CDN 通常有 L1(边缘节点)和 L2(区域中心节点)两层缓存。当一个边缘节点未命中时,它会先在 L2 节点找,找不到才会真正回源。这个机制的好处是,即使同一个文件在多个边缘节点都未命中,源站也只需要被请求一次,L2 节点可以共享内容给不同边缘节点。理解这个层级对你排查“为什么回源量这么大”有帮助,因为有时候问题出在缓存规则,有时候出在 L2 命中率。
2. 首次接入 CDN 前必须做好的四件事
2.1 域名与备案检查
接入 CDN 之前,最容易卡住的不是技术问题,而是域名合规问题。使用中国大陆节点的 CDN 加速服务,加速域名需要完成 ICP 备案,这个在控制台添加域名时系统会自动校验。很多朋友是域名在别处注册、服务器买了香港或海外区域,以为可以绕开这一步,结果添加域名时直接被拦下来。
我的建议是提前完成两件事。第一,确认加速域名已经备案成功,且备案信息还在有效期内。第二,确认你对这个域名有 DNS 解析权限,因为后面需要添加 CNAME 记录。如果公司业务有多个子域名,比如 img.example.com、static.example.com、download.example.com,建议在规划阶段就想清楚哪些域名要走 CDN、哪些保持直连源站,避免以后反复修改解析造成短暂不可用。
这里也顺带说一句,如果你的源站和 CDN 都在阿里云,但域名之前在其他平台备案过,仍然需要办理接入备案或确保主体在阿里云有备案信息,具体以控制台提示为准。最好在采购服务器之后、正式上线之前就完成这个动作,不然后续会非常被动。
2.2 源站类型到底选 OSS、ECS 还是负载均衡
阿里云 CDN 添加加速域名时,会让你配置源站信息。源站类型看似简单,但选错了后面改起来比较麻烦。我常用的选择逻辑是这样的:
- 源站是 ECS 实例:适合静态资源较多、且已经部署在云服务器上的场景。可以直接填 ECS 的公网 IP,也可以填 ECS 绑定的域名。需要注意的是,如果你填了 IP,那回源时 HTTP 请求头里的 Host 是怎么处理的?这时候就要看“回源 HOST”这个参数。
- 源站是 OSS Bucket:适合把所有静态资源都放到对象存储里的场景。特别是图片、音视频等体量大的文件,放在 OSS 再通过 CDN 加速,回源走的是阿里云内网,既快又省流量费。
- 源站是 SLB 域名或其它域名:适合源站本身做了负载均衡、或者源站域名指向多台服务器的情况。这种情况下 CDN 会按照域名解析结果自动负载,不需要你在 CDN 侧再挂多台源站。
所谓“回源 HOST”,本质上是告诉源站:我这次回源请求访问的是哪个站点。比如你源站服务器 IP 是 1.2.3.4,这台服务器上跑着 abc.com 和 def.com 两个站点,CDN 回源时如果只用 IP 访问,服务器不知道你要访问哪个站点。这时就需要把回源 HOST 设置为对应的域名。很多人配完之后发现回源全部 404,基本就是这里没配对。
还有一点要注意:RDS 数据库不能直接作为 CDN 源站,因为 CDN 走的是 HTTP/HTTPS 协议,它只能处理应用层内容。数据库数据必须通过后端的 API 接口输出,对于这类接口,除非是只读且可缓存的列表数据,否则不建议配置 CDN 缓存,最多走全站加速的链路优化。
2.3 缓存规则的提前规划
缓存规则是 CDN 配置里最核心的部分,没有之一。控制台默认会有一套缓存策略,但真实业务基本都要微调。我一般在接入前就会画一张“缓存规划表”,明确什么类型的资源缓存多久、什么内容绝对不缓存。
常见的缓存规划可以参考这个思路:
- 图片、JS、CSS、字体这类带哈希版本号的静态资源:缓存时间可以设置 30 天甚至更长,因为文件更新时 URL 会变,旧缓存不影响。
- HTML 页面:建议短缓存,比如 5 到 10 分钟。因为 HTML 很可能引用新的 JS/CSS,如果缓存太久,发布新版本后用户拿到的还是旧页面。
- API 接口:除非业务方明确接受缓存,否则默认设置不缓存,或者只缓存极短时间(比如 1 分钟)。
- 带登录态、购物车、个性化内容的接口:绝对不缓存,必须直接回源。
另外要关注 URL 参数。CDN 默认情况下不同参数会生成不同的缓存 key,比如 product?id=1 和 product?id=2 会被当成两个不同的内容。如果你的资源 URL 后面带了随机参数或者时间戳,即使内容一样,也会导致缓存命中率极低。这时候可以在缓存配置里开启“过滤 URL 参数”,让 CDN 忽略部分参数,只按路径缓存。这个优化对命中率的提升非常明显,但前提是你业务上不依赖这些参数区分内容。
2.4 证书和 HTTPS 的准备工作
现在新上线的业务基本都要求全站 HTTPS,CDN 接入自然绕不开证书问题。我建议在添加加速域名之前就把证书准备好,否则域名一旦切换 CNAME,HTTPS 又没配好,用户访问会直接看到证书告警,非常影响体验。
证书来源常见有三种。第一种是阿里云 SSL 证书服务里申请的免费证书,一般单域名,有效期现在比较短,到期前需要手动或自动续期。第二种是自己用 certbot 申请的 Let‘s Encrypt 证书,免费但有效期只有 90 天,需要配置自动续期。第三种是商业证书或泛域名证书,适合有多级子域名的业务。无论哪种证书,上传到 CDN 控制台时都要保证证书链完整,也就是证书文件、私钥、中间证书都要正确配置,不然某些浏览器会不认。
还有一个容易被忽略的点:回源也需要证书。CDN 回源时同样可以走 HTTPS,如果你的源站强制 HTTPS,源站证书的有效性也会影响回源是否成功。很多时候 CDN 配置看起来没问题,但回源一直报 526 或 502,就是因为源站证书过期或者没有正确配置完整证书链。
3. 阿里云 CDN 接入实操:从添加域名到验证生效
3.1 控制台添加加速域名与参数选择
接入 CDN 的实际操作,重点在控制台的几个选择项上。登录阿里云 CDN 控制台,进入“域名管理”,点击“添加域名”,需要填写加速域名、业务类型、源站信息等。业务类型这里很多人只是随手选一个,实际上它决定了 CDN 节点和缓存策略的默认行为,建议按真实场景来选:
- 图片小文件:适用于网页图片、小体积静态文件,整体加速效果最明显。
- 大文件下载:适用于安装包、压缩包、镜像等,开启了大文件分片和 Range 回源支持。
- 音视频点播:适用于音视频文件,支持流媒体相关回源配置。
- 直播流媒体:适用于直播场景,需要配合直播服务使用。
- 全站加速:适用于混合动态和静态内容的站点,会启用动态路由加速,但价格也更高。
源站信息按照前面说的规划填好,端口默认 80 和 443,如果你的源站用了自定义端口,需要在这里同步修改。回源 HOST 默认会带出加速域名,如果你的源站站点名和加速域名不一致,一定记得改成源站实际识别的域名。
配置完成后会进入审核状态,这一步一般是自动的,正常几分钟到几小时不等。审核通过后,控制台会给你一个 CNAME 地址,这个地址长得像“yourdomain.example.com.w.cdngslb.com”之类。拿到这个 CNAME 地址,接入工作才正式进入解析阶段。
3.2 配置 CNAME 解析并验证生效
CNAME 解析是在你的 DNS 服务商处操作的,不是阿里云 CDN 控制台里改。假设你的加速域名是 img.example.com,你需要到 DNS 管理处给 img 这个主机记录添加一条 CNAME,指向 CDN 分配的地址。解析生效后,CDN 才会接管该域名的流量。
验证 CNAME 是否生效,最直接的办法就是一条命令:
dig img.example.com如果输出的 CNAME 记录里有 CDN 分配的域名,说明解析已经生效。或者用 nslookup 也可以。对于刚刚切换的域名,全球 DNS 生效需要时间,短则几分钟,长则十几个小时,运营商 DNS 缓存越久生效越慢。
解析配置只是第一步,真正验证 CDN 有没有正常工作,要看响应头。用 curl 请求一个静态资源:
curl -sI https://img.example.com/static/js/app.js观察响应头里有没有 CDN 特征字段。阿里云 CDN 一般会返回 Via 头、X-Cache 字段(可能显示 HIT 或 MISS),还有 EagleId 之类的请求追踪 ID。如果是第一次请求,X-Cache 是 MISS,再次请求同一个文件,变成 HIT,那说明 CDN 已经在缓存内容了。这个验证方法在你排障时也特别有用,因为一眼就能看出请求到底命中缓存还是回源了。
CNAME 切换有一个风险点我要提醒:如果你原来在 DNS 里配的是 A 记录指向源站 IP,改成 CNAME 之后,源站 IP 就不再对外暴露了。这本来是好事,但如果你有部分业务没有走 CDN,仍然直接访问源站 IP,那可能会受影响。切换前最好把业务梳理一遍,确认所有公网流量都走加速域名,再动 DNS。
3.3 HTTPS 证书绑定与自动续期
域名解析生效后,紧接着就是配置 HTTPS。在 CDN 控制台“域名管理”里找到该域名,进入“HTTPS 设置”,可以上传证书或选择阿里云证书服务里已有的证书。这里有几个选项需要重点说清楚:
- 开启 HTTP/2:建议打开,对弱网环境下的小文件并发加载有明显提升。
- 强制 HTTPS 跳转:如果你希望所有 HTTP 请求自动 301 到 HTTPS,开启这个开关。注意如果源站只支持 HTTP,这个开关不影响回源协议。
- 回源协议设置:可以设置回源用 HTTP、HTTPS 或跟随用户请求协议。源站没有证书的话,回源协议选 HTTP 即可,因为公网传输这段已经被 CDN 到用户的 HTTPS 保护了,源站和 CDN 之间走默认的内网链路风险相对可控。
证书续期是个高频问题。阿里云免费证书有效期较短,到期前建议直接在证书服务控制台申请新证书,然后回到 CDN 的 HTTPS 设置里更新证书。如果你的证书是 certbot 自动申请的,可以写一个小脚本,在续期成功后自动调用阿里云 OpenAPI 更新 CDN 域名证书,但实现起来有一定门槛,适合有开发能力的团队。对于大多数中小站点,我建议直接用阿里云证书服务里的免费证书,到期前控制台会有提醒,手动更新一下也就一两分钟的事。
还有一个小细节:证书快到期时,如果你更换了证书但类型不匹配(比如原来是泛域名证书,现在只上传了单域名证书),会导致除主域名之外的子域名全部失效。更换证书后建议立刻用不同子域名的浏览器无痕模式访问一遍,验证覆盖范围。
3.4 OSS 联动:私有 Bucket 回源与内网免流
静态资源体量比较大的业务,我通常建议把文件放到 OSS,然后 CDN 回源指向 OSS Bucket。这个组合的好处在于:OSS 本身就具备高可用和低成本存储能力,CDN 回源走的是阿里云内网,不产生公网流量费,整体流量成本可以压得很低。
配置方式很简单,添加域名时源站类型选择“OSS 域名”,然后选择对应的 Bucket 即可。如果 Bucket 是私有的,也就是不能直接公网访问,需要在 CDN 控制台打开“私有 Bucket 回源”功能。开启后,CDN 节点在回源时会对 OSS 发起内部签名请求,用户访问时不要求 OSS 对外开放。这样你的源站资源不会因为直接从 OSS 访问而暴露,同时也不需要为公网读流量付费,是比较推荐的形态。
使用过程中有几个点需要留意。第一,Bucket 和 CDN 必须在同一个地域,如果跨地域回源,内网优势就没了。第二,OSS 上文件的 Content-Type 一定要配好,文本、图片、音视频的类型不对会导致浏览器解析异常或直接下载,常见的坑是 JSON 文件被识别成 octet-stream。第三,如果你在 OSS 上开启了静态网站托管,注意默认首页配置和 404 规则要跟业务匹配,否则 CDN 回源取不到 index.html 时可能返回错误页。
3.5 源站迁移时的 CDN 配合
很多朋友咨询过“怎么做到准不停服、不丢数据地迁移到阿里云 ECS”。CDN 在这种迁移里其实是个很好的解耦工具,因为用户流量并不直接打到源站,源站怎么切,用户是无感知的。
我的做法大致是这样的。先在阿里云 ECS 上部署好新环境,用测试域名验证接口和静态资源都正常。接下来,去 CDN 控制台修改源站信息,把源站地址从旧环境切换成新 ECS 的 IP 或新绑定的域名。由于 CDN 边缘节点已经缓存了大量静态资源,切换源站时大多数请求仍然直接命中缓存,真正回源的请求很少,所以对用户的影响窗口极小。
关键点在切换之后。源站切换后,边缘节点上旧缓存资源还会继续存在,如果新源站的资源内容和旧源站不完全一致,就会出现“部分用户看到新内容、部分用户看到旧内容”的情况。解决办法是发布前先在 CDN 控制台做一次“刷新”,把关键页面和资源 URL 清掉缓存,让边缘节点强制回源拉取新内容。如果资源量很大,还可以用“预热”功能,提前把新内容加载到边缘节点,用户访问时直接命中,既不会出现版本混乱,也能减小区分切换时的回源压力。
数据迁移方面,如果是文件类数据,一般 rsync 同步到新服务器或者 OSS;如果是数据库数据,需要在业务低峰期做全量加增量同步,确认数据一致后再切换源站。CDN 这一层只要配置好,迁移过程基本不需要停机,这也是我用 CDN 做迁移时最省心的部分。
4. 上线后最常见的问题排查与避坑
4.1 CNAME 配置正确但访问异常
接入 CDN 后最常见的异常就是“解析没问题,但网站打不开”。先别急着怀疑 CDN,按下面几个点排查,大概率能定位到问题。
第一,回源 HOST 对不对。这个问题前面提过,如果源站是多站点服务器,回源 HOST 配错,源站返回 404,CDN 把 404 也当正常响应返回给用户。这种情况下页面在直连源站时正常,走 CDN 就 404,非常典型。第二,源站安全组有没有放行 CDN 回源 IP。如果源站 ECS 的安全组只放行了来自公网特定 IP 的访问,CDN 节点回源时就会被防火墙拦住,表现为 CDN 控制台回源失败率飙升,源站日志里根本没有请求记录。阿里云提供了 CDN 回源 IP 段列表,需要把这些网段加到安全组白名单里。第三,端口和协议不匹配。源站监听 8080,CDN 回源配置里用的是 80,自然失败;源站只支持 HTTP,CDN 回源却开启了 HTTPS,也会失败。
这类问题的排查顺序,我一般是“先看回源 HOST,再看安全组,再看协议端口”。因为这三种情况基本都是配置层面的低级错误,只要有一个细节没对齐,CDN 就无法正常工作。
4.2 缓存命中率低与缓存不生效
缓存命中率低于 90% 时,CDN 带来的成本优势基本体现不出来。我见过命中率只有 20% 的站点,原因通常是下面几个。
最普遍的是源站没有正确的缓存响应头。CDN 在决定是否缓存时,会遵循源站的 Cache-Control 和 Expires 头。如果你的源站动态请求默认输出 Cache-Control: no-cache 或 private,CDN 即使配置了缓存规则,也不会缓存这些内容。解决办法是让开发统一梳理,静态资源输出 long-cache 头,API 输出 no-cache 头,两边的语义要一致,而不是靠 CDN 端强制覆盖一切。
其次是 URL 参数导致缓存 key 碎片化。比如你的图片 URL 是 /img/logo.png?timestamp=123,每刷一次参数就变一次,CDN 认为每个 URL 都是新内容,全部回源。这在有统计工具、动态加时间戳的站点里非常常见。开启忽略 URL 参数之后,命中率能立刻拉上来,但前提是这些参数确实不影响内容输出。
再次是缓存规则没有覆盖对应目录。比如你新增了一个 /static 目录,但缓存规则里只写了 /assets,那 /static 下的文件全部走默认回源策略,命中率自然低。接入 CDN 后,新增目录时一定要同步检查缓存规则。
4.3 跨域报错
用了 CDN 之后,前端同事可能会突然反馈:字体文件加载不了,或者 Canvas 画布被污染,控制台报 CORS 错误。这是因为 CDN 域名和页面域名不一致,浏览器的同源策略把请求拦了,需要在 CDN 侧配置跨域响应头。
在阿里云 CDN 控制台的“HTTP 头设置”里,可以自定义添加 Access-Control-Allow-Origin 响应头。一般如果你只有一个页面域名,直接设置成该域名即可;如果资源需要被多个域名共用,可以用“*”。需要注意的是,当你同时通过 CDN 和源站直连访问同一资源时,跨域头的配置需要两边保持一致,否则会出现“CDN 能访问、源站直连报跨域”这种诡异问题。我建议把跨域头放在源站层配置,CDN 侧只做透传,这样架构更统一。
还有一种情况是字体文件跨域。字体文件即使在同域名情况下有时也需要 CORS,很多站点因为没给 .woff2 后缀的文件加跨域头,导致开发环境正常、上线后字体加载不出来。排查时用 curl 带 Origin 头访问字体 URL,看返回的响应头里有没有 Access-Control-Allow-Origin,一目了然。
4.4 怎么判断一个 IP 是不是 CDN 节点
这个问题的实际场景是:你在源站日志里看到大量来自陌生 IP 的请求,想知道是正常 CDN 回源还是恶意请求。判断方法有几个。
最简单的是看响应头。用 curl 发送请求时,观察响应头里有没有 CDN 特征头,比如 Via、X-Cache、EagleId、AliCDN-Server 之类,如果有说明当前响应确实经过 CDN。但这种方法只能验证域名走了 CDN,不能判断某个 IP 是不是节点,因为请求最终可能被调度到不同节点。
更靠谱的办法是反向验证。用 nslookup 或 dig 查询该 IP 的反向解析结果,CDN 节点的 IP 通常反解为类似 *.cdngslb.com 的域名。也可以去阿里云的 IP 归属查询工具里查看 IP 归属和网络运营商,如果查询结果显示该 IP 属于阿里云 CDN 节点段,那基本可以确认是正常回源。
实际运维中还有个经验:如果源站收到大量来自 CDN 回源 IP 段但 UA(User-Agent)非常规的请求,有可能是被其他站点的流量误命中,也可能是攻击者直接伪造了 CDN 节点 IP。这时候不要只依赖 IP 判断,建议结合 CDN 日志、请求特征、频率阈值做综合判断,必要时在 CDN 侧开启访问控制或 WAF 功能。
4.5 证书告警与续期失败
证书问题虽然不复杂,但一旦出现就很急,因为用户侧会直接看到“您的连接不是私密连接”。我总结过几个常见的证书告警场景。
场景一:过期没发现。免费证书有效期越来越短,如果没设置监控,很容易突然发现证书已经过期一天了。解决方法是提前在证书服务控制台配置到期提醒,短信、邮件都打开。场景二:证书链不完整。上传证书时只贴了域名证书,没贴中间证书,导致一些严格校验的浏览器报警。这种情况在证书到期续期时最容易发生,因为重新上传时容易漏掉中间证书。场景三:更换证书后没覆盖所有子域名。泛域名证书和单域名证书混着用,换错了导致部分子域名失效。场景四:只改了 CDN 侧,忘了改源站证书。CDN 到源站走 HTTPS 时,源站证书如果过期或不可信,回源同样会失败。
如果你用 certbot 管理证书,建议定期检查服务状态和续期日志,避免自动续期失败后没有及时发现。最稳妥的方式还是把证书管理接入监控体系,证书剩余有效期做成指标,统一报警。
5. 实测调优与成本控制
5.1 预热、刷新与缓存规则调优
CDN 上线后的调优,主要围绕三个操作:预热、刷新、缓存规则调整。
预热让资源提前从源站拉取到边缘节点,用户访问时直接命中。适合用在版本发布、大促活动、新资源上架这些场景。比如客户端 App 发布新版本时,新版的安装包都可以提前预热,避免发布瞬间回源压力过大。预热操作在控制台按 URL 提交即可,注意一次提交的数量和频率有配额限制,大批量预热要分批次执行。
刷新用于主动清理缓存。发布新版本时,HTML 页面、JS/CSS 文件的旧缓存需要清理,否则用户会看到旧页面。控制台支持 URL 刷新和目录刷新,目录刷新会清掉该目录下所有缓存,操作快但影响面大,建议优先使用 URL 刷新,只清理确实变化的资源。
缓存规则调优方面,除了前面提到的忽略 URL 参数,还有几个实用开关值得关注。一个是 Range 回源,开启后大文件下载和视频拖动时,CDN 只回源请求部分字节,能显著降低回源流量。另一个是分片缓存,适用于视频点播场景,将文件切成多个分片缓存处理,能让不同节点更高效地缓存大文件。还有一个是回源超时时间,如果源站偶尔慢,适当调大超时时间能减少回源失败率,但也不能设太大,否则请求堆积会拖垮源站。
5.2 防盗链、URL 鉴权与访问控制
资源被其他网站盗链,是用了 CDN 之后一定会碰到的事情。图片、视频、安装包被第三方站点直接引用,流量费用全算在你头上,必须做访问控制。
最基础的是 Referer 防盗链,控制台直接配置,设置白名单后,只有来自指定来源的请求才会正常返回资源。这个方法简单,但 Referer 是可以伪造的,适合用来挡小白盗链,不适合放专业的恶意用户。
更可靠的方案是 URL 鉴权,也叫时间戳签名。CDN 会在资源 URL 后面附带一个根据密钥和时间戳生成的签名,用户请求时 CDN 会校验签名和过期时间,只有合法的请求才会返回内容。这个方案可以控制资源有效期,比如视频播放链接生成后 30 分钟失效,某些下载链接验证通过后可访问 24 小时,特别适合付费内容、私密下载、临时分享这类场景。实现上,业务后端生成签名 URL,前端拿到后直接拼在资源链接上即可,阿里云控制台的文档里有规则示例,照着实现就行。
此外还有 IP 黑白名单和 UA 黑白名单。IP 黑名单适合拦截特定地域的恶意请求,UA 黑名单适合拦截空 UA 或非正常浏览器的请求,对刷量攻击有一定的防护作用。对于流量大、内容价值高的站点,建议在 CDN 之上再叠加 WAF 能力,把 Web 攻击挡在边缘层。
5.3 成本控制:带宽封顶、流量包与监控告警
CDN 的成本跟业务体量直接相关,控制成本的前提是清晰掌握每个域名的流量和带宽走势。阿里云控制台提供实时监控,可以按域名查看带宽曲线、请求数、命中率等指标,建议把核心域名的监控图表放到一个自定义大盘里,日常巡检扫一眼就能发现问题。
带宽封顶这个功能我建议每个正式使用的域名都开启。它可以在带宽超过设定阈值后自动执行预设动作,比如限速或者直接返回 403。这个功能不是为了限制正常业务,而是为了防止异常流量把预算打爆。比如你的资源链接被恶意扩散,一夜之间带宽飙到顶,如果没有封顶机制,账单会很难看。设置了封顶之后,至少可以给自己留出反应时间。
流量包方面,如果业务相对稳定,按流量包预付通常比按量后付便宜。但要注意流量包是有有效期的,不要一次性囤太多,用不完的流量包到过期就浪费了。比较合理的做法是先按量付费跑一两个星期,拿到日均流量峰值后,再按历史数据的 80% 左右采购流量包,留一点余量给突发场景。监控告警一定要配,域名维度、带宽维度、命中率维度各配几条告警规则,阈值设置到合理水平,避免告警太多变成狼来了,也避免真的问题了没人知道。
我在实际使用中还有一个小习惯:每次发版后,除了常规的刷新操作,会把核心页面和几个关键静态资源做一次预热,让新内容提前进入边缘节点。这个小动作看似多此一举,但能明显减少发布瞬间的回源峰值。CDN 的绝大多数问题都不是 CDN 本身的问题,而是源站没配合好。把源站的响应头、日志、证书、目录结构都理清楚了,CDN 这份工就稳定了一大半。