Nginx R31 doc-07-內容快取

老马啸西风發表於2024-05-22

NGINX 內容快取

從代理的 Web 和應用伺服器快取靜態和動態內容,以加快向客戶端的傳輸速度並減輕伺服器的負載。

概覽

啟用快取時,NGINX Plus 會將響應儲存在磁碟快取中,並使用它們來響應客戶端,而無需每次都代理相同內容的請求。

要了解有關 NGINX Plus 快取功能的更多資訊,請觀看點播的 Content Caching with NGINX 網路研討會,並深入瞭解諸如動態內容快取、快取清除和延遲快取等功能。

啟用響應快取

要啟用快取,請在頂級 http {} 上下文中包含 proxy_cache_path 指令。第一個必需引數是用於快取內容的本地檔案系統路徑,必需的 keys_zone 引數定義了用於儲存關於快取項的後設資料的共享記憶體區的名稱和大小:

http {
    # ...
    proxy_cache_path /data/nginx/cache keys_zone=mycache:10m;
}

然後,在您希望快取伺服器響應的上下文(協議型別、虛擬伺服器或位置)中包含 proxy_cache 指令,指定由 proxy_cache_path 指令中的 keys_zone 引數定義的區域名稱(在此示例中為 mycache):

http {
    # ...
    proxy_cache_path /data/nginx/cache keys_zone=mycache:10m;
    server {
        proxy_cache mycache;
        location / {
            proxy_pass http://localhost:8000;
        }
    }
}

請注意,由 keys_zone 引數定義的大小不限制快取響應資料的總量。快取的響應本身儲存在檔案系統上的特定檔案中,其中包含後設資料的副本。要限制快取響應資料的總量,請在 proxy_cache_path 指令中包含 max_size 引數。(但請注意,快取資料的量在快取管理器啟用之間的時間段內可能會暫時超過此限制,如下一節所述。)

參與快取的 NGINX 程序

在快取中涉及兩個額外的 NGINX 程序:

  • 快取管理器定期啟用以檢查快取的狀態。如果快取大小超過由 proxy_cache_path 指令中的 max_size 引數設定的限制,快取管理器將刪除最近最少訪問的資料。如前所述,快取資料的量在快取管理器啟用之間的時間段內可能會暫時超過此限制。

  • 快取載入器僅在 NGINX 啟動後立即執行一次。它將先前快取資料的後設資料載入到共享記憶體區中。一次性載入整個快取可能會消耗足夠的資源,從而在啟動後的前幾分鐘內降低 NGINX 的效能。為了避免這種情況,請透過在 proxy_cache_path 指令中包含以下引數來配置快取的迭代載入:

    • loader_threshold – 迭代的持續時間,以毫秒為單位(預設值為 200)
    • loader_files – 在一次迭代中載入的最大專案數(預設值為 100)
    • loader_sleeps – 迭代之間的延遲,以毫秒為單位(預設值為 50)

在以下示例中,迭代持續時間為 300 毫秒,或者在載入 200 個專案後停止:

proxy_cache_path /data/nginx/cache keys_zone=mycache:10m loader_threshold=300 loader_files=200;

指定要快取的請求

預設情況下,NGINX Plus 會快取所有使用 HTTP GET 和 HEAD 方法發出的請求的響應,第一次收到此類響應時。作為請求的鍵(識別符號),NGINX Plus 使用請求字串。如果請求具有與快取響應相同的鍵,NGINX Plus 將快取響應傳送給客戶端。您可以在 http {}、server {} 或 location {} 上下文中包含各種指令,以控制哪些響應被快取。

要更改用於計算鍵的請求特徵,請包含 proxy_cache_key 指令:

proxy_cache_key "$host$request_uri$cookie_user";

要定義具有相同鍵的請求必須被製作多少次才能將響應快取,請包含 proxy_cache_min_uses 指令:

proxy_cache_min_uses 5;

要快取除 GET 和 HEAD 外的其他方法的請求的響應,請將它們與 GET 和 HEAD 一起列在 proxy_cache_methods 指令的引數中:

proxy_cache_methods GET HEAD POST;

限制或禁用快取

預設情況下,響應將無限期地保留在快取中。只有當快取超過最大配置大小時,它們才會被刪除,並且根據它們自上次請求以來的時間長度的順序進行刪除。

您可以透過在 http {}、server {} 或 location {} 上下文中包含指令來設定快取響應的有效期限,或者甚至確定它們是否被使用:

要限制特定狀態程式碼的快取響應被視為有效的時間,請包含 proxy_cache_valid 指令:

proxy_cache_valid 200 302 10m;
proxy_cache_valid 404      1m;

在此示例中,程式碼為 200 或 302 的響應在 10 分鐘內視為有效,而程式碼為 404 的響應在 1 分鐘內視為有效。要為所有狀態程式碼的響應定義有效時間,請將任何指定為第

一個引數:

proxy_cache_valid any 5m;

