4、内容分发网络实战:CDN服务商选择、域名CNAME配置、HTTPS证书部署、缓存规则设置、刷新预热操作

CDN 这东西,说白了就是「离用户近一点」。我早年做海外业务时,东南亚用户打开页面要 8 秒,加上 CDN 后直接降到 1.2 秒。嗯,这章咱们就把 CDN 从选厂商到日常运维,完整走一遍。

4.1 选 CDN 服务商,我踩过的坑

市面上的 CDN 厂商很多,阿里云、腾讯云、网宿、Cloudflare、Akamai。怎么选?我个人习惯看三个维度:

  • 节点覆盖:国内业务优先选阿里云或腾讯云,海外必须看 Akamai 或 Cloudflare。我在项目中遇到过某小厂商,东南亚只有 3 个节点,高峰期直接炸了。
  • HTTPS 支持:现在全站 HTTPS 是标配。有些厂商免费证书额度少,或者不支持 ECC 证书,这个要提前问清楚。
  • 刷新预热 API:运维自动化离不开这个。我建议选 API 文档清晰、QPS 限制宽松的厂商,不然上线时刷个缓存要等半小时。

核心建议:不要只看价格。CDN 的 SLA 和工单响应速度,才是真正影响线上体验的。我曾经因为某厂商工单 24 小时才回复,导致故障持续了一整天。

4.2 域名 CNAME 配置,别搞反了

CNAME 配置是 CDN 接入的第一步。流程其实很简单:

  1. 在 CDN 控制台添加加速域名,比如 static.example.com
  2. CDN 会给你一个 CNAME 目标,比如 static.example.com.w.kunlun.com
  3. 去你的 DNS 解析商,给 static.example.com 添加一条 CNAME 记录,指向上面那个目标

这里有个坑——CNAME 不能和根域名共存。如果你想把 example.com 也加速,得用 DNS 厂商的「显性 URL」或「CNAME 拉平」功能。我刚开始做的时候,直接把根域名配了 CNAME,结果 MX 邮件记录全失效了,被运维老大骂了一顿。

注意:CNAME 生效时间取决于 DNS 的 TTL。我习惯在配置前先把 TTL 改成 60 秒,等解析稳定后再改回 600 秒。这样切换过程几乎无感知。

4.3 HTTPS 证书部署,三步搞定

现在 CDN 都支持免费证书,我个人推荐用 Let's Encrypt 或各家自带的免费证书。部署流程:

  • 上传证书:在 CDN 控制台的「证书管理」里,上传你的 PEM 格式证书和私钥。注意私钥不能加密,否则 CDN 节点无法加载。
  • 选择加密方式:我建议开启 TLS 1.2 和 1.3,关闭 TLS 1.0/1.1。曾经有安全扫描报告说我的站点支持 TLS 1.0,吓得我赶紧改了。
  • 强制跳转:开启 HTTP 自动跳转 HTTPS,状态码用 301。嗯,这里要注意,有些 CDN 的跳转配置在「回源配置」里,别找错了。

小技巧:如果你用 ECC 证书,记得确认 CDN 节点是否支持。我遇到过某厂商的旧节点不支持 ECC,导致部分用户访问失败。后来我改用 RSA+ECC 双证书方案才解决。

4.4 缓存规则设置,别让动态接口也缓存了

缓存规则是 CDN 的核心。设置不对,要么命中率低,要么缓存了不该缓存的内容。我的经验是分三类:

资源类型 缓存时间 示例路径
静态图片、CSS、JS 30 天 /static/*
HTML 页面 10 分钟 /*.html
API 接口 不缓存 /api/*

你想想看,如果 API 接口被缓存了,用户看到的永远是旧数据。我在项目中遇到过,某个同事把 /api/user/info 缓存了 1 小时,结果用户修改头像后,页面一直显示旧头像。排查了半天才发现是 CDN 缓存的问题。

另外,缓存优先级也很重要。CDN 一般支持按目录、文件后缀、文件名匹配。我习惯把精确路径的规则放在前面,通配符放后面。比如:

# 优先级从高到低
/api/*          → 不缓存
/static/*.js    → 缓存 30 天
/static/*       → 缓存 7 天
/*.html         → 缓存 10 分钟

4.5 刷新预热操作,上线前的必修课

每次更新资源后,必须做两件事:刷新预热

  • 刷新:清除 CDN 节点上的旧缓存。支持 URL 刷新和目录刷新。我建议用 URL 刷新,更精准。比如更新了 /static/app.js,就只刷新这一个文件。
  • 预热:让 CDN 主动回源拉取新资源,提前缓存到各节点。这样用户第一次访问时,就能直接从 CDN 节点拿到数据,不用等回源。

我曾经犯过一个错:只刷新不预热。结果用户第一次访问时,CDN 节点没有缓存,全部回源,源站瞬间被打爆。后来我学乖了,每次上线前先预热,再刷新。顺序别搞反了——先预热,再刷新,这样新资源已经缓存好了,刷新只是清除旧版本。

自动化脚本示例:我习惯写一个脚本,上线时自动调用 CDN API 做刷新和预热。比如用 curl 调用阿里云 CDN 的刷新接口:

curl -X POST https://cdn.aliyuncs.com/ \
  -d "Action=RefreshObjectCaches" \
  -d "ObjectPath=https://static.example.com/app.js" \
  -d "ObjectType=File"

4.6 一张图看懂 CDN 实战流程

下面这张 SVG 图,把 CDN 从选型到运维的完整链路画出来了。我建议你保存下来,每次上线前对照检查一遍。

CDN 实战流程总览 1. 选 CDN 厂商 节点覆盖 / HTTPS / API 2. CNAME 配置 DNS 解析 / TTL 调整 3. HTTPS 部署 证书上传 / TLS 配置 4. 缓存规则设置 静态/动态/API 分类 5. 刷新 & 预热 先预热 / 后刷新 6. 验证 & 监控 命中率 / 延迟 / 错误率 避坑指南 • CNAME 不能和根域名 MX 记录共存 • 刷新和预热顺序:先预热,再刷新 • API 接口务必设置「不缓存」

个人经验:CDN 配置完成后,一定要用 curl 测试一下响应头。看看有没有 X-Cache: HITX-Cache: MISS,确认缓存是否生效。我每次上线前都会跑一遍这个检查,已经成了肌肉记忆。

好了,CDN 实战这块就这些。记住:选对厂商、配好 CNAME、部署 HTTPS、设置缓存规则、做好刷新预热。这五步走完,你的站点加速基本就稳了。


公众号:蓝海资料掘金营,微信deep3321