通过Nginx的expires指令为带哈希或版本号的静态资源(JS、CSS、图片等)设置1年缓存并添加immutable标识,可显著提升缓存效率与QPS;HTML应禁用Expires以强制校验;需验证响应头、避免查询参数导致CDN缓存失效。

通过Nginx配置Expires头,能让浏览器缓存静态资源(如CSS、JS、图片),显著减少重复请求,从而降低服务器负载、提升并发吞吐量。关键不在于“加缓存”,而在于“让缓存更准、更久、更可控”。
明确哪些资源该设Expires
动态内容(如PHP、API接口)不应设置Expires;只有真正不变或长期稳定的静态资源才适合:
- CSS、JavaScript文件(尤其带版本号或哈希值的,如
app.a1b2c3.js) - 图片(logo.png、banner.jpg等)
- 字体文件(.woff2、.ttf)
- 图标(favicon.ico、apple-touch-icon.png)
避免对未加指纹的通用文件(如main.css)设置过长缓存,否则更新后用户可能无法及时获取新版本。
用expires指令精准控制缓存时长
Nginx中优先使用expires指令而非手动写add_header Expires,因为它会自动计算并同步设置Cache-Control: max-age,兼容性更好:
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff2|ttf|eot)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}说明:
-
expires 1y:生成Expires时间戳,并等效设置Cache-Control: max-age=31536000 -
immutable提示浏览器:该资源在过期前绝不会变更,可跳过条件请求(如If-None-Match),进一步减少HEAD/304交互 - 对HTML文件建议设为
expires -1或不设,强制每次校验(配合ETag或Last-Modified)
结合版本化路径或查询参数规避缓存失效问题
若资源内容更新但文件名未变(如style.css),浏览器会继续用旧缓存。解决方法有两种:
-
推荐:文件名哈希化——构建时生成
style.a8f3b2.css,URL变更即触发新缓存,expires 1y可放心用 - 次选:添加查询参数(如
style.css?v=20240520),需确保Nginx不因?忽略缓存(默认已支持,无需额外配置)
注意:expires对带查询参数的URL同样生效,但CDN或代理可能忽略?v=xxx做缓存键,所以哈希文件名更可靠。
验证与调优要点
上线后务必验证响应头是否生效:
- 用
curl -I https://yoursite.com/app.js检查是否含Expires和Cache-Control - 在Chrome DevTools → Network中查看资源状态码:应为
200 (from memory cache)或200 (from disk cache),而非304或反复200 - 高并发压测时观察Nginx的
active connections和requests per second变化,通常静态资源缓存启用后,QPS可提升2–5倍,CPU使用率明显下降
不复杂但容易忽略:确保Nginx未被上游CDN或反向代理覆盖了缓存头;如有,需在对应层也开启或透传。

















