nginx通过proxy_cache机制实现静态文件磁盘缓存,需在http块中配置proxy_cache_path定义缓存路径与共享内存,并在location中配合proxy_pass(如伪代理)启用缓存,再通过proxy_cache_valid等指令控制缓存策略。

在 Nginx 中实现静态文件的磁盘缓存,核心是使用 proxy_cache 机制(即使不代理后端,也可配合 alias 或 root 模拟“本地代理”路径),配合 location 和缓存区配置,让 Nginx 将首次读取的静态文件(如 CSS、JS、图片)缓存到指定磁盘目录,后续请求直接从磁盘返回,降低 I/O 压力并提升响应速度。
配置缓存区与缓存路径
需先在 http 块中定义共享内存缓存区和磁盘缓存路径:
- 用
proxy_cache_path指定缓存存放目录、层级结构、共享内存名称、最大缓存大小及淘汰策略 - 缓存路径必须由 Nginx 进程可写,建议使用独立目录(如
/var/cache/nginx/static_cache) - 共享内存(
keys_zone)用于快速查找缓存键,大小按预期并发缓存项估算(例如10m可存约 8 万个 key)
示例配置:
proxy_cache_path /var/cache/nginx/static_cache levels=1:2 keys_zone=static_cache:10m max_size=1g inactive=7d use_temp_path=off;为静态文件 location 启用缓存
不能直接在 location /static/ 中用 root 或 alias 同时启用 proxy_cache——Nginx 要求缓存必须配合 proxy_pass。因此常用做法是:用内部 location + proxy_pass 指向本地路径(如 http://127.0.0.1:8080/_static/),再在该内部 location 中启用缓存;更简洁的方式是用 mirror 或 subrequest,但最通用可靠的是“伪代理”法:
- 定义一个内部 server 块监听本地端口(如 8080),仅响应静态文件请求
- 主 server 的静态 location 使用
proxy_pass http://127.0.0.1:8080/ - 在该
proxy_pass对应的location或server中启用proxy_cache static_cache
简化方案(推荐):使用 location ^~ /static/ 配合 proxy_pass 到内部命名 location(@static_disk),再在 @static_disk 中设置缓存与文件服务逻辑。
控制缓存行为与过期策略
静态文件通常变动少,适合长期缓存。关键指令包括:
-
proxy_cache_valid 200 302 1h;:对成功响应缓存 1 小时(可按需设为7d或1y) -
proxy_cache_min_uses 1;:默认即为 1,首次请求即缓存 -
proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;:允许在源不可用时返回过期缓存 -
add_header X-Cache-Status $upstream_cache_status;:方便调试,查看是否命中(HIT/MIS/MISS)
注意:Nginx 不会自动校验静态文件内容变更,若文件更新,需配合版本号(如 /static/app.a1b2c3.js)或清理缓存(proxy_cache_purge 需第三方模块)。
验证与维护缓存状态
缓存生效后可通过以下方式确认:
- 检查磁盘路径下是否生成二级子目录及缓存文件(如
/var/cache/nginx/static_cache/f/3a/xxx...) - 用
curl -I http://your.site/static/logo.png查看响应头中的X-Cache-Status - 用
nginx -t && nginx -s reload确保配置生效,避免因语法错误导致缓存未加载 - 定期用
du -sh /var/cache/nginx/static_cache监控缓存占用,必要时通过proxy_cache_path ... inactive=7d自动清理长期未访问项











