核心是启用open_file_cache并配齐max、inactive、valid、min_uses和errors五项参数,缓存文件元数据与句柄以减少stat/open系统调用;配合sendfile、tcp_nopush等实现内存级静态资源加速。

实现 Nginx 对关键静态资源的内存常驻缓存,核心不是“把文件一直锁在内存里”,而是通过 open_file_cache 机制让频繁访问的静态文件元数据和内容句柄长期保留在内存中,避免反复 open/read/stat 系统调用,从而达到近似“常驻”的效果。它不依赖 proxy_cache(那是磁盘/代理缓存),而是直接服务本地文件系统资源时的底层优化。
启用并调优 open_file_cache
这是实现内存级静态资源加速最直接、最轻量的方式,适用于 root 或 alias 直接提供静态文件的场景(如 /static/、/assets/):
-
开启缓存并设足够大的容量:在 http 块中配置,例如:
open_file_cache max=100000 inactive=300s;
表示最多缓存 10 万个打开的文件描述符,5 分钟内未被访问则移出缓存。 -
延长验证周期:减少对文件状态(是否被删、是否修改)的轮询开销:
open_file_cache_valid 300s;
每 5 分钟检查一次缓存项有效性,而非默认的 60 秒。 -
设定最小访问频次门槛:避免只访问一次的冷文件进缓存:
open_file_cache_min_uses 2;
同一文件在 inactive 时间内至少被访问 2 次才纳入缓存。 -
启用错误缓存:把 failed open、stat 的结果也缓存(防暴力探测或临时故障抖动):
open_file_cache_errors on;
配合高效文件传输机制
仅缓存句柄还不够,要让读取真正快起来:
-
启用 sendfile:绕过用户态拷贝,由内核直接从文件系统送至 socket:
sendfile on; -
开启 tcp_nopush:配合 sendfile,等 TCP 包填满再发,减少小包数量:
tcp_nopush on; -
可选:启用 read_ahead(尤其对大文件如视频、字体):
read_ahead 1m;
提前预读 1MB,提升顺序读性能。
精准定位“关键静态资源”
不是所有静态文件都值得常驻。优先对以下资源应用上述配置:
- CSS、JS(尤其是打包后带哈希名的 vendor.*.js)——体积适中、复用率极高;
- Favicon、logo.svg、核心图标字体(woff2)——请求频繁、尺寸小、生命周期长;
- 首屏关键图片(如 banner.jpg、hero.png)——可通过 location 正则单独匹配并强化缓存头;
- 避免对 user-uploaded/ 或 /temp/ 下动态生成的文件启用该机制。
验证是否生效
观察两个维度:
- 系统层面:用 lsof -p $(pgrep nginx) | wc -l 查看 Nginx 进程打开的文件数是否稳定在高位(说明缓存命中率高);
-
响应头层面:确保关键资源返回了强缓存头,例如:
Cache-Control: public, max-age=31536000, immutable
(注意:immutable 可防止浏览器在刷新时发条件请求,进一步降低服务端压力)。











