一、HTTP缓存机制详解
HTTP缓存通过减少重复请求提升性能,其核心依赖两个关键字段:Cache-Control和ETag。
1.1 Cache-Control指令配置
Cache-Control是HTTP/1.1引入的缓存控制头,通过指令组合实现精细控制:
Cache-Control: max-age=3600, public, immutable
- max-age:指定资源缓存有效期(秒),如
3600表示1小时后过期。 - public/private:
public允许中间节点(如CDN)缓存,private仅限用户浏览器缓存。 - immutable:告知客户端资源永不修改,可跳过验证直接使用缓存。
- no-cache/no-store:
no-cache需验证后使用缓存,no-store禁止缓存。
实践建议:
- 静态资源(如JS/CSS)建议设置
max-age=31536000(1年)并标记immutable。 - 动态API响应通常使用
no-cache,确保数据实时性。
1.2 验证机制:ETag与Last-Modified
当缓存过期时,客户端通过以下方式验证资源是否更新:
- ETag:服务器生成的唯一标识(如哈希值),客户端携带
If-None-Match头请求。If-None-Match: "686897696a7c876b7e"
- Last-Modified:资源最后修改时间,客户端携带
If-Modified-Since头。
优化技巧:
- 优先使用ETag,因其能精确检测内容变化,避免时间同步问题。
- 服务器响应
304 Not Modified时,客户端可复用本地缓存,减少数据传输。
二、CDN缓存配置策略
CDN通过分布式节点缓存资源,配置需兼顾性能与一致性。
2.1 缓存规则设置
CDN控制台通常提供以下配置项:
- 缓存时间(TTL):按文件类型或路径设置不同TTL。
/static/*.js → TTL=86400(1天)/api/* → TTL=60(1分钟)
- 缓存键(Cache Key):决定缓存唯一性的字段组合,如:
{uri}{host}{cookie}
建议排除无关字段(如
user-agent)以提升命中率。
案例分析:
某电商网站将商品详情页图片TTL设为24小时,价格API TTL设为5分钟,平衡了访问速度与数据实时性。
2.2 回源策略优化
当CDN节点无缓存时,需配置回源请求:
- 回源协议:支持
HTTP、HTTPS或协议跟随,建议启用HTTPS保障安全。 - 回源Host:指定源站域名,避免因CDN节点IP变化导致服务异常。
- 302跟随:是否追踪源站返回的跳转响应,动态内容建议开启。
性能数据:
启用协议跟随后,某金融平台回源失败率下降40%,因避免了SSL证书不匹配问题。
三、高级配置技巧
3.1 服务端缓存控制
Node.js示例:设置动态资源的缓存头
app.get('/api/data', (req, res) => {const data = fetchData(); // 获取数据res.set('Cache-Control', 'no-cache');res.set('ETag', generateETag(data));res.json(data);});
3.2 浏览器与CDN协同
- 阶梯式缓存:浏览器设短TTL(如5分钟),CDN设长TTL(如1小时),减少源站压力。
- Purge预加载:发布新版本前,主动推送资源到CDN并预热节点。
3.3 监控与调优
- 缓存命中率:目标>90%,低于此值需检查TTL或缓存键配置。
- 日志分析:通过CDN日志识别高频404请求,优化资源路径。
四、常见问题解决方案
-
缓存雪崩:同一时间大量缓存过期,导致源站崩溃。
- 对策:为TTL添加随机偏移量(如±300秒)。
-
污染攻击:恶意请求填充CDN缓存,占用空间。
- 对策:设置缓存大小上限,配置IP黑名单。
-
跨域问题:CDN资源被浏览器拦截。
- 对策:源站返回
Access-Control-Allow-Origin: *头。
- 对策:源站返回
五、总结与行动清单
- 静态资源:设置
max-age=1年+immutable。 - 动态API:使用
no-cache+ ETag验证。 - CDN配置:按文件类型分级TTL,启用HTTPS回源。
- 监控体系:建立缓存命中率、回源流量等指标看板。
通过系统化配置HTTP与CDN缓存,可显著降低服务器负载,提升用户访问速度。建议每季度复审缓存策略,适应业务变化。