4.1 接入 CDN:静态资源加速实操
网站上线第二周,朋友把官网链接发给一个外地客户,对方回了一句:“打开有点慢啊,翻到产品页要等好几秒。”我自己用公司网络测挺快,换成 4G 挂上调试工具一看,首屏足足 3 秒多——服务器只有 4M 带宽,WordPress 的主题又重,CSS、JS、图片全堆在源站上,每个请求都要跨省跑一趟。这一节记录我给官网接入 CDN(内容分发网络)的全过程,从为什么要接、怎么接、怎么验证,一直到最后算账。
先搞清楚:CDN 加速的是哪一部分
WordPress 页面由两类内容组成:一类是 PHP 动态生成的 HTML,每次请求都要服务器现场算;另一类是静态资源,包括样式表、脚本、主题自带的图片、上传的产品图。CDN 加速的是后者:把静态文件复制到全国各地的节点服务器上,访客就近取文件,源站只负责输出动态页面,带宽压力立刻就小了。对一台 4M 带宽的小服务器来说,这等于把最占带宽的那部分流量卸载了出去。
接入前我用 curl 测了三次首屏加载时间,又分地域粗测了一下延迟,跟接入后做了个对照:
| 指标 | 接入 CDN 前 | 接入 CDN 后 |
|---|---|---|
| 首屏加载(4G 网络) | 约 3.2 秒 | 约 1.4 秒 |
| 华南访客静态文件延迟 | 约 60ms | 约 15ms |
| 华北访客静态文件延迟 | 约 90ms | 约 20ms |
| 源站峰值带宽占用 | 接近 4M 上限 | 降至 1M 左右 |
数据是我自己手机和几个测试点实测的近似值,不同网络会有差别,但方向很清楚:静态资源走就近节点后,远距离访客的等待时间降了一大半,源站也从带宽焦虑里解脱出来——后来服务器跑备份任务也不至于卡到网站了。特别说明一下,这套数据不是一接入就有的,节点缓存填满需要一两天,完整命中之后数字才稳定。所以测速别着急,给 CDN 一两天的预热期再下结论,否则会误以为接入没效果。
接入步骤:四步走完
整个接入在控制台里点一点加上改一条解析就能完成。操作细节见 CDN 文档,我这里只讲关键动作和容易错的地方。
第一步,添加加速域名。在 CDN 控制台添加一个子域名,比如 cdn.example.com(前提是域名已备案、解析在 DNSPod 上,见 3.2 节)。加速类型选静态加速,服务地域选中国大陆,如果是外贸站可以叠加境外。这里注意:一旦接了 CDN,源站的公网 IP 就等于暴露给了节点,安全上要配合 4.3 节的防火墙规则一起看。
第二步,填写源站。源站类型选“自有源站”,填轻量应用服务器的公网 IP,回源端口填 443(前提是 3.4 节的 SSL 证书已经部署好,回源走 HTTPS 更安全),回源协议选“协议跟随”。这里有个坑:我最初填成 80,结果源站做了 HTTPS 强制跳转,CDN 回源时被 301 重定向绕了一圈,命中率上不去,排查了半天才发现状态码缓存里可以设置对 301 也缓存,但更干净的做法是一开始就让回源走 443。
第三步,CNAME 解析。接入完成后 CDN 会给你一个 CNAME 地址,形如 cdn.example.com.cdn.dnsv1.com,到 DNSPod 控制台给 cdn.example.com 添加一条 CNAME 记录指向它,TTL 保持默认的 600 秒,等几分钟生效。用 nslookup 验证一下:
nslookup cdn.example.com
解析结果能出来 CNAME 目标就说明生效,以后所有对静态文件的请求都会被就近分配到某个节点。
第四步,在 WordPress 里替换静态资源路径。这一步是让插件代劳的:装一个带 CDN 功能的缓存插件(我用的 WP Super Cache 自带的 CDN 功能,也常用 WP Rocket、W3 Total Cache),把 CDN 域名填进去,插件会自动把页面里的静态文件地址改写成 cdn.example.com/...。WordPress 上传的图片默认在 wp-content/uploads/ 目录下,主题自带的图片在 wp-content/themes/主题名/ 下,插件的脚本样式在 wp-content/plugins/ 下——这些路径插件都会统一改写,一般不用手动改模板文件。
验证是否命中:看响应头
配好之后不能只凭感觉,要验证节点有没有真正缓存住文件。用 curl 命令查看响应头:
curl -I https://cdn.example.com/wp-content/uploads/2026/09/cover.jpg
重点看两个返回头:X-Cache-Lookup: Hit From MemCache(或类似的 Hit From xxxCache)表示节点已缓存命中;如果是 Miss,说明请求还回源了,需要检查缓存规则或等待首次预热。另外响应头里还会有 X-NWS-LOG-UUID 之类的节点标识,能确认请求确实从 CDN 节点而不是源站发出。我第一次接入时盯着这个头看了十几分钟,从全是 Miss 到慢慢变成 Hit,确认生效。控制台的缓存命中率统计也值得挂几天,我接完三天后命中率稳定在九成以上才算放心。
接入之后我没敢撒手不管,而是连续观察了一个星期。第一周命中率会经历一个爬升过程:节点第一次取文件是 Miss,之后慢慢都变成 Hit,三天左右稳定在九成以上。稳定之后值得关注的还有一个变化:服务器的负载降了。之前每个静态请求都要 nginx 处理一次,现在全被节点挡在外面,服务器的 CPU 和带宽都闲了下来,跑备份任务也不至于卡到网站响应。朋友后来跟我说,他在各个群里发的官网链接,再没人回过“有点慢”了。
踩坑与解法
坑一:域名没在 CDN 控制台做配置就以为生效了。我第一次改完 CNAME 直接刷新页面测速,结果静态文件 404——CDN 那边域名还处于“未配置”状态,解析指过来也没用。这事教育我:每一步做完都验证一次,别把三步连着做完才一起测,出了问题都不知道卡在哪一步。
坑二:动态接口走了 CDN。留言表单提交的地址被插件误改写到了 CDN 域名,表单偶尔提交失败。解法是在插件里把 wp-admin、wp-login.php 和 REST API 路径加进排除规则,只让静态文件走 CDN。
坑三:HTTPS 证书不一致。CDN 域名本身也要配证书,否则浏览器会报混内容警告。我在 SSL 证书控制台给加速域名单独申请了一张免费 DV 证书,一键部署到 CDN,HTTPS 配置的说明见 CDN 文档。
坑四:刷新缓存用了带查询参数的 URL。有些统计代码会给静态文件加版本号参数,如果 CDN 配置成忽略查询参数缓存,不同参数的请求会命中同一份文件——改文件后无法靠加参数强制更新,只能走 4.2 节的刷新流程。这块要根据自己主题实际情况选。
坑五:接入前没检查源站配置。CDN 本质上是挡在源站前面的一层,源站任何问题都会被放大到全国节点。我接入前列了个小 checklist 逐项确认:域名备案已通过、SSL 证书已部署在轻量上(3.4 节)、WordPress 站点地址和首页地址设置正确(不然插件改写路径会串)、数据库运行正常。这张清单帮我提前避开了混内容和重定向循环两个大坑,建议接入前照着过一遍。
成本语境:接入之后要看账单
CDN 按流量计费,小站点买流量包很便宜,但被刷流量会肉疼——这个教训在 4.4 节详细说过,这里只提醒一句:接入 CDN 之后一定要同时配上流量告警。整体算下来,服务器加域名加 CDN 一年也就几百块量级,赶上活动的时候,轻量应用服务器 2 核 2G4M 99 元/年起,特惠热卖中,比按零售价续费省不少。
网站再大一点、访客再多一点,就需要云服务器加云数据库的组合了,可以看我另一本腾讯云实战手记;CDN 节点地域选择的进阶思路,见网站加速与地域优化实践。
