proxy_pass本身不负责内存缓存区分配,仅转发请求;缓存行为由proxy_cache_path(定义路径、keys_zone、磁盘上限等)和proxy_cache(指定使用哪个keys_zone)协同控制,需在location中配合proxy_cache_valid等指令配置。

“proxy_pass”本身不负责内存缓存区分配,它只是将请求转发给后端服务。真正控制缓存行为、包括内存元数据区(keys_zone)和磁盘缓存区划分的,是 proxy_cache_path 和 proxy_cache 配合使用的机制。
明确 proxy_pass 的定位
proxy_pass 是代理转发指令,不带缓存功能。要实现“高效缓存”,必须额外配置缓存模块,核心在于:
- 用 proxy_cache_path 定义物理缓存路径 + 共享内存区(keys_zone)+ 磁盘上限 + 清理策略
- 在 location 块中用 proxy_cache 指定使用哪个 keys_zone
- 所有缓存相关指令(如 proxy_cache_valid、proxy_cache_key)都应与 proxy_cache 同级写在 location 内,避免作用域混乱
高效内存缓存区的关键参数设置
keys_zone 决定了缓存元数据(key、状态、过期时间等)能驻留在共享内存中的数量,直接影响缓存查找速度。设置不合理会导致命中率低或 OOM:
- 1MB keys_zone ≈ 存储 8000 个缓存条目(按典型元数据大小估算)
- API 类路径(高并发、短时效):建议 10–30MB,例如
keys_zone=api_cache:20m - 静态资源(大量文件、长时效):建议 50–100MB+,例如
keys_zone=static_cache:80m - 避免把多个 location 共用同一个 keys_zone 名称,否则元数据混杂,无法隔离策略
结合 proxy_pass 的典型缓存代理配置
以 /api/ 和静态资源为例,体现“按路径分配独立缓存区”的实际写法:
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
- 先在 http 块定义两个隔离缓存区:
proxy_cache_path /data/nginx/cache/api levels=1:2 keys_zone=api_cache:20m inactive=10m max_size=2g;<br>proxy_cache_path /data/nginx/cache/static levels=1:2 keys_zone=static_cache:80m inactive=7d max_size=50g;
- 再在对应 location 中绑定并启用:
location /api/ {<br> proxy_pass http://backend_api;<br> proxy_cache api_cache;<br> proxy_cache_valid 200 302 5m;<br> proxy_cache_key "$scheme$request_method$host$uri$is_args$args";<br>}
location ~* \.(js|css|png|jpg|gif)$ {<br> proxy_pass http://backend_static;<br> proxy_cache static_cache;<br> proxy_cache_valid 200 302 1d;<br> expires 1y;<br>}
这样,proxy_pass 转发的同时,每个路径走自己专属的内存+磁盘缓存区,互不干扰,策略可独立调优。
容易忽略但影响性能的细节
- use_temp_path=off:强制缓存文件直接写入最终路径,避免临时拷贝开销,官方推荐开启
- proxy_buffering on(默认)配合 proxy_buffer_size 和 proxy_buffers,控制响应体读取缓冲,防止小文件反复 IO
- 加 add_header Nginx-Cache $upstream_cache_status 方便验证是否 hit/miss/refresh
- 修改后务必执行
nginx -t检查语法,再nginx -s reload生效

















