4.当被启用时,当多个客户端请求一个缓存中不存在的文件(或称之为一个MISS),只有这些请求中的第一个被允许发送至服务器。其他请求在第一个请求得到满意结果之后在缓存中得到文件。如果不启用proxy_cache_lock,则所有在缓存中找不到文件的请求都会直接与服务器通信。
跨多硬盘分割缓存使用NGINX,不需要建立一个RAID(磁盘阵列)。如果有多个硬盘,NGINX可以用来在多个硬盘之间分割缓存。下面是一个基于请求URI跨越两个硬盘之间均分缓存的例子:
proxy_cache_path /path/to/hdd1 levels=1:2 keys_zone=my_cache_hdd1:10m max_size=10g
inactive=60m use_temp_path=off;
proxy_cache_path /path/to/hdd2 levels=1:2 keys_zone=my_cache_hdd2:10m max_size=10g
inactive=60m use_temp_path=off;
split_clients $request_uri $my_cache {
50%“my_cache_hdd1”;
50%“my_cache_hdd2”;
}
server {
...
location /{
proxy_cache $my_cache;
proxy_pass http://my_upstream;
}
}
上例中的两个proxy_cache_path定义了两个缓存(my_cache_hdd1和my_cache_hd22)分属两个不同的硬盘。split_clients配置部分指定了请求结果的一半在my_cache_hdd1中缓存,另一半在my_cache_hdd2中缓存。基于$request_uri(请求URI)变量的哈希值决定了每一个请求使用哪一个缓存,对于指定URI的请求结果通常会被缓存在同一个缓存中。
常见问题解答这部分内容回答了一些关于NGINX内容缓存的常见问题。
可以检测NGINX缓存状态吗?可以,使用指令:
add_header X-Cache-Status $upstream_cache_status;
上面的例子中,在对客户端的响应中添加了一个`X-Cache-Status`HTTP响应头,下面是的可能值:
MISS——响应在缓存中找不到,所以需要在服务器中取得。这个响应之后可能会被缓存起来。
BYPASS——响应来自原始服务器而不是缓存,因为请求匹配了一个proxy_cache_bypass(见下面)。这个响应之后可能会被缓存起来。
EXPIRED——缓存中的某一项过期了,来自原始服务器的响应包含最新的内容。
STALE——内容陈旧是因为原始服务器不能正确响应。需要配置proxy_cache_use_stale。
UPDATING——内容过期了,因为相对于之前的请求,响应的入口(entry)已经更新,并且proxy_cache_use_stale的updating已被设置。
REVALIDATED——命令被启用,NGINX检测得知当前的缓存内容依然有效(If-Modified-Since或者If-None-Match)。
HIT——响应包含来自缓存的最新有效的内容。
NGINX 如何决定是否缓存?默认情况下,NGINX需要考虑从原始服务器得到的Cache-Control标头。当在响应头部中Cache-Control被配置为Private,No-Cache,No-Store或者Set-Cookie,NGINX不进行缓存。NGINX仅仅缓存GET和HEAD客户端请求。你也可以参照下面的解答覆盖这些默认值。
Cache-Control头部可否被忽略?可以,使用proxy_ignore_headers命令。如下列配置:
location /images/{
proxy_cache my_cache;
proxy_ignore_headers Cache-Control;
proxy_cache_valid any 30m;
...
}