要定義 NGINX Plus 在何種情況下不會向客戶端傳送快取的響應,請包含 proxy_cache_bypass 指令。每個引數都定義一個條件,並由一些變數組成。如果至少有一個引數不為空且不等於 “0”(零),NGINX Plus 就不會在快取中查詢響應,而是立即將請求轉發到後端伺服器。

proxy_cache_bypass $cookie_nocache $arg_nocache$arg_comment;

要定義 NGINX Plus 在何種情況下根本不快取響應,請包含 proxy_no_cache 指令,並以與 proxy_cache_bypass 指令相同的方式定義引數。

proxy_no_cache $http_pragma $http_authorization;

清除快取內容

NGINX 可以刪除快取中過期的快取檔案。這是為了刪除過期的快取內容,以防止同時提供舊版本和新版本的網頁。在接收到包含自定義 HTTP 頭或 HTTP PURGE 方法的特殊“清除”請求時,快取將被清除。

配置快取清除

讓我們設定一個配置,識別使用 HTTP PURGE 方法並刪除匹配的 URL 的請求。

在 http {} 上下文中,建立一個新變數,例如 $purge_method,它依賴於 $request_method 變數:

http {
    # ...
    map $request_method $purge_method {
        PURGE 1;
        default 0;
    }
}

在配置了快取的 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 指令時,您需要傳送一個特殊的快取清除請求來清除快取。您可以使用各種工具傳送清除請求,包括像下面這樣使用 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 指令的 inactive 引數確定)或由快取清除器(透過 proxy_cache_path 的 purger 引數啟用)而被刪除,或者客戶端嘗試訪問它們。

限制對清除命令的訪問

我們建議您限制允許傳送快取清除請求的 IP 地址數量:

geo $purge_allowed {
   default         0;  # deny from other
   10.0.0.1        1;  # allow from 10.0.0.1 address
   192.168.0.0/24  1;  # allow from 192.168.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;

位元組範圍快取

初始快取填充操作有時需要相當長的時間,特別是對於大檔案。例如,當影片檔案開始下載以滿足檔案的一部分的初始請求時,後續請求必須等待整個檔案下載並放入快取中。

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;
  • 透過設定 $slice_range 變數到 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=mycache

: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;
        }
    }
}

在此示例中,兩個位置使用相同的快取,但以不同的方式。

由於來自 backend1 的響應很少更改,因此未包含任何快取控制指令。響應在第一次請求時被快取,並無限期保持有效。

相反,對由 backend2 提供的請求的響應經常更改,因此它們只有在 1 分鐘內才被認為有效,並且直到相同請求被 3 次執行才被快取。

此外,如果請求匹配了 proxy_cache_bypass 指令定義的條件,則 NGINX Plus 會立即將請求傳遞到 backend2,而不會在快取中查詢相應的響應。

nginx 系列

Nginx-01-聊一聊 nginx

Nginx-01-Nginx 是什麼

Nginx-02-為什麼使用 Nginx

Nginx-02-Nginx Ubuntu 安裝 + windows10 + WSL ubuntu 安裝 nginx 實戰筆記

Nginx-02-基本使用

Nginx-03-Nginx 專案架構

Nginx-04-Docker Nginx

Nginx-05-nginx 反向代理是什麼?windows 下如何配置使用 nginx

Nginx-06-nginx 彙總入門介紹

Nginx R31 doc 官方文件-01-nginx 如何安裝

Nginx R31 doc-02-nginx 基本功能

Nginx R31 doc-03-HTTP Load Balancing HTTP 負載均衡

Nginx R31 doc-04-HTTP Health Checks

Nginx R31 doc-05-Dynamic Configuration of Upstreams with the NGINX Plus API 使用 NGINX Plus API 動態配置上游伺服器

Nginx R31 doc-06-Accepting the PROXY Protocol

Nginx R31 doc-07-內容快取

Nginx R31 doc-08-Configuring NGINX and NGINX Plus as a Web Server 配置 NGINX 和 NGINX Plus 作為 Web 伺服器

Nginx R31 doc-09-Serving Static Content 靜態內容

Nginx R31 doc-10-NGINX Reverse Proxy 反向代理

Nginx R31 doc-11-Compression and Decompression 壓縮與解壓縮

Nginx R31 doc-12-NGINX SSL Termination 安全加密

Nginx R31 doc-13-Limiting Access to Proxied HTTP Resources 訪問限流

Nginx R31 doc-14-Dynamic Denylisting of IP Addresses 動態拒絕IP地址

Nginx R31 doc-15-Live Activity Monitoring 實時活動監控

Nginx R31 doc-16-logging 配置日誌

Nginx R31 doc-17-debugging 除錯

Nginx R31 doc-18-High Availability Support for NGINX Plus in On-Premises Deployments

Nginx 實戰-01-nginx ubuntu 安裝筆記

Nginx 實戰-01-nginx windows 安裝筆記

Nginx 實戰-02-nginx proxy_pass 服務代理訪問 使用筆記 ubuntu nodejs

Nginx 實戰-03-nginx 負載均衡

Nginx 實戰-04-nginx 不同的地址訪問不同的服務

Nginx 實戰-05-nginx 反向代理實現域名到指定的 ip

相關文章