缓存只在http上下文有效
缓存域配置
proxy_cache_path /var/nginx/cache
keys_zone=CACHE:60m
levels=1:2
inactive=3h
max_size=20g;
proxy_cache CACHE;
proxy_cache_path的第一个参数设置缓存内容存储的文件夹目录;keys_zone表示共享缓存域的内存大小;第四个参数表示缓存失效时间,为3小时;max_size表示最大缓存容量;proxy_cache表示当前上下文使用这个缓存域,这条指令可以在http、server和location中使用。
缓存锁定
当当前的请求内容与当前缓存内容不一样时,会去改变缓存内容,但是如果在当前缓存写入完成之前,相同的请求再次到来,则会再次写入,这样持续有相同请求到来时,缓存内容将很难写入成功,所以我们需要在上一个缓存完成写入之前进行锁定,在写入完成后,再进行后续操作。
proxy_cache_lock on;
proxy_cache_lock_age 10s;
proxy_cache_lock_timeout 3s;
proxy_cache_lock_age表示缓存构建间隔,当上一个请求的缓存还未构建成功时,最早5秒后当前请求才能重新构建缓存;proxy_cache_lock_timeout表示在缓存构建完成之前,当前请求等待设定时间后,就可以绕过缓存直接请求代理服务;
定义缓存命中规则
proxy_cache_key "$host$request_uri $cookie_user";
通过$host、$request_uri、$cookie_user等nginx内置变量能自定义编辑缓存命中规则。默认规则时”$scheme$proxy_host$request_uri”,一次为协议(http或https)主机地址(ip和端口)和uri。
如何绕过缓存
proxy_cache_bypass $http_cache_bypass
本例中,当http_cache_bypass请求头不为0,则表示绕过缓存。但是绕过缓存的规则是可以自定义的。
客户端缓存
有时我们需要通过设置客户端缓存在提高缓存性能。
location ~* \.(css|js)$ {
expires 1y;
add_header Cache-Control "public";
}
location块能指定客户端缓存css和js文件。其中expires参数表示缓存的过期时间为1年,后面一个参数指令表示加入Cache-Control响应头,并将其置为public,这样在网络响应途中沿路的缓存服务允许缓存当前文件,如果将其置为private,则只允许客户端缓存当前文件。
清除缓存(nginx plus)
HTTP的method,除了常见的POST,GET,DELETE、OPTIONS和HEADER外,还有PURGE这个方法,我们可以在nginx中用它对缓存进行手动清除。
map $request_method $purge_method {
PURGE 1;
default 0;
}
server {
# ...
lication / {
proxy_cache_purge $purge_method;
}
}
当请求到来时,如果是PURGE方法,且传递变量非空非零,则会清除对应的缓存。
$ curl -XPURGE localhost/main.js
上面指令会清除main.js缓存文件。
缓存分片
为增加缓存的效率,有时你需要将文件进行分片。
proxy_cache_path /tmp/mycache keys_zone=mycache:10m;
server {
# ...
proxy_cache mycache;
slice 1m;
proxy_cache_key $host$uri$is_args$args$slice_range;
proxy_set_header Range $slice_range;
proxy_http_version 1.1;
proxy_cache_valid 200 206 1h;
location / {
proxy_pass http://origin:80;
}
}
范围请求分片往往应对视频缓存需求较多,该指令可以将视频进行字节范围分片。传统请求方式中,当一个大文件没有分片时,且没被缓存时,客户端会请求一整个文件;而当使用了当前指令将大型文件分片后,它在请求文件时,将只请求没被缓存的分片(并在请求后进行细粒度分片的缓存),并最终将所有分片聚集起来和成大文件。
发表回复