Nginx proxy_cache 隔离靠 keys_zone 和 proxy_cache_key 实现逻辑分离,而非物理路径;需在 http 块静态声明多个 proxy_cache_path(各配唯一 keys_zone),再用 map 动态选择 zone 与构造带业务标识的 cache_key。

不能直接用 map 指令动态设置 proxy_cache_path 的存储路径。因为 proxy_cache_path 是 Nginx 的全局指令,必须在 http 块顶层静态声明,不支持变量或运行时计算——map 生成的变量无法在此处生效。
真正可行的逻辑隔离方式:用 map 控制 cache_zone 和 cache_key
多业务线隔离的关键不是“换物理路径”,而是让缓存内容互不干扰。Nginx 通过以下两个变量实现完全逻辑隔离:
-
独立的 keys_zone 名称:每个业务线使用专属
keys_zone=name:size,比如cache_zone_biz_a:20m、cache_zone_biz_b:20m;不同 zone 的内存元数据完全分离,不会混用 key 或过期策略。 -
带业务标识的 cache_key:用
map构造含业务前缀的 key,例如:
map $host $biz_id {
~^a\.example\.com$ "biz_a";
~^b\.example\.com$ "biz_b";
default "default";
}
proxy_cache_key "$biz_id|$scheme|$host|$request_uri|$args";
配套操作:为每个业务线配置专属缓存区
在宝塔面板【网站】→【配置文件】的 http 块顶部(server 外),静态声明多个 proxy_cache_path:
- 每个路径对应一个业务线,目录名体现业务,如
/www/server/nginx/proxy_cache/biz_a; - 每个
keys_zone名称唯一,大小按预估 QPS 分配(1m ≈ 8000 key); - 确保
use_temp_path=off,避免写临时文件影响性能。
如何把业务线和缓存区绑定起来
在各站点的 location 块中,用 map 变量选择对应 zone:
- 先定义
map $biz_id $selected_cache_zone { "biz_a" "cache_zone_biz_a"; "biz_b" "cache_zone_biz_b"; }; - 再在反向代理 location 中写:
proxy_cache $selected_cache_zone;
proxy_cache_valid 200 302 10m;
proxy_cache_use_stale error timeout; - 这样,a.example.com 的请求永远只读写
cache_zone_biz_a,和其他业务彻底隔开。
为什么不用多个物理路径也能保证隔离
Nginx 缓存的隔离粒度在 keys_zone 级别:即使多个 zone 共享同一磁盘路径(如都设为 /www/server/nginx/proxy_cache/),只要 keys_zone 名称不同,它们的 key 哈希空间、内存索引、过期队列、锁机制全部独立。实际文件名由 key 的 MD5 生成,天然不冲突。











