Nginx缓存使用官方指南(3)

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_hdd1my_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_staleupdating已被设置

REVALIDATED——命令被启用,NGINX检测得知当前的缓存内容依然有效(If-Modified-Since或者If-None-Match)。

HIT——响应包含来自缓存的最新有效的内容。 

NGINX 如何决定是否缓存?

默认情况下,NGINX需要考虑从原始服务器得到的Cache-Control标头。当在响应头部中Cache-Control被配置为PrivateNo-CacheNo-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;

...

}

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/75038b0032962ba8da12376cb2b5c34a.html