简介:本文详细解析HTTP缓存与CDN缓存的配置原理,结合实战场景提供可落地的优化方案,帮助开发者提升资源加载效率。
HTTP缓存的核心是通过Cache-Control和Expires头控制资源生命周期。Cache-Control的max-age指令(单位秒)定义浏览器缓存有效期,例如:
Cache-Control: max-age=3600
表示资源在客户端缓存1小时。当需要强制验证缓存有效性时,可添加must-revalidate指令:
Cache-Control: max-age=3600, must-revalidate
Expires头通过绝对时间戳控制缓存过期,但受客户端时钟同步影响,建议优先使用Cache-Control。
当资源更新频繁时,采用协商缓存可减少传输量。ETag机制通过唯一标识符验证资源变化:
ETag: "686897696a7c876b7e"
浏览器后续请求携带If-None-Match头,服务器返回304状态码表示未修改。Last-Modified机制通过时间戳验证:
Last-Modified: Tue, 15 Nov 2022 08:12:31 GMT
对应请求头If-Modified-Since。实际开发中,ETag精度更高,推荐优先使用。
对于动态API响应或实时数据,需禁用缓存:
Cache-Control: no-store
或限制缓存范围:
Cache-Control: no-cache, private
private指令禁止中间代理缓存,适用于用户个性化内容。
主流CDN服务商(如阿里云CDN、腾讯云CDN)提供三级缓存机制:
配置时需设置合理的缓存规则,例如:
{
"path": "/*.js",
"cache_ttl": 86400, // 24小时
"follow_origin": true // 遵循源站Cache-Control
}
对于不常变更的静态资源,可设置更长TTL(如30天)。
当源站更新资源时,需通过Purge API主动刷新CDN缓存:
curl -X PURGE "https://cdn.example.com/app.js" -H "Host: cdn.example.com"
或配置URL规则自动刷新。部分CDN支持目录级刷新,提升运维效率。
默认缓存键基于完整URL,可通过配置忽略查询参数:
{
"ignore_query_string": true
}
适用于版本化资源(如app.v1.2.js)。对于需要区分参数的场景,可指定保留参数:
{
"cache_key": {
"host": true,
"path": true,
"query": ["token"] // 仅token参数参与缓存键生成
}
}
Nginx配置示例实现精细控制:
location ~* \.(js|css|png)$ {
expires 30d;
add_header Cache-Control "public, max-age=2592000";
}
location /api/ {
expires off;
add_header Cache-Control "no-cache, private";
}
Apache可通过.htaccess实现类似功能。
采用分层缓存策略:
通过Cache-Control: s-maxage=86400指定CDN专属缓存时间,区别于浏览器缓存。
建立缓存命中率监控体系:
典型优化指标:
现象:大量请求未命中缓存直达源站。解决方案:
策略:
对于CORS资源,需确保:
Access-Control-Allow-Origin: *
Cache-Control: public
避免因跨域限制导致缓存失效。
实际配置时,建议先在小流量环境验证缓存规则,通过AB测试对比性能指标。定期审查缓存策略,确保与业务发展同步。对于高并发系统,缓存配置的细微调整可能带来显著性能提升,需建立持续优化机制。