可以共用同一个缓存区域,关键在于统一 proxy_cache_path 定义并在各 server 或 location 块中引用相同 keys_zone 名称,同时通过 proxy_cache_key 精确区分缓存条目,避免不同后端内容相互覆盖。

可以共用同一个缓存区域,关键在于统一 proxy_cache_path 定义,并在各 server 或 location 块中引用相同的 keys_zone 名称,同时通过 proxy_cache_key 精确区分缓存条目,避免不同后端内容相互覆盖。
共用缓存区域的核心配置方式
多个虚拟主机(比如不同域名或端口)要共享同一块缓存空间,只需确保它们都指向同一个 keys_zone,例如 mycache。Nginx 的缓存机制本身不按 server 划分隔离,而是靠 proxy_cache_key 决定“什么请求存哪”,因此 key 设计必须唯一可区分。
- 在 http 块中定义一次
proxy_cache_path,所有 server 都复用它 - 每个 server 或 location 中使用
proxy_cache mycache启用该缓存区 - 务必为不同后端定制
proxy_cache_key,加入能标识后端来源的变量(如$host、$server_port、$upstream_addr)
避免缓存冲突的关键:cache_key 要带后端标识
如果两个虚拟主机都代理到不同后端(如 backend-a 和 backend-b),但 cache_key 完全相同(比如只用 $uri),那么访问 /api 可能在 A 和 B 之间误命中——A 返回的内容被 B 的请求读取,造成数据错乱。
- 推荐写法:
proxy_cache_key "$scheme$request_method$host$uri$is_args$args$upstream_addr"; - 若后端由 upstream 定义,
$upstream_addr能精确记录实际转发的 IP+端口;若直接 proxy_pass 固定地址,可用$server_port或自定义变量标识 - 端口差异明显时(如 8081 和 8082),可在 key 末尾加端口号标记:
:8081,如示例中所示
缓存路径与内存区无需重复定义
proxy_cache_path 是全局指令,只需在 http 块中声明一次。它负责分配磁盘目录结构、设置内存元数据区(keys_zone)、限制总大小和清理策略。后续所有 location 中只要引用同一名字(如 mycache),就自动复用该路径和内存区。
- 不要在每个 server 里重复写
proxy_cache_path,Nginx 会报错 -
keys_zone=mycache:64m中的64m是存放 key 和元数据的共享内存大小,所有虚拟主机共用这块内存 - 磁盘缓存文件最终都落在
/cache/nginx/下,Nginx 自动按levels=1:2分散存储,不影响并发性能
验证是否真正共用与隔离
部署后可通过以下方式确认行为符合预期:
- 检查
nginx -t是否通过,确认所有 server 块都正确引用了同一keys_zone - 访问两个虚拟主机的相同路径(如
/status),观察响应头中X-Cache(需自行添加)是否分别命中,且内容不混用 - 查看缓存目录
/cache/nginx/下的文件,其 hash key 应因$upstream_addr或端口不同而生成不同子路径











