更新時間:2021-09-22 10:53:33 來源:動力節點 瀏覽1399次
緩存來自代理的Web和應用程序服務器的靜態和動態內容,以加快向客戶端的交付速度并減少服務器上的負載。
啟用緩存后,NGINX Plus 將響應保存在磁盤緩存中,并使用它們來響應客戶端,而不必每次都代理對相同內容的請求。
要了解有關 NGINX Plus 緩存功能的更多信息,請按需觀看NGINX內容緩存網絡研討會,并深入了解動態內容緩存 、緩存清除和延遲緩存等功能。
要啟用緩存,請proxy_cache_path 在頂級http {}上下文中包含該指令。第一個強制參數是緩存內容的本地文件系統路徑,強制keys_zone參數定義用于存儲有關緩存項的元數據的共享內存區域的名稱和大小:
http {
# ...
proxy_cache_path /data/nginx/cache keys_zone=one:10m;
}
然后proxy_cache 在要緩存服務器響應的上下文(協議類型、虛擬服務器或位置)中包含指令,指定由指令的keys_zone參數定義的區域名稱proxy_cache_path(在本例中為one):
http {
# ...
proxy_cache_path /data/nginx/cache keys_zone=one:10m;
server {
proxy_cache mycache;
location / {
proxy_pass http://localhost:8000;
}
}
}
請注意,該keys_zone參數定義的大小不限制緩存響應數據的總量。緩存的響應本身與文件系統上特定文件中的元數據副本一起存儲。要限制緩存響應數據的數量,請將max_size參數包含在proxy_cache_path 指令中。(但請注意,緩存數據量可能會暫時超過此限制,如下一節所述。)
有兩個額外的 NGINX 進程參與緩存:
該高速緩存管理器周期性地起動,檢查高速緩存的狀態。如果緩存大小超過 指令的max_size參數設置的限制proxy_cache_path,緩存管理器將刪除最近最少訪問的數據。如前所述,在緩存管理器激活之間的時間內,緩存數據量可能會暫時超過限制。
該緩存加載器只運行一次,NGINX開始之后。它將有關先前緩存數據的元數據加載到共享內存區域。在啟動后的最初幾分鐘內,一次加載整個緩存可能會消耗足夠的資源來降低 NGINX 的性能。為避免這種情況,請通過在proxy_cache_path 指令中包含以下參數來配置緩存的迭代加載:
loader_threshold– 迭代的持續時間,以毫秒為單位(默認情況下,200)
loader_files– 一次迭代期間加載的最大項目數(默認為100)
loader_sleeps– 迭代之間的延遲,以毫秒為單位(默認情況下,50)
在以下示例中,迭代持續300幾毫秒或直到200項目加載完畢:
proxy_cache_path /data/nginx/cache keys_zone=one:10m loader_threshold=300 loader_files=200;
默認情況下,NGINX Plus 緩存第一次從代理服務器收到此類響應時,對使用 HTTPGET和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;
要使用GETand以外的方法緩存對請求的響應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 分鐘內有效。要為具有所有狀態代碼的響應定義有效時間,請指定any為第一個參數:
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 標頭或 HTTPPURGE方法的特殊“清除”請求時,將清除緩存。
配置緩存清除
讓我們設置一個配置來識別使用 HTTPPURGE方法的請求并刪除匹配的 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 部分(由星號通配符指定)的資源被清除。但是,此類緩存條目不會完全從緩存中刪除:它們保留在磁盤上,直到它們因不活動(由 指令的inactive參數確定proxy_cache_path)或緩存清除器(使用purger 參數 to啟用proxy_cache_path)或客戶端而被刪除嘗試訪問它們。
限制對清除命令的訪問
我們建議您限制允許發送緩存清除請求的 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拒絕它。
從緩存中完全刪除文件
要完全刪除與星號匹配的緩存文件,請激活一個特殊cache purger過程,該過程會永久迭代所有緩存條目并刪除與通配符鍵匹配的條目。 在上下文中包含指令的purger 參數:proxy_cache_pathhttp {}
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 可以緩存此類范圍請求,并使用Cache Slice 模塊逐漸填充緩存,該模塊將文件劃分為更小的“切片”。每個范圍請求選擇覆蓋所請求范圍的特定切片,如果該范圍仍未緩存,則將其放入緩存中。對這些切片的所有其他請求都從緩存中獲取數據。
要啟用字節范圍緩存:
確保 NGINX 是使用緩存切片 模塊編譯的。
使用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=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;
}
}
}
在此示例中,兩個位置使用相同的緩存,但方式不同。
因為響應backend1很少改變,所以不包含緩存控制指令。響應在第一次發出請求時被緩存,并且無限期地保持有效。
相比之下,對請求服務的響應backend2頻繁更改,因此它們僅在 1 分鐘內有效,并且在發出 3 次相同請求之前不會被緩存。此外,如果請求與proxy_cache_bypass指令定義的條件匹配,NGINX Plus 會立即將請求傳遞給 ,backend2而無需在緩存中查找相應的響應。
動力節點Java在線學習中有更多關于Java的知識點,針對沒有任何Java基礎的讀者學習,讓你從入門到精通,主要介紹了一些Java基礎的核心知識,讓同學們更好更方便的學習和了解Java編程,感興趣的同學可以關注一下。
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習