前端性能优化:请求和响应优化(HTTP缓存与CDN缓存)
一、HTTP缓存机制详解
-
强缓存(强制缓存)
- 原理:浏览器直接从本地缓存中读取资源,不发送请求到服务器。
- 控制字段 :
Cache-Control
(HTTP/1.1推荐):max-age=<秒>
:资源有效期(如max-age=3600
表示1小时)。no-store
:禁止缓存。no-cache
:不使用强缓存,需协商缓存验证。
Expires
(HTTP/1.0):绝对过期时间(如Expires: Wed, 21 Oct 2025 07:28:00 GMT
),但依赖系统时间,优先级低于Cache-Control
。
- 状态码 :命中时返回
200 OK (from cache)
,分为from memory cache
(内存缓存,如JS、图片)和from disk cache
(磁盘缓存,如CSS)。
-
协商缓存(对比缓存)
- 原理:浏览器发送请求到服务器,验证资源是否更新。
- 控制字段 :
- 响应头 :
ETag
:资源的唯一标识(如哈希值)。Last-Modified
:资源最后修改时间(GMT格式)。
- 请求头 :
If-None-Match
:对应ETag
的值。If-Modified-Since
:对应Last-Modified
的值。
- 响应头 :
- 流程 :
- 服务器对比
ETag
或Last-Modified
,若未修改返回304 Not Modified
,否则返回200
和新资源。
- 服务器对比
- 优势 :解决
Last-Modified
秒级精度和文件未修改但时间变化的问题。
-
缓存策略选择
- 静态资源 (如JS、CSS、图片):
- 使用强缓存,设置
Cache-Control: max-age=31536000
(一年)。 - 文件名添加哈希值(如
app.a1b2c3.js
),强制更新缓存。
- 使用强缓存,设置
- 动态资源 (如API接口):
- 使用协商缓存,结合
ETag
和Last-Modified
。
- 使用协商缓存,结合
- 强制刷新 :
Ctrl+F5
或Command+Shift+R
会绕过强缓存,直接请求服务器。
- 静态资源 (如JS、CSS、图片):
二、CDN缓存优化
-
CDN工作原理
- 流程:用户请求 → CDN节点 → 若缓存命中则返回 → 否则回源服务器获取并缓存。
- 优势:减少源站压力,加速资源传输(尤其是跨地域请求)。
-
CDN缓存策略配置
- 缓存时间设置 :
- 静态资源(如图片、字体):设置较长缓存时间(如7天)。
- 动态资源(如HTML):设置较短缓存时间(如1小时)或禁用缓存。
- 缓存刷新 :
- 手动刷新:通过CDN控制台或API触发刷新。
- 自动刷新:结合Webhook,当源站资源更新时自动通知CDN刷新。
- 忽略参数 :配置CDN忽略URL参数(如
?v=1.0.1
),避免重复缓存。
- 缓存时间设置 :
-
CDN与HTTP缓存协同
- 层级缓存 :
- 客户端缓存 → CDN缓存 → 源站缓存(如Redis)。
- 最佳实践 :
- 静态资源部署到CDN,并设置
Cache-Control: public, max-age=31536000
。 - 动态资源通过CDN回源,并启用协商缓存。
- 静态资源部署到CDN,并设置
- 层级缓存 :
三、实战优化步骤
-
配置HTTP缓存
-
Nginx示例 :
nginxlocation ~* \.(js|css|png|jpg|jpeg|gif|svg)$ { expires 1y; add_header Cache-Control "public, no-transform"; } location /api { etag on; if_modified_since exact; }
-
Apache示例 :
apache<FilesMatch "\.(js|css|png|jpg|jpeg|gif|svg)$"> Header set Cache-Control "max-age=31536000, public" </FilesMatch>
-
-
部署CDN
- 选择服务商(如阿里云、腾讯云、Cloudflare)。
- 配置缓存规则 :
- 静态资源:缓存时间设为365天,忽略URL参数。
- 动态资源:缓存时间设为1小时,启用协商缓存。
- 验证缓存 :
- 使用
curl -v
命令查看响应头中的Via
(CDN节点)和Age
(缓存时间)。 - 浏览器开发者工具 → Network → 查看资源状态码是否为
200 (from disk cache)
或304
。
- 使用
-
监控与调优
- 工具 :
- Chrome DevTools:分析缓存命中率。
- CDN控制台:监控流量、命中率及回源率。
- 调优策略 :
- 命中率低:延长缓存时间或优化资源版本管理。
- 回源率高:检查源站性能,优化CDN节点分布。
- 工具 :
四、常见问题与解决方案
-
资源更新后用户未看到最新内容
- 原因:强缓存未过期。
- 解决 :
- 修改文件名(如
style.v2.css
)。 - 在URL中添加版本号(如
?v=2
)。 - 通过CDN控制台手动刷新缓存。
- 修改文件名(如
-
CDN缓存未生效
- 原因:缓存规则配置错误或CDN节点未同步。
- 解决 :
- 检查CDN缓存规则是否覆盖目标资源类型。
- 使用
dig
命令或CDN诊断工具验证节点缓存状态。
-
协商缓存失效
- 原因 :服务器未正确设置
ETag
或Last-Modified
。 - 解决 :
- 确保服务器生成唯一的
ETag
(如基于文件内容哈希)。 - 配置服务器正确返回
Last-Modified
时间。
- 确保服务器生成唯一的
- 原因 :服务器未正确设置
五、总结
- HTTP缓存 :通过强缓存和协商缓存减少重复请求,优先使用
Cache-Control
。 - CDN缓存:部署静态资源到CDN,配置合理缓存时间,结合HTTP缓存策略。
- 监控与调优:定期分析缓存命中率,优化资源版本管理和CDN配置。
通过以上策略,可显著提升网站加载速度,降低服务器负载,优化用户体验。