nginx启用proxy_cache需三步:一、在http块顶层定义proxy_cache_path并创建缓存目录;二、在location中配合proxy_pass启用proxy_cache,不可与root/alias混用;三、通过响应头x-proxy-cache及缓存目录结构验证hit/miss。

要在 Nginx 中启用 proxy_cache 的基础磁盘缓存,关键不是“加个指令就行”,而是按顺序完成三件事:定义缓存存储位置、分配内存索引区、在具体请求路径中启用缓存。它不依赖后端代理,但必须配合 proxy_pass(哪怕指向本地),不能直接和 root 或 alias 混用。
一、在 http 块顶层定义 proxy_cache_path
这是硬性要求——必须写在 http { ... } 最外层,不能嵌套在 server 或 location 里,否则会报 unknown directive "proxy_cache_path"。
- 缓存目录需手动创建,并设对属主(如 Nginx worker 用户是
www-data):sudo mkdir -p /var/cache/nginx/staticsudo chown www-data:www-data /var/cache/nginx/static - 推荐配置示例(含解释):
proxy_cache_path /var/cache/nginx/static levels=1:2 keys_zone=static_cache:10m max_size=2g inactive=30m use_temp_path=off; -
levels=1:2:生成两级子目录(如
a/3f/),避免单目录文件过多导致查找变慢 - keys_zone=static_cache:10m:10MB 内存存缓存键(MD5哈希)和元数据,约可容纳 8 万个 key
- max_size=2g:磁盘总上限,超限时自动按 LRU 清理最久未用项
- inactive=30m:某缓存项 30 分钟内没被再次访问,就标记为可淘汰(由后台进程清理,非实时)
- use_temp_path=off:必须关闭,默认临时写再 rename 会多一次 IO,关掉能明显提升写入性能
二、为静态资源 location 启用 proxy_cache
不能直接在 location /static/ { root /data/www; proxy_cache static_cache; } 这样写——Nginx 要求 proxy_cache 必须与 proxy_pass 共存。常用做法是“伪代理”:
- 在
http块里定义一个内部 upstream 或用location = /_static_proxy拦截 - 实际静态路径用
proxy_pass http://127.0.0.1:8080/_static/(或用mirror,但兼容性不如伪代理稳定) - 更轻量的写法(推荐):
location ^~ /static/ {<br> proxy_cache static_cache;<br> proxy_cache_valid 200 301 302 1h;<br> proxy_cache_valid 404 1m;<br> proxy_cache_key "$scheme$request_uri";<br> proxy_pass http://127.0.0.1:8080/_static$uri;<br>} -
proxy_cache_key建议固定格式,避免因 Cookie、Referer 等导致缓存碎片化 -
proxy_cache_valid按状态码分级设置过期时间,比只写any 10m更精准
三、验证缓存是否生效
别只看配置 reload 成功——要确认真实行为:
- 用
curl -I http://your.site/static/test.css查看响应头是否有X-Proxy-Cache: HIT或MISS - 检查缓存目录结构:
ls -R /var/cache/nginx/static应看到类似/a/3f/的散列目录,里面是二进制文件(不是原始 CSS/JS 名) - 运行
nginx -T | grep proxy_cache_path确认配置已被加载,避免 reload 后仍用旧配置 - 首次请求是
MISS,第二次同 URL 是HIT才算成功;若一直BYPASS,检查是否被proxy_cache_bypass或请求头(如Cache-Control: no-cache)干扰
不复杂但容易忽略:路径权限、配置位置、proxy_pass 强制依赖、use_temp_path 关闭——这四点错一个,缓存就起不来。











