NGINX 可以從緩存中刪除舊的和過期的緩存文件。過期的緩存內(nèi)容需要及時刪除,以防止同時提供新舊版本的網(wǎng)頁。當收到包含自定義 HTTP 標頭或 HTTP PURGE 方法的特殊“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.caioniaojc.com; location / { proxy_pass https://localhost:8002; proxy_cache mycache; proxy_cache_purge $purge_method; } }
當 proxy_cache_purge 指令配置完成后,我們需要發(fā)送一個特殊的 cache?purge 請求來清除緩存。我們可以使用一系列工具發(fā)出清除請求,包括本例中的 curl 命令:
$ curl -X PURGE -D - "http://www.soo66.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 部分的資源被清除。但是,此類緩存條目不會完全從緩存中刪除:它們保留在磁盤上,直到它們因不活動、緩存清除程序或客戶端嘗試訪問它們而被刪除。
建議限制允許發(fā)送緩存清除請求的 IP 地址數(shù)量:
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 參數(shù):
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; } }
有時初始緩存填充操作需要相當長的時間,特別是對于大型文件。例如,當一個視頻文件開始下載以滿足部分文件的初始請求時,后續(xù)請求必須等待整個文件下載并放入緩存中。
在 Nginx 中,可以緩存此類范圍請求,并使用 Cache Slice 模塊逐漸填充緩存,該模塊將文件劃分為更小的“切片”。每個范圍請求選擇覆蓋所請求范圍的特定切片,如果該范圍仍未緩存,則將其放入緩存中。對這些切片的所有其他請求都從緩存中獲取數(shù)據(jù)。
要啟用字節(jié)范圍緩存:
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; } } }