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.在配置缓存的位置{}块中, 添加proxy_cache_purge指令以指定用于缓存清除请求的条件。在我们的示例中, 它是在上面的步骤中配置的$ purge_method:
server {listen80; server_name www.example.com; location / {proxy_passhttps://localhost:8002; proxy_cache mycache; proxy_cache_purge $purge_method; }}

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

在上面的示例中, 将清除具有由星号通配符指定的公共URL部分的资源。但是, 此类高速缓存条目不会完全从高速缓存中删除:它们会保留在磁盘上, 直到因不活动而被删除, 或者被高速缓存清除程序(已将proxy_cache_path的purger参数启用)删除, 或者被客户端尝试访问它们。
限制对清除命令的访问
我们建议你限制允许发送缓存清除请求的IP地址数量:
geo $purge_allowed {default0; # deny from other10.0.0.11; # allow from localhost192.168.0.0/241; # 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 {}上下文中将purger参数包括到proxy_cache_path指令中:
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 {listen80; server_name www.example.com; location / {proxy_passhttps://localhost:8002; proxy_cachemycache; proxy_cache_purge $purge_method; }}geo $purge_allowed {default0; 10.0.0.11; 192.168.0.0/241; }map $request_method $purge_method {PURGE$purge_allowed; default 0; }}

字节范围缓存
有时, 初始高速缓存填充操作会花费很长时间, 尤其是对于大型文件。例如, 当视频文件开始下载以满足部分文件的初始请求时, 后续请求必须等待整个文件被下载并放入缓存中。
在Nginx中, 可以缓存这样的范围请求, 并使用” 缓存切片” 模块逐渐填充缓存, 该模块将文件分成较小的” 切片” 。每个范围请求都选择覆盖所请求范围的特定切片, 如果仍未缓存该范围, 则将其放入缓存。这些切片的所有其他请求都从缓存中获取数据。
要启用字节范围缓存:
  • 首先, 确保NGINX是使用Cache Slice模块编译的。
  • 使用slice指令定义切片的大小:
location / {slice1m; }

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

  • 使用206状态码启用响应缓存:
proxy_cache_valid 200 206 1h;

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

这里是完整的配置:
location / {slice1m; proxy_cachecache; proxy_cache_key$uri$is_args$args$slice_range; proxy_set_headerRange $slice_range; proxy_cache_valid 200 206 1h; proxy_passhttp://localhost:8000; }

【NGINX从缓存中清除内容】请注意, 如果启用了切片缓存, 则不得更改初始文件。
组合配置示例
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; }}}

    推荐阅读