spice and wolfspice and wolf Be the One you wanna Be

nginx缓存

缓存只在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;
    }
}

范围请求分片往往应对视频缓存需求较多,该指令可以将视频进行字节范围分片。传统请求方式中,当一个大文件没有分片时,且没被缓存时,客户端会请求一整个文件;而当使用了当前指令将大型文件分片后,它在请求文件时,将只请求没被缓存的分片(并在请求后进行细粒度分片的缓存),并最终将所有分片聚集起来和成大文件。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

Press ESC to close