無涯教程:Nginx - 清除緩存內容介紹

NGINX可以從緩存中刪除舊的和過期的緩存文件。刪除過期的緩存內容是強制性的,以防止同時提供新舊版本的網頁。收到包含自定義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.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;
    }
}

Byte-Range緩存

有時,初始高速緩存填充操作會花費很長時間,尤其是對於大型文件。例如,當視頻文件開始下載以滿足部分文件的初始請求時,後續請求必須等待整個文件被下載並放入緩存中。

在Nginx中,可以緩存這樣的範圍請求,並使用"Cache Slice"模塊逐漸填充緩存,該模塊將文件分成較小的"slices"。每個範圍請求都選擇覆蓋所請求範圍的特定切片,如果仍未緩存該範圍,則將其放入緩存。這些切片的所有其他請求都從緩存中獲取數據。

啓用byte-range緩存:

  • 首先,確保使用緩存切片模塊編譯了NGINX。
  • 使用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;
        }
    }
}

https://www.learnfk.com/article-nginx-purging-content-from-the-cache

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章