决定 CDN 应交付什么内容
从清单开始。将有版本号的资源(例如图片、样式表、脚本、字体和下载文件)与 HTML、API、账户页面、结账和管理页面区分开。CDN 常按需填充缓存:首次请求可能到达源站,而后续匹配请求可在边缘被服务。附近的边缘节点与缓存命中是两种不同的收益。
记录为每个路径提供内容的主机、应用、存储桶或负载均衡器;它必须能在缓存未命中时响应。
先处理对每位访客相同且可以安全保留直到宣告寿命结束的资源。
不要共享个性化仪表板、会话绑定页面或客户数据,除非由具备资格的工程师设计并测试了隔离机制。
根据内容行为设定缓存策略
HTTP 响应头表达缓存行为。Cache-Control 指示响应是否可以被存储以及保持新鲜的时长;TTL(生存时间)即该新鲜期。浏览器是私有缓存,而 CDN 通常是共享缓存。使用明确的头部。HTTP 标准允许用 s-maxage 为共享缓存单独设置寿命,而不等同于 max-age。
在内容变更时发布新 URL(例如内容哈希文件名),然后为该不可变版本设置长且被记录的寿命。
根据过期内容的代价选择短寿命或验证行为;不要将用于价格、库存或账户状态的规则复用到 HTML。
对单一用户的响应使用 private。仅凭一个 cookie 并不能使响应对共享缓存安全。
把失效(清除)当作例外,而非发布计划
失效(或称清除)是指要求托管 CDN 在正常过期前丢弃选定存储对象。把它用于纠正,而不是每次部署都使用。在清除前确认源站已返回替换内容;否则重新填充可能再次保存错误响应。浏览器缓存不受 CDN 清除控制,因此 URL 版本化仍是可变文件的可靠方法。
优先使用特定路径、发布组或供应商支持的缓存标签,而不是全站清除;大范围未命中可能会突然压垮源站。
分布式清除可能不会同时到达每个边缘节点。检查供应商的完成语义并测试代表性 URL。
记录旧 URL 与新 URL、缓存规则、清除范围、预期结果与回退步骤。
把源站放在交付层之后
直接访问源站会绕过 CDN 缓存和边缘控制。限制直接访问,使 CDN(以及经过授权的路径)成为唯一能到达源站的方式。根据你的技术栈,使用云源站访问控制、防火墙规则(带有文档化的 CDN 出口范围)、专用网络、签名的源请求或双向 TLS(mTLS),让双方使用证书进行身份验证。
从授权的测试地点确认源站拒绝公开请求,而 CDN 的主机名能正常工作。
按身份和网络范围来限定健康检查、部署工具和内部访问,而不是使用宽泛的公共规则。
源站认证因 CDN 与源站而异。使用当前供应商设置指南并进行安全审查。
将 TLS 视为两段连接
边缘的 HTTPS 保护访问者到 CDN 的连接,但 CDN 到源站的连接也需要保护。要求两段都加密、根据 CDN 模式验证源站证书,并明确主机名与续期归属。OWASP 建议默认使用 TLS 1.3,并允许为兼容性保留 TLS 1.2;建议禁用 TLS 1.0 与 1.1。对于受监管数据、支付流程或不寻常的客户端兼容性,需要取得合格审查。
列出边缘与源站证书的负责人、续期路径与失效响应。
测试 HTTP 到 HTTPS、规范主机名与深层链接重定向,防止循环或路径丢失。
加密并不意味着响应可安全缓存;对已认证、个人化与支付相关页面单独设置缓存规则。
在改变流量前测试真实交付路径
先在暂存主机名或有限的生产路径上开始,然后测试 CDN 主机名,而不仅仅是源站。Chrome DevTools 的 Network 面板显示请求状态、域、时序、大小和头部。通过执行空缓存的强制重载来近似首次访问,然后再做重复访问以检查重用。比较期望的头部与内容,而不仅是看起来更快的页面。当受众分布广泛时,从代表性区域重复测试。
检查 Cache-Control 与供应商的 cache-status 头。确认公共资源被重用,敏感页面没有意外共享。
在大范围上线前,演练一次未命中、过期内容更正、源站错误与回滚某一资源或路由的流程。
保存测试过的 URL、头部抓取、路由规则版本以及变更记录前后的时序数据。
按运营需求选择 CDN,然后验证它
不要只按节点数量或泛泛的速度宣称选择 CDN。性能随地理、时段、流量分布、路由和缓存命中率而异。在有代表性的路由、资源和地域上比较候选者。询问每个供应商是否支持你需要的缓存控制、定向失效、源站限制、证书工作流、日志、访问角色、定价、支持和变更流程。
对候选者使用相同的缓存头、源站行为与页面;分别记录首次访问与重复访问的结果。
审查请求、传输、失效、日志与支持成本,以及缓存未命中激增的影响。定价与可控项随套餐而异。
在覆盖关键路由前,要求可导出的配置、最小权限、经过测试的回滚和明确的负责人。
