1.
全面准备:评估现状与制定目标
(a) 使用curl和浏览器DevTools评估当前响应头:curl -I -L https://example.com/path。(b) 列出静态资源(js/css/png、fonts)与动态页面,确定哪些可长期缓存,哪些必须回源。(c) 目标量化:TTFB、缓存命中率、带宽节省百分比。
2.
设置正确的缓存响应头(可复制模板)
(a) 静态资源(指纹化):Cache-Control: public, max-age=31536000, immutable。(b) 可短期缓存的API/HTML:Cache-Control: public, max-age=60, s-maxage=300, stale-while-revalidate=30。(c) 私有数据:Cache-Control: private, no-store。同时确保不要在静态资源上返回Set-Cookie。
3.
缓存键与查询字符串策略实操
(a) 推荐:对CSS/JS/图片使用“忽略查询字符串”或只包含白名单参数(如 ?v=hash)。(b) 在CDN管理面板设置:Cache Key = URL path + Host +(可选)selected query params。(c) 测试:curl -I "https://example.com/app.js?v=1" 与无参数比对缓存命中头(X-Cache/X-Cache-Status)。
4.
文件指纹化与发布流程(避免频繁清理)
(a) 构建工具输出带hash的文件名:app.3a9b2.js。(b) 发布流程:CI构建->上传到对象存储->更新HTML模板引用新文件名->部署。(c) 优点:不需要实时purge,减少缓存混乱。
5.
高效清理(Purge)与预热(Warm-up)操作步骤
(a) 首选指纹化避免purge;必要时使用API按文件列表清除。Cloudflare示例:curl -X POST "https://api.cloudflare.com/client/v4/zones/$ZONE/purge_cache" -H "Authorization: Bearer $TOKEN" -H "Content-Type:application/json" --data '{"files":["https://example.com/app.js"]}'.(b) 批量更新后执行预热:用小程序或脚本请求热门URL,触发边缘缓存。建议并发控制为5-20线程,避免制造回源风暴。
6.
压缩与传输优化(Brotli/Gzip/HTTP/2/3)
(a) 在CDN或源站启用Brotli优先,gzip作为fallback。确保Content-Encoding头正确。 (b) 启用HTTP/2或HTTP/3:在CDN面板确认支持和TLS配置。 (c) 使用curl测试:curl -H "Accept-Encoding: br" -I https://example.com/file.js,查看Content-Encoding。
7.
头部优化与安全策略(CORS/缓存与Cookies)
(a) 对静态资源设置Access-Control-Allow-Origin:*(字体、CDN跨域资源)。(b) 避免跨静态资源返回Set-Cookie;若需用户相关缓存,使用不同子域(static.example.com)。(c) 设置Strict-Transport-Security和合适的TLS版本在CDN或负载均衡器上。
8.
回源优化与Origin Shield
(a) 开启Origin Shield或选择离源最近的中间层以减少回源压力。(b) 设置合适的缓存层级:边缘->中间层->源站;在源站实现合理的Cache-Control和If-Modified-Since支持。(c) 使用CDN日志/源站日志比对回源请求频率,识别无效缓存键。
9.
监控与告警实操步骤
(a) 指标:缓存命中率、回源QPS、带宽、响应时间、4xx/5xx比例。(b) 将CDN指标接入Prometheus/Grafana或CDN日志转储到ELK。(c) 设置阈值告警(例如回源QPS突增>50%触发告警)。
10.
常见误区一:HTML被错误缓存导致用户看到旧内容
(a) 原因:未分化HTML与静态资源缓存策略。 (b) 解决:对HTML使用短TTL或private,no-cache,并使用ETag/Last-Modified配合s-maxage策略。 (c) 推荐流程:模板用短缓存,资源用长缓存+指纹。
11.
常见误区二:滥用Purge导致回源风暴
(a) 避免频繁全量清理;优先按资源文件purge或使用版本化。 (b) 若必须清理,分批并发限制在10以内,并在低峰期执行。 (c) 对于CDN提供的批量API,使用队列/节流器控制请求速率。
12.
常见误区三:忽视缓存键和Cookie导致命中率低
(a) 检查请求头是否有不必要的Cookie或Authorization被包含在缓存键内。 (b) 在CDN设置中排除Cookie或仅保留必要的Cookie。 (c) 测试步骤:用curl -H "Cookie: a=1" 比对无cookie请求的X-Cache状态。
13.
问:如何快速判断某个资源是否被CDN缓存命中?
使用curl查询响应头:curl -I -L https://example.com/file.js。检查常见字段:X-Cache、X-Cache-Status、Age、Via。若看到X-Cache: HIT或X-Cache-Status: HIT并且Age>0,则为命中;若为MISS或直接回源响应头无这些字段,则未命中。
14.
问:发布新上线版本如何做到零停机且不影响缓存?
答案:采用文件指纹化+灰度步骤。先在CI生成带hash的资源并上传对象存储,回滚变更不会影响旧版资源。更新HTML入口时可先做少量流量灰度(DNS/负载均衡或CDN规则),确认无问题后全量切换,避免purge。
15.
问:运维常用的CDN故障排查清单有哪些可执行步骤?
答案:1) 用curl对边缘节点和直接源站分别测试头与响应;2) 检查Cache-Control、Set-Cookie、Vary等头;3) 查看CDN日志与源站日志比对回源量;4) 在CDN面板查看节点健康与TLS证书;5) 若回源异常,按时间线回溯发布/配置变更并回滚或临时禁用特性。