新闻
我们更期待的是,能在与您的沟通交流中获得启迪,
因为这是我们一起经历的时代。
分类
相关文章
热门标签

优化cdn加速网址缓存规则提升静态资源命中率的实战方法

2026年7月29日

1. 概述:为什么要优化CDN缓存规则

1. 目的:提高静态资源(JS/CSS/图片/字体)被边缘节点命中率,降低回源、缩短响应时间。
• 成本与延迟:命中率低会导致频繁回源,增加带宽与延迟。
• 策略方向:规范 URL/查询参数、按类型设置 TTL、减少转发 header/cookie、版本化资源、监控与验证。

2. 第一步:采集与审计现网请求日志

2. 操作步骤:先看清楚哪些 URL 最多被请求并且经常 MISS。
• 从 CDN 或 Web 服务器导出最近 7~30 天访问日志(Cloudflare/CloudFront/S3/NGINX)。
• 用工具统计 top URL、按路径、按 query-string、按 cookie 分组(示例命令:awk/grep + sort -n)。
• 目标项:找出带有无意义 query 参数、不同指纹但相同文件名、以及被转发了大量 header/cookie 的静态文件。

3. 第二步:在源站设置正确的缓存头

3. 操作步骤:源站直接下发可靠的 Cache-Control 与 ETag/Last-Modified。
• 长期可缓存的静态文件(带指纹哈希)示例:Cache-Control: public, max-age=31536000, immutable
• 可短期缓存或 HTML:Cache-Control: public, s-maxage=60, max-age=10, stale-while-revalidate=30
• Nginx 示例:add_header Cache-Control "public, max-age=31536000, immutable"; 然后重启 Nginx 并确认生效。
• 同时保持 ETag 或 Last-Modified 以支持条件请求(304)。

4. 第三步:规范 CDN 缓存键(Cache Key)与忽略/白名单查询字符串

4. 操作步骤:减少因 query string 导致的 cache miss。
• 检查哪些 query 参数对资源内容有影响(例如 v=hash, ts= 时间戳)并将 v 放入白名单,忽略无关参数(utm_source 等)。
• 在 CloudFront:Behavior → Cache Based on Selected Request Parameters → 仅选择必要的 Query String。
• 在 Cloudflare:Page Rule 或 Transform Rules → 对静态路径选择 “Ignore Query String” 或使用正则标准化。
• 示例正则:将 /static/(.+)\?.* 的缓存键规范为 /static/$1。

5. 第四步:按资源类型分级 TTL 与不转发不必要 Header/Cookie

5. 操作步骤:为不同类型设置不同 TTL,并在 CDN 中清除无意义头/cookie。
• 建议:哈希文件(js、css、woff2、png)最大 TTL = 1 年;图片可同样设置较长;HTML/JSON 设置较短并允许 stale-while-revalidate。
• 禁止转发 Cookie 与大多数自定义 Header 给静态路径(会破坏共享缓存)。在 CDN 行为中设置“不要转发 Cookie/Headers”。
• 检查响应 Header:curl -I https://yoursite/static/app.js 并确认 cf-cache-status/X-Cache/age/Cache-Control。

6. 第五步:版本化与回滚策略、以及缓存清除(Purge)流程

6. 操作步骤:使用文件名哈希并建立快速清除流程。
• 构建阶段把 hash 写进文件名(app.abcdef.js),发布即是原子替换,旧文件可以长期缓存。
• 清除示例:CloudFront → aws cloudfront create-invalidation --distribution-id DIST --paths "/static/*";Cloudflare API:curl -X POST "https://api.cloudflare.com/client/v4/zones//purge_cache" -H "Authorization: Bearer " -H "Content-Type: application/json" --data '{"files":["https://example.com/static/app.js"]}'.
• 建议建立自动化脚本并记录清除操作,避免滥用导致成本或延迟。

7. Q&A 1:如何快速判断 CDN 是否命中(一问一答)

7. 问:如何在请求层面快速判断资源是否被 CDN 命中?

7. 答:使用 curl -I 并观察返回 header,如 cf-cache-status/ X-Cache/age。示例:curl -I https://example.com/static/app.js 如果看到 cf-cache-status: HIT 或 X-Cache: Hit from cloudfront,且有 Age 字段 >0,即为命中。若为 MISS/EXPIRED 则为回源。

8. Q&A 2:常见导致命中率低的四类问题

8. 问:常见导致静态资源命中率低的主要原因有哪些?

8. 答:1) 无谓的 query-string 导致缓存分裂;2) 转发了 Cookie 或过多 Header;3) 未对哈希文件设置长 TTL;4) 缓存键包含用户特定信息(Host、Auth header)。排查后按上面步骤修复即可显著提升。

9. Q&A 3:实践后的监控与优化周期建议

9. 问:完成规则调整后应如何验证与持续优化?

9. 答:1) 监控命中率(CDN 控制台/自建统计)与回源流量,目标命中率逐步上升到 90%+(视业务);2) 每次发布后检查 top-miss 列表并修正规则;3) 建议 1~2 周一次回顾策略并在 CI/CD 中加入缓存 header 校验与自动化 purge 流程。

加速CDN