nginx静态文件缓存通过三步实现:一、用expires和cache-control指令让浏览器缓存不变资源;二、用open_file_cache缓存文件元数据减少系统调用;三、用proxy_cache缓存反向代理的静态响应。

Nginx 开启静态文件缓存,核心是让浏览器和 Nginx 自身都“少跑一趟”——浏览器本地存一份,Nginx 也把常用文件元数据或内容提前准备好。不需要改代码、不依赖后端,配置几行就能明显提速。
一、用 expires 和 Cache-Control 让浏览器自己缓存
这是最直接有效的方式,适用于 .css、.js、.jpg、.png 等几乎不变的资源。
在 server 或 location 块里加:
location ~* \.(jpg|jpeg|png|gif|ico|css|js|woff2|ttf)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
-
expires 1y:告诉浏览器这份资源一年内不用再问服务器 -
public表示可以被 CDN、代理等中间节点缓存 -
immutable表示内容绝不会变(配合版本号或哈希命名更安全)
✅ 小提示:如果资源会更新,务必用文件名带哈希(如
app.a1b2c3.js)或 URL 版本化(如/v2.1/main.css),否则用户可能看不到新版本。
二、用 open_file_cache 加速文件系统访问
Nginx 每次读文件都要查 inode、权限、修改时间……频繁访问小文件时开销不小。启用句柄缓存可大幅减少系统调用。
在 http 块中添加:
open_file_cache max=10000 inactive=30s; open_file_cache_valid 60s; open_file_cache_min_uses 2; open_file_cache_errors on;
-
max=10000:最多缓存 1 万个文件元信息 -
inactive=30s:30 秒没被访问就淘汰 -
min_uses=2:至少被访问过 2 次才进缓存(防误缓存临时文件) -
errors on:连“文件不存在”这类错误也缓存,避免反复检查
✅ 推荐搭配
sendfile on;和tcp_nopush on;,进一步减少内核态/用户态拷贝。
三、用 proxy_cache 缓存反向代理响应(适合动态站套静态资源)
如果你的 Nginx 是作为反向代理(比如前端请求经 Nginx 转发给 Node/PHP),可以把后端返回的静态资源也缓存在本地磁盘。
先定义缓存区(放在 http 块顶部):
proxy_cache_path /var/cache/nginx/static_cache levels=1:2 keys_zone=static_cache:50m max_size=2g inactive=1h use_temp_path=off;
再在 location 中启用:
location ~* \.(css|js|png|jpg|gif)$ {
proxy_pass http://backend;
proxy_cache static_cache;
proxy_cache_valid 200 1d;
proxy_cache_key "$scheme$request_method$host$request_uri";
add_header X-Cache-Status $upstream_cache_status;
}
-
use_temp_path=off可减少一次磁盘 copy,提升写入速度 -
X-Cache-Status响应头方便调试(HIT/MISS/BYPASS)
⚠️ 注意:
proxy_cache对纯静态root服务无效,只对proxy_pass生效;若你直接root /data/www提供静态文件,就用前两种方式。
四、验证是否生效
用 curl 查看响应头:
curl -I https://yoursite.com/style.css
看到类似以下字段即成功:
Cache-Control: public, immutable Expires: Wed, 28 Jul 2027 21:54:00 GMT X-Cache-Status: HIT # 如果用了 proxy_cache
浏览器开发者工具 → Network 标签页,看 Status 列是否显示 200 (from memory cache) 或 304,说明缓存已起作用。
不复杂但容易忽略











