跳转到主内容
websoft网络软件专家 - 深耕网络技术,打造实用软件!

实战演示Nginx中不同端口虚拟主机配置独立的Proxy缓存Key

在Nginx中需为不同端口server块配置独立proxy_cache_path和proxy_cache_key:一、http块定义唯一keys_zone的缓存区;二、各server块绑定对应cache并用端口后缀确保key唯一;三、通过X-Cache头和缓存目录验证隔离。 在 Nginx 中,为不同端口的虚拟主机(server 块)配置独立的 proxy_cache_key,关键在于让每个 server 使用**独立的缓存区(proxy_cache_path)和 cache key 逻辑**,避免跨端口缓存污染。默认情况下,只要 proxy_cache 同名、key 相同,不同 server 的请求就会共用缓存——这在多端口部署(如 8080/8081/8443)时极易引发内容错乱。 一、定义多个独立缓存区(按端口区分) 在 http 块中,为每个端口虚拟主机声明专属的 proxy_cache_path ,命名需唯一,并启用 keys_zone 隔离:
proxy_cache_path /var/cache/nginx/cache_8080 levels=1:2 keys_zone=cache_8080:10m max_size=1g inactive=60m use_temp_path=off; proxy_cache_path /var/cache/nginx/cache_8081 levels=1:2 keys_zone=cache_8081:10m max_size=1g inactive=60m use_temp_path=off; proxy_cache_path /var/cache/nginx/cache_8443 levels=1:2 keys_zone=cache_8443:10m max_size=1g inactive=60m use_temp_path=off;
✅ 每个 keys_zone 名称(如
cache_8080
)必须唯一,这是 Nginx 区分缓存元数据的核心标识。 二、各 server 块绑定专属缓存与自定义 key 在对应端口的 server 块中,使用 proxy_cache 指向专属 keys_zone,并通过 proxy_cache_key 显式加入端口信息(或 server_name),确保 key 全局唯一:
server { listen 8080; server_name api.example.com;
proxy_cache cache_8080;
proxy_cache_key "$scheme$request_method$host$uri$is_args$args:8080";
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404      1m;

location / {
    proxy_pass http://backend_8080;
    proxy_set_header Host $host;
}
}server { listen 8081; server_name api.example.com;
proxy_cache cache_8081; proxy_cache_key "$scheme$request_method$host$uri$is_args$args:8081"; proxy_cache_valid 200 302 10m; proxy_cache_valid 404 1m; location / { proxy_pass http://backend_8081; proxy_set_header Host $host; }
} ⚠️ 注意: -
:8080
这类静态后缀是简单有效的方式,也可用
$server_port
(但需确认变量在 proxy_cache_key 中可用,推荐显式写死更稳妥); - 不要省略
$is_args$args
,否则带参 URL 会被当作同一 key 缓存; -
proxy_cache
值(如
cache_8080
)必须与
proxy_cache_path
中的
keys_zone
名称严格一致。 三、验证缓存隔离是否生效 部署后,可通过以下方式快速验证: 用
curl -I http://localhost:8080/path
和
curl -I http://localhost:8081/path
分别发起相同路径请求; 检查响应头中
X-Cache
(需自行添加
add_header X-Cache $upstream_cache_status;
)是否分别为
HIT
/
MIS
且互不影响; 查看缓存目录结构:
ls /var/cache/nginx/cache_8080
和
ls /var/cache/nginx/cache_8081
应各自独立存在且有文件生成; 修改某端口后端响应内容,观察另一端口缓存不受影响。 四、进阶建议:避免常见陷阱 实际部署中容易忽略但关键的细节: 不要复用 proxy_cache_path 的 keys_zone 名称 ——即使路径不同,同名 keys_zone 仍会共享内存索引,导致缓存误命中; 禁用 use_temp_path=off 可减少磁盘 I/O,提升缓存写入效率(尤其高并发场景); 若使用 HTTPS 端口(如 8443),注意
$scheme
是
https
,与 8080 的
http
天然不同,但依然建议在 key 中显式加端口,避免反向代理层 scheme 被覆盖; 调试阶段可临时开启
proxy_cache_lock on;
和
proxy_cache_lock_timeout 5s;
,防止缓存穿透风暴。

相关文章