合理配置nginx静态资源缓存需分级控制:不变资源设1年缓存+immutable,哈希文件名资源同样1年,热更资源设1小时;启用sendfile、open_file_cache等提升传输效率;通过路径匹配、参数过滤精准缓存;协同cdn与浏览器,html不缓存或短缓存。

合理配置 Nginx 静态资源缓存,核心在于按资源类型分级控制:不变内容长期缓存,变动频繁内容短期缓存,再辅以版本化路径或哈希文件名规避更新失效问题。
区分资源类型设置不同过期时间
静态资源并非“一刀切”缓存。应依据是否随版本更新来划分:
-
长期不变资源(如字体、图标、基础 CSS/JS 库):用
expires 1y或max-age=31536000,配合immutable头防止浏览器误刷新 -
项目级构建产物(如
app.a1b2c3.js、main.f4e5d6.css):同样设为 1 年,前提是文件名含哈希值——内容变则 URL 变,旧缓存自然失效 -
可能热更的资源(如运营 banner 图、配置 JSON):设为
expires 1h或max-age=3600,避免用户长时间看不到更新
启用高效传输与文件系统缓存
光设过期时间不够,还要让 Nginx 更快地读取和发送文件:
- 开启
sendfile on和tcp_nopush on,跳过用户态拷贝,合并 TCP 包发送 - 配置
open_file_cache缓存文件元信息(存在性、权限、修改时间),减少stat()系统调用:open_file_cache max=1000 inactive=30s;open_file_cache_valid 60s;open_file_cache_min_uses 2; - 对大图可加
read_ahead 1m预读,提升顺序读取效率
用路径或请求头辅助精准缓存
避免多项目共用 root 时的路径错位,也防止 CDN/浏览器因参数干扰缓存:
- 对子路径项目(如
/h5/)单独写 location,显式指定root或用alias,避免正则匹配后 fallback 到错误目录 - 排除无意义查询参数干扰缓存键:
proxy_cache_key "$host$uri";(不带$args)
或用 map 过滤掉v=xxx、ts=xxx类参数 - 对带版本前缀的资源(如
/v2.3.1/js/app.js),用location ^~ /v\d+\.\d+\.\d+/统一处理,再try_files $1 =404
配合 CDN 与客户端行为协同生效
服务端缓存只是链路一环,需和 CDN、浏览器联动:
- CDN 回源时,Nginx 返回的
Cache-Control和Expires头会直接影响 CDN 缓存时长,务必保持一致 - 对 HTML 文件本身,一般不缓存或只缓存极短时间(如
max-age=60),确保入口页能及时拉取最新 JS/CSS 链接 - 加
add_header X-Cache-Status $upstream_cache_status;方便调试是否命中缓存











