在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
隔离:
✅ 每个
keys_zone
名称(如
)必须唯一,这是 Nginx 区分缓存元数据的核心标识。
二、各 server 块绑定专属缓存与自定义 key
在对应端口的
server
块中,使用
proxy_cache
指向专属 keys_zone,并通过
proxy_cache_key
显式加入端口信息(或 server_name),确保 key 全局唯一:
}server {
listen 8081;
server_name api.example.com;}
⚠️ 注意:
-
这类静态后缀是简单有效的方式,也可用
(但需确认变量在 proxy_cache_key 中可用,推荐显式写死更稳妥);
- 不要省略
,否则带参 URL 会被当作同一 key 缓存;
-
值(如
)必须与
中的
名称严格一致。
三、验证缓存隔离是否生效
部署后,可通过以下方式快速验证:
用
和
分别发起相同路径请求;
检查响应头中
(需自行添加
)是否分别为
/
且互不影响;
查看缓存目录结构:
和
应各自独立存在且有文件生成;
修改某端口后端响应内容,观察另一端口缓存不受影响。
四、进阶建议:避免常见陷阱
实际部署中容易忽略但关键的细节:
不要复用 proxy_cache_path 的 keys_zone 名称
——即使路径不同,同名 keys_zone 仍会共享内存索引,导致缓存误命中;
禁用 use_temp_path=off
可减少磁盘 I/O,提升缓存写入效率(尤其高并发场景);
若使用 HTTPS 端口(如 8443),注意
是
,与 8080 的
天然不同,但依然建议在 key 中显式加端口,避免反向代理层 scheme 被覆盖;
调试阶段可临时开启
和
,防止缓存穿透风暴。
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;
cache_8080
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;
}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$is_args$argsproxy_cachecache_8080proxy_cache_pathkeys_zonecurl -I http://localhost:8080/pathcurl -I http://localhost:8081/pathX-Cacheadd_header X-Cache $upstream_cache_status;HITMISls /var/cache/nginx/cache_8080ls /var/cache/nginx/cache_8081$schemehttpshttpproxy_cache_lock on;proxy_cache_lock_timeout 5s;