提高静态文件覆盖率的关键是精准分级缓存:强不变资源设1年不可变缓存,弱不变资源设30天+etag,动态文件禁用或短缓存,html通常不缓存;需规避nginx location优先级陷阱,采用具体前缀location或alias;结合浏览器、nginx代理、系统三层缓存协同,并通过x-cache-status等指标持续验证优化。

提高静态文件覆盖率,核心是让尽可能多的静态请求命中缓存——既包括浏览器端(客户端)缓存,也包括 Nginx 代理层(服务端)缓存。关键不在“全量缓存”,而在“精准覆盖”:按资源类型、更新频率、访问热度分级处理,避免漏配、误配或被 location 优先级覆盖。
明确哪些静态文件该被覆盖
不是所有静态文件都适合长期缓存。需分类施策:
-
强不变资源(如带哈希指纹的 JS/CSS、字体、图标):可设为
expires 1y+Cache-Control: public, immutable -
弱不变资源(如 banner 图、未加指纹的 CSS):设
expires 30d或max-age=2592000,配合 ETag 验证 -
动态生成静态文件(如用户头像、临时导出 PDF):禁用缓存或设极短时间(
max-age=60),并确保不落入通用正则规则 - HTML 文件:通常不缓存(或仅 micro-cache 1s),除非是纯静态 landing page;否则易导致版本不一致
绕过 location 匹配陷阱,确保规则生效
Nginx 的 location 优先级常导致缓存配置“写对了却没生效”。典型问题:/h5/ 下的 JS 被全局正则 location ~ \.(js|css)$ 拦截,但该 location 没配 root,结果去默认根目录找文件 → 404 或返回错误内容。
- 把静态资源规则放在 更具体的前缀 location 内部,例如:
location ^~/h5/static/ { root /app/h5; expires 7d; } - 或用
alias显式指定路径,避免 root 拼接歧义 - 检查是否被更高优先级的
location ^~ /api或location = /index.html截断 —— 可用nginx -T输出完整配置验证匹配顺序
分层缓存协同提升覆盖率
单靠一层缓存无法达成高覆盖率。建议组合使用:
-
浏览器缓存:用
expires或add_header Cache-Control控制,覆盖重复访问用户 -
Nginx 代理缓存:对 CDN 未覆盖或直连场景,用
proxy_cache缓存后端响应,尤其适合图片、API 返回的静态 JSON -
文件系统缓存:启用
open_file_cache,减少磁盘 open/read 开销,对高频小文件(如 favicon.ico、logo.png)效果明显
验证与持续优化
覆盖率不能只看配置,要靠真实请求反馈:
- 在响应头中添加
X-Cache-Status($upstream_cache_status)和X-Cache-Hits,用浏览器 DevTools 或 curl 快速判断命中情况 - 对关键资源(如首屏 JS/CSS)发起多次请求,观察是否始终返回
HIT或EXPIRED - 用日志统计
$request_uri和$upstream_cache_status,识别长期MISS的路径,查是否漏配、路径不一致或被 rewrite 干扰











