Nginx缓存请求时,除URL外还考量哪些请求属性(请求头、Cookie)?
Nginx缓存的请求属性及日志排查
一、默认缓存的判断依据
默认情况下,Nginx的proxy_cache使用的缓存键由以下变量组成:
$scheme$proxy_host$request_uri
也就是说,仅考虑请求协议(http/https)、代理目标主机、完整请求URI(含查询参数),不会自动纳入请求头、Cookie等属性。
二、可自定义纳入缓存的请求属性
如果需要让缓存区分不同的请求头、Cookie等属性,可以通过proxy_cache_key指令自定义缓存键,常见可纳入的属性包括:
- 请求头字段:比如
$http_user_agent(浏览器/客户端标识)、$http_accept(内容类型偏好)、$http_accept_language(语言偏好)等。示例配置:proxy_cache_key "$scheme$proxy_host$request_uri$http_user_agent"; - Cookie:可通过
$cookie_xxx指定特定Cookie键,或$http_cookie引入完整Cookie内容(注意:若Cookie包含动态值,会导致缓存条目数量激增,需谨慎使用)。示例:proxy_cache_key "$scheme$proxy_host$request_uri$cookie_user_id"; - 请求方法:默认仅缓存
GET和HEAD请求,若需缓存其他方法(如POST),需通过proxy_cache_methods指定,比如:proxy_cache_methods GET HEAD POST;
三、日志中查看缓存状态
你当前的access.log仅记录基础请求信息,若要排查缓存命中情况,需修改日志格式,加入$upstream_cache_status变量:
- 在
http块中定义包含缓存状态的日志格式:log_format cache_log '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$upstream_cache_status"'; - 在监听80的server块中指定使用该日志格式:
server { listen 80; access_log logs/access.log cache_log; # 其他原有配置... }
$upstream_cache_status的常见值:
HIT:缓存命中MISS:未命中,需回源获取EXPIRED:缓存已过期,回源重新获取BYPASS:绕过缓存直接回源
四、针对你当前配置的说明
你的nginx.conf中未配置proxy_cache_key,所以缓存仅基于协议、代理主机和请求URI生成,不会区分不同的Cookie、User-Agent等请求属性。如果需要让这些属性影响缓存结果,添加对应的proxy_cache_key配置即可。
内容的提问来源于stack exchange,提问作者Kenion
相关产品推荐
相关产品推荐

