当用户反馈“网站变慢了”或“图片加载不出来”,而你的源站明明没有故障,CDN 加速失效往往是罪魁祸首。但 CDN 加速失效并不总是单一原因,它可能涉及缓存配置、回源链路、安全防护甚至边缘代码。本文将从实际问题切入,带你一步步定位并解决。
1. 缓存命中率低:为什么 CDN 没有缓存你的内容?
最常见的原因是缓存规则配置不当。CDN 的加速本质是让内容在边缘节点缓存,减少回源。如果缓存命中率低,每次请求都回源,加速自然失效。你可以在 CDN 控制台查看缓存命中率指标,如果低于 80% 就值得警惕。
首先检查默认缓存行为:Cloudflare 官方文档指出,CDN 会缓存常见的静态资源(如图片、CSS、JS),但默认不会缓存 HTML 页面。如果你的站点是动态页面,需要配置 Cache Rules 明确指定哪些资源缓存、缓存多久。
操作步骤:
- 打开 CDN 的缓存设置,查看“缓存规则”或“页面规则”。
- 为静态资源设置较长的缓存时间(如 30 天),为动态页面设置更短的缓存或绕过缓存。
- 启用 Tiered Cache(分层缓存),让边缘节点从上层节点获取内容,减少回源压力。
常见误区:以为设置缓存后立刻生效。实际上,CDN 需要时间填充缓存,且缓存内容有 TTL。如果源站更新了内容,而 TTL 未过期,用户可能看到旧版本,这不是失效,而是缓存一致性策略问题。
2. 回源失败或超时:源站响应慢导致加速失效
如果源站响应缓慢或返回 5xx 错误,CDN 即便缓存了内容,也可能因为回源失败而无法刷新缓存,或者只能返回缓存中的过期版本。更糟的是,如果缓存未命中,用户的请求会直接打到源站,体验极差。
判断方法:在浏览器中直接访问源站 IP 或域名,看响应时间是否正常。如果源站慢,CDN 加速效果会被回源拖累。
解决方法:
- 优化源站性能,如启用 HTTP/2、开启 Gzip 压缩。
- 配置合理的回源超时时间(如 30 秒),超时后 CDN 可以返回缓存内容(如果配置了 stale-if-error)。
- 使用负载均衡分散源站压力,Cloudflare Load Balancing 可以将流量分发到多个端点,减少单点压力。
失败条件:如果源站完全宕机,CDN 只能返回 502/504 错误。此时需要结合回源监控和告警处理。可参考站内文章《CDN回源502/504故障排查与Upstream优化实战》。
3. DDoS 攻击:安全防护误伤正常流量
DDoS 攻击不仅会耗尽源站资源,还可能触发 CDN 的防护机制,导致正常请求被拦截或限速,表现为加速失效。Cloudflare 的 DDoS 防护系统会自动检测并缓解攻击,但有时会误伤。
判断方法:查看 CDN 的防火墙或安全事件日志,是否有大量拦截记录或挑战页面。
解决方法:
- 调整 DDoS 防护的托管规则,将过于严格的规则放宽,或添加白名单。
- 如果攻击针对特定 URL,可以自定义规则精确匹配。
- 启用“Under Attack Mode”临时保护,但注意该模式会显示挑战页面,可能影响用户体验。
常见误区:以为所有流量异常都是攻击。实际上,某些爬虫或热点事件也会导致流量激增,需要区分是正常流量还是恶意流量。
4. 边缘计算脚本错误:Worker 或边缘函数干扰缓存
如果你在 CDN 边缘运行代码(如 Cloudflare Workers),脚本中的错误可能导致响应头异常、强制回源,甚至返回错误页面,从而让 CDN 加速失效。例如,脚本可能修改了 Cache-Control 头,导致 CDN 不缓存。
检查步骤:
- 查看 Worker 的日志,是否有异常抛出。
- 审查脚本中是否设置了 set-cookie 或 cache-control: no-store 等头。
- 暂时禁用 Worker,看加速是否恢复,以隔离问题。
取舍:边缘计算增加了灵活性,但也引入了新的故障点。如果脚本不是必须的,建议先删除或简化,再逐步添加功能。
5. 缓存清除与强制刷新:操作不当导致内容陈旧
当你更新了源站内容,需要主动清除 CDN 缓存。如果清除不及时或范围不对,用户会持续看到旧内容,误以为加速失效。Cloudflare 支持即时清除缓存,可以单独清除某个文件或全部清除。
操作方法:在 CDN 控制台找到“Purge Cache”,输入要清除的 URL 或选择全部清除。注意:清除缓存后,首次请求会回源,可能导致短暂变慢。
常见误区:清除缓存后立即测试,但 CDN 边缘节点可能尚未完全同步,需要等待几分钟。
6. 配置冲突:多级代理或 DNS 解析问题
如果你的域名同时使用了多个 CDN 或代理(如源站前又套了一层 CDN),可能导致缓存头丢失或回源链路复杂化。DNS 解析错误也会让用户无法连接到最近的节点。
检查方法:
- 使用 dig 命令查看 DNS 解析结果,确认指向 CDN 的 CNAME。
- 检查 HTTP 响应头,看是否包含 CDN 特有的头(如 CF-Cache-Status)。
- 如果有多级 CDN,需要确保每一级都正确传递 X-Forwarded-For 头,否则可能影响回源和防护。可参考站内文章《CDN背后真实IP去哪儿了?一文讲透X-Forwarded-For伪造漏洞与正确防护》。
7. 实时连接优化:WebSocket 等长连接加速失效
对于 WebSocket 等长连接,CDN 默认可能不缓存,但如果配置不当,可能出现超时或无法连接。Cloudflare 支持 WebSocket 代理,但需要开启相关设置。如果加速失效,检查是否启用了 WebSocket 支持,以及超时时间是否过短。
排查步骤:
- 在 CDN 设置中启用 WebSocket。
- 调整超时时间,确保长连接不被中断。
- 如果问题依旧,可参考站内文章《CDN 加速后 WebSocket 频繁超时?别慌,这份小白排查指南帮你解决》。
总结:定位问题需要系统性排查
CDN 加速失效并非单一原因,而是多种因素叠加。建议按照以下顺序排查:先看缓存命中率,再查回源日志,然后检查安全防护和边缘脚本,最后确认 DNS 和连接配置。每一步都要结合日志和数据,避免盲目调整。
如果以上方法都无法解决,可能是 CDN 服务商自身的边缘节点故障,此时需要联系服务商支持。
参考资料
延伸阅读
