Nginx 中 cache key 缓存键怎么自定义设计
在 nginx 中自定义设计缓存键,核心做法是修改 proxy_cache_key 指令的值。默认情况下,nginx 使用 $scheme$proxy_host$request_uri 作为缓存键,这通常会导致不同主机或协议下的请求被错误地复用同一份缓存。通过将该指令设置为包含 $host、$query_string 以及特定 header(如 $http_authorization)的组合,可以确保缓存的隔离性和准确性。例如,设置 $scheme$host$request_uri$is_args$args 能精确区分域名、协议和查询参数,从而避免缓存污染。

如何根据业务需求细化缓存键以支持个性化内容
当需要为不同用户或角色提供不同的缓存内容时,必须在缓存键中包含能够唯一标识这些差异的变量。最直接的方法是将用户特定的 Header(如 $http_authorization 或自定义的 X-User-ID)加入 proxy_cache_key。这样,即使请求 URI 相同,只要用户身份不同,Nginx 就会生成不同的缓存文件,从而实现基于身份的缓存隔离。需要注意的是,如果将敏感信息直接放入缓存键,需确保存储路径的安全权限配置得当。

server {
listen 80;
server_name example.com;
# 定义缓存区域
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m use_temp_path=off;
location /api/ {
proxy_pass http://backend_server;
# 自定义缓存键:包含协议、主机名、URI、查询参数和用户ID
proxy_cache_key "$scheme$host$request_uri$is_args$args$http_x_user_id";
# 启用缓存
proxy_cache my_cache;
# 设置缓存有效期
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
# 传递必要的 Header 以便后端处理(可选,取决于后端逻辑)
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-User-ID $http_x_user_id;
}
}
上述配置中,proxy_cache_key 使用了 $http_x_user_id。假设用户 A 的请求头携带 X-User-ID: 1001,用户 B 携带 X-User-ID: 1002,且两者请求相同的 /api/data。Nginx 会分别计算两个不同的哈希值:
1. 对于用户 A:hash(http://example.com/api/data?X-User-ID=1001) -> 缓存文件 A
2. 对于用户 B:hash(http://example.com/api/data?X-User-ID=1002) -> 缓存文件 B
这确保了不同用户的个性化数据不会被互相覆盖。如果省略 $http_x_user_id,两个用户的请求将命中同一个缓存文件,导致数据泄露或错误显示。
缓存键中包含 Cookie 对缓存命中率的影响
如果在 proxy_cache_key 中包含了 $http_cookie,会导致缓存命中率急剧下降甚至失效。因为每个用户的 Cookie 都是唯一的(包含 Session ID、追踪 ID 等),这使得几乎每个请求都会被视为“新”请求,从而无法复用缓存。除非你的业务逻辑明确要求每个 Cookie 组合都对应一份独立的缓存(这在大多数 Web 场景中是不现实的),否则应避免将完整的 Cookie 字符串纳入缓存键。正确的做法是仅提取 Cookie 中用于区分缓存版本的关键部分,或者干脆忽略 Cookie,依赖其他更稳定的标识符。











