use_temp_path=off是Nginx代理缓存核心优化开关,强制缓存文件直写proxy_cache_path主目录,避免跨文件系统rename失败、减少一次磁盘I/O和inode操作,并需配合目录权限、空间预留及location中proxy_cache等指令共同生效。

直接在 nginx.conf 里配好代理缓存,是最高效、最可控的减压方式。它不改后端代码,也不依赖额外组件,靠 Nginx 自身把重复请求拦在门外——尤其适合高频访问的 API、列表页、状态查询等场景。
先在 http 块里划出缓存“地盘”
缓存必须有存储位置和管理内存区,这两样得提前声明:
proxy_cache_path /var/cache/nginx/api_cache levels=1:2 keys_zone=api_cache:512m max_size=2g inactive=1h use_temp_path=off;-
keys_zone=api_cache:512m是缓存元数据的“大脑”,名字要和后续 location 中引用的一致;512MB 内存可支撑约 400 万个缓存项 -
use_temp_path=off必须开启,避免临时文件拷贝,否则缓存锁失效、响应可能错乱 - 创建目录并赋权:
mkdir -p /var/cache/nginx/api_cache && chown -R nginx:nginx /var/cache/nginx/api_cache
在 location 中启用并控制缓存行为
缓存逻辑要落到具体转发路径,不是写在 upstream 里:
location /api/order/ {proxy_pass http://backend_api;-
proxy_cache api_cache;—— 启用刚才定义的缓存区 -
proxy_cache_valid 200 201 5m;—— 成功响应缓存 5 分钟 -
proxy_cache_valid 404 1m;—— 避免反复穿透查不存在的资源 -
add_header X-Cache-Status $upstream_cache_status;—— 方便通过响应头看是 HIT、MISS 还是 STALE
优化缓存键与绕过逻辑,提升命中率
默认按完整 URL 缓存,带时间戳、用户 ID、随机参数的请求极易“一请求一缓存”,浪费空间又拉低效率:
- 统一键值(忽略无关参数):
proxy_cache_key "$scheme$host$uri";—— 去掉$args,让/api/user?id=123&t=1724153040和/api/user?id=123&v=2共享同一缓存 - 跳过登录态或调试请求:
proxy_cache_bypass $http_cookie $arg_nocache;—— 有 Cookie 或带nocache=1就不走缓存 - 屏蔽干扰响应头:
proxy_ignore_headers Set-Cookie Vary;—— 否则后端返回Set-Cookie时,Nginx 默认拒存整个响应
加锁防雪崩 + 容错保可用
缓存过期瞬间大量并发请求打到后端,极易引发雪崩:
-
proxy_cache_lock on;—— 只放行第一个回源请求,其余等待复用结果 -
proxy_cache_lock_timeout 6s;—— 超时后未拿到结果的请求也允许回源,避免卡死 -
proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;—— 回源失败、超时或后端挂了,仍可用旧缓存顶一阵


















