Nginx 清除缓存

Nginx 清除缓存

Nginx 从缓存中清除内容

Nginx 可以从缓存中删除旧的和过时的缓存文件。必须删除过时的缓存内容,以防止同时提供新旧版本的网页。收到包含自定义 HTTP 标头或 HTTP PURGE 方法的特殊"清除"请求时,将清除(清理)缓存。

配置缓存清除

让我们设置一个配置,用于识别使用 HTTP PURGE 方法的请求并删除匹配的 URL。
1.在 http {} 上下文中,添加一个新变量,例如 $purge_method,它依赖于 $request_method 变量:
http {
    ...
    map $request_method $purge_method {
        PURGE 1;
        default 0;
    }
}

2、在配置缓存的 location {} 块中,添加 proxy_cache_purge 指令以指定缓存清除请求的条件。在我们的例子中,就是上面步骤中配置的$purge_method:
server {
    listen      80;
    server_name www.example.com;
    location / {
        proxy_pass  https://localhost:8002;
        proxy_cache mycache;
        proxy_cache_purge $purge_method;
    }
}

发送Purge命令

proxy_cache_purge指令配置完成后,我们需要发送一个特殊的cache?purge请求来清除缓存。我们可以使用一系列工具发出清除请求,包括本例中的 curl 命令:
$ curl-X PURGE-D-"https://www.example.com/*"
HTTP/1.1 204 No Content
Server: Nginx/1.15.0
Date: Sat, 19 May 2018 16:33:04 GMT
Connection: keep-alive

在上面的示例中,具有由星号通配符指定的公共 URL 部分的资源被清除。但是,此类缓存条目不会完全从缓存中删除: 它们保留在磁盘上,直到它们因不活动、缓存清除程序(使用 proxy_cache_path 的清除参数启用)或客户端尝试访问它们而被删除。

限制对清除命令的访问

我们建议您限制允许发送缓存清除请求的 IP 地址数量:
geo $purge_allowed {
   default         0;  # deny from other
   10.0.0.1        1;  # allow from localhost
   192.168.0.0/24  1;  # allow from 10.0.0.0/24
}
map $request_method $purge_method {
   PURGE   $purge_allowed;
   default 0;
}

在上面的例子中,Nginx 检查请求中是否使用了 PURGE 方法,如果是,则分析客户端 IP 地址。如果 IP 地址被列入白名单,则 $purge_method 设置为 $purge_allowed: 1 表示允许清除,0 表示拒绝。

完全从缓存中删除文件

要完全删除与星号匹配的缓存文件,请激活一个特殊的缓存清除进程,该进程永久迭代所有缓存条目并删除与通配符键匹配的条目。在 http {} 上下文中的 proxy_cache_path 指令中包含 purger 参数:
proxy_cache_path /data/Nginx/cache levels=1:2 keys_zone=mycache:10m purger=on;

缓存清除配置示例

http {
    ...
    proxy_cache_path /data/Nginx/cache levels=1:2 keys_zone=mycache:10m purger=on;
    map $request_method $purge_method {
        PURGE 1;
        default 0;
    }
    server {
        listen      80;
        server_name www.example.com;
        location / {
            proxy_pass        https://localhost:8002;
            proxy_cache       mycache;
            proxy_cache_purge $purge_method;
        }
    }
    geo $purge_allowed {
       default         0;
       10.0.0.1        1;
       192.168.0.0/24  1;
    }
    map $request_method $purge_method {
       PURGE   $purge_allowed;
       default 0;
    }
}

字节范围缓存

有时初始缓存填充操作需要相当长的时间,特别是对于大型文件。例如,当一个视频文件开始下载以满足部分文件的初始请求时,后续请求必须等待整个文件下载并放入缓存。
在 Nginx 中,它可以缓存此类范围请求,并使用 Cache Slice 模块逐渐填充缓存,该模块将文件划分为更小的"切片"。每个范围请求选择覆盖所请求范围的特定切片,如果该范围仍未缓存,则将其放入缓存中。对这些切片的所有其他请求都从缓存中获取数据。
要启用字节范围缓存:

首先,确保 Nginx 是使用 Cache Slice 模块编译的。
使用 slice 指令定义切片的大小:

location / {
    slice  1m;
}

选择使切片下载速度更快的切片大小。如果大小太小,则内存使用可能过多,并且打开了大量文件描述符。如果大小很大,则处理请求可能会导致延迟。将 $slice_range 变量添加到缓存键:

proxy_cache_key $uri$is_args$args$slice_range;

使用 206 状态代码启用响应缓存:

proxy_cache_valid 200 206 1h;

通过在 Range 标头字段中设置变量(即 $slice_range)来启用将范围请求传递到代理服务器:

proxy_set_header  Range $slice_range;

这里是完整的配置:
location / {
    slice             1m;
    proxy_cache       cache;
    proxy_cache_key   $uri$is_args$args$slice_range;
    proxy_set_header  Range $slice_range;
    proxy_cache_valid 200 206 1h;
    proxy_pass        http://localhost:8000;
}

注意,如果开启了切片缓存,则不能更改初始文件。

组合配置示例

http {
    ...
    proxy_cache_path /data/Nginx/cache keys_zone=one:10m loader_threshold=300 
                     loader_files=200 max_size=200m;
    server {
        listen 8080;
        proxy_cache mycache;
        location / {
            proxy_pass http://backend1;
        }
        location /some/path {
            proxy_pass http://backend2;
            proxy_cache_valid any 1m;
            proxy_cache_min_uses 3;
            proxy_cache_bypass $cookie_nocache $arg_nocache$arg_comment;
        }
    }
}