📅  最后修改于: 2021-01-07 06:20:50             🧑  作者: Mango
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 {
listen 80;
server_name www.example.com;
location / {
proxy_pass https://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 Content
Server: nginx/1.15.0
Date: Sat, 19 May 2018 16:33:04 GMT
Connection: keep-alive
在上面的示例中,将清除具有由星号通配符指定的公共URL部分的资源。但是,此类高速缓存条目不会完全从高速缓存中删除:它们会一直保留在磁盘上,直到因不活动而被删除,或者被高速缓存清除程序(已将proxy_cache_path的purger参数启用)删除,或者被客户端尝试访问它们。
我们建议您限制允许发送缓存清除请求的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 {}上下文中将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 {
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中,可以缓存此类范围请求,并使用“缓存切片”模块逐渐填充缓存,该模块将文件分为较小的“切片”。每个范围请求都会选择覆盖所请求范围的特定切片,如果仍未缓存该范围,则将其放入缓存。这些切片的所有其他请求都从缓存中获取数据。
要启用字节范围缓存:
location / {
slice 1m;
}
proxy_cache_key $uri$is_args$args$slice_range;
proxy_cache_valid 200 206 1h;
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;
}
}
}