多域名可共用一个缓存池,但需通过含$host的proxy_cache_key确保缓存键隔离,统一配置proxy_cache_path并所有server块引用同一keys_zone,且缓存策略与验证机制须保持一致。

多域名共用一个缓存池是可行的,但必须确保缓存键(proxy_cache_key)能准确区分不同域名的请求,否则会引发跨站缓存污染——比如 site-a.com/logo.png 和 site-b.com/logo.png 被当成同一个资源缓存,造成内容错乱。
统一定义缓存区(http 块中)
所有域名共享同一套缓存存储和内存索引,只需在 http 块里声明一次 proxy_cache_path:
proxy_cache_path /var/cache/nginx/static levels=1:2 keys_zone=shared_cache:100m max_size=5g inactive=1h use_temp_path=off;-
keys_zone名称(如shared_cache)是全局唯一标识,后续所有server块都引用它 -
max_size和inactive按整体流量预估,避免单个域名占满后挤掉其他域名缓存
显式定义 cache_key(含 host 隔离)
即使共用缓存区,也必须让每个域名的请求生成独立缓存键。推荐写法:
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
proxy_cache_key "$scheme$request_method$host$request_uri$is_args$args";-
$host是关键:确保example.com/a和test.com/a的 key 完全不同 - 若需忽略某些参数(如
utm_source),配合map清洗$args,再代入 key
各 server 块启用相同缓存区
每个虚拟主机内启用缓存时,直接指定同一个 keys_zone 名称:
server { server_name a.example.com; location / { proxy_pass http://origin; proxy_cache shared_cache; proxy_cache_valid 200 302 1h; } }server { server_name b.example.com; location / { proxy_pass http://origin; proxy_cache shared_cache; proxy_cache_valid 200 302 1h; } }- 注意:
proxy_cache_valid、proxy_cache_use_stale等策略建议保持一致,避免同一资源在不同域名下缓存行为不一
验证与防误配
上线前务必检查三项是否对齐:
- 所有
server块中proxy_cache值完全相同(如都是shared_cache) - 所有
proxy_cache_key都包含$host或等效隔离变量 - 响应头中添加
add_header X-Cache-Status $upstream_cache_status;,用 curl 实测不同域名相同路径是否各自命中 HIT










