更新時(shí)間:2021-09-22 10:53:33 來源:動力節(jié)點(diǎn) 瀏覽1307次
緩存來自代理的Web和應(yīng)用程序服務(wù)器的靜態(tài)和動態(tài)內(nèi)容,以加快向客戶端的交付速度并減少服務(wù)器上的負(fù)載。
啟用緩存后,NGINX Plus 將響應(yīng)保存在磁盤緩存中,并使用它們來響應(yīng)客戶端,而不必每次都代理對相同內(nèi)容的請求。
要了解有關(guān) NGINX Plus 緩存功能的更多信息,請按需觀看NGINX內(nèi)容緩存網(wǎng)絡(luò)研討會,并深入了解動態(tài)內(nèi)容緩存 、緩存清除和延遲緩存等功能。
要啟用緩存,請proxy_cache_path 在頂級http {}上下文中包含該指令。第一個(gè)強(qiáng)制參數(shù)是緩存內(nèi)容的本地文件系統(tǒng)路徑,強(qiáng)制keys_zone參數(shù)定義用于存儲有關(guān)緩存項(xiàng)的元數(shù)據(jù)的共享內(nèi)存區(qū)域的名稱和大小:
http {
# ...
proxy_cache_path /data/nginx/cache keys_zone=one:10m;
}
然后proxy_cache 在要緩存服務(wù)器響應(yīng)的上下文(協(xié)議類型、虛擬服務(wù)器或位置)中包含指令,指定由指令的keys_zone參數(shù)定義的區(qū)域名稱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參數(shù)定義的大小不限制緩存響應(yīng)數(shù)據(jù)的總量。緩存的響應(yīng)本身與文件系統(tǒng)上特定文件中的元數(shù)據(jù)副本一起存儲。要限制緩存響應(yīng)數(shù)據(jù)的數(shù)量,請將max_size參數(shù)包含在proxy_cache_path 指令中。(但請注意,緩存數(shù)據(jù)量可能會暫時(shí)超過此限制,如下一節(jié)所述。)
有兩個(gè)額外的 NGINX 進(jìn)程參與緩存:
該高速緩存管理器周期性地起動,檢查高速緩存的狀態(tài)。如果緩存大小超過 指令的max_size參數(shù)設(shè)置的限制proxy_cache_path,緩存管理器將刪除最近最少訪問的數(shù)據(jù)。如前所述,在緩存管理器激活之間的時(shí)間內(nèi),緩存數(shù)據(jù)量可能會暫時(shí)超過限制。
該緩存加載器只運(yùn)行一次,NGINX開始之后。它將有關(guān)先前緩存數(shù)據(jù)的元數(shù)據(jù)加載到共享內(nèi)存區(qū)域。在啟動后的最初幾分鐘內(nèi),一次加載整個(gè)緩存可能會消耗足夠的資源來降低 NGINX 的性能。為避免這種情況,請通過在proxy_cache_path 指令中包含以下參數(shù)來配置緩存的迭代加載:
loader_threshold– 迭代的持續(xù)時(shí)間,以毫秒為單位(默認(rèn)情況下,200)
loader_files– 一次迭代期間加載的最大項(xiàng)目數(shù)(默認(rèn)為100)
loader_sleeps– 迭代之間的延遲,以毫秒為單位(默認(rèn)情況下,50)
在以下示例中,迭代持續(xù)300幾毫秒或直到200項(xiàng)目加載完畢:
proxy_cache_path /data/nginx/cache keys_zone=one:10m loader_threshold=300 loader_files=200;
默認(rèn)情況下,NGINX Plus 緩存第一次從代理服務(wù)器收到此類響應(yīng)時(shí),對使用 HTTPGET和HEAD方法發(fā)出的請求的所有響應(yīng)。作為請求的密鑰(標(biāo)識符),NGINX Plus 使用請求字符串。如果請求與緩存響應(yīng)具有相同的鍵,NGINX Plus 將緩存響應(yīng)發(fā)送到客戶端。您可以在不同的指令http {},server {}或location {}上下文來控制其響應(yīng)緩存。
要更改用于計(jì)算密鑰的請求特征,請包含以下proxy_cache_key 指令:
proxy_cache_key "$host$request_uri$cookie_user";
要定義在緩存響應(yīng)之前必須發(fā)出具有相同鍵的請求的最小次數(shù),請包含proxy_cache_min_uses 指令:
proxy_cache_min_uses 5;
要使用GETand以外的方法緩存對請求的響應(yīng)HEAD,請將它們與GET和HEAD作為proxy_cache_methods 指令的參數(shù)一起列出:
proxy_cache_methods GET HEAD POST;
默認(rèn)情況下,響應(yīng)會無限期地保留在緩存中。僅當(dāng)緩存超過最大配置大小時(shí)才會刪除它們,然后按自上次請求以來的時(shí)間長度排序。您可以設(shè)置多長時(shí)間緩存的響應(yīng)被認(rèn)為是有效的,甚至他們是否在所有使用,通過在指示http {},server {}或location {}上下文:
要限制具有特定狀態(tài)代碼的緩存響應(yīng)被視為有效的時(shí)間,請包含以下proxy_cache_valid 指令:
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
在本例中,帶有代碼200或的響應(yīng)302被認(rèn)為在 10 分鐘404內(nèi)有效,帶有代碼的響應(yīng)在 1 分鐘內(nèi)有效。要為具有所有狀態(tài)代碼的響應(yīng)定義有效時(shí)間,請指定any為第一個(gè)參數(shù):
proxy_cache_valid any 5m;
要定義 NGINX Plus 不向客戶端發(fā)送緩存響應(yīng)的條件,請包含該proxy_cache_bypass 指令。每個(gè)參數(shù)定義一個(gè)條件并由多個(gè)變量組成。如果至少有一個(gè)參數(shù)不為空且不等于“ 0”(零),NGINX Plus 不會在緩存中查找響應(yīng),而是立即將請求轉(zhuǎn)發(fā)到后端服務(wù)器。
proxy_cache_bypass $cookie_nocache $arg_nocache$arg_comment;
要定義 NGINX Plus 根本不緩存響應(yīng)的條件,請包含proxy_no_cache 指令,以與proxy_cache_bypass指令相同的方式定義參數(shù)。
proxy_no_cache $http_pragma $http_authorization;
NGINX 可以從緩存中刪除過時(shí)的緩存文件。這對于刪除過時(shí)的緩存內(nèi)容以防止同時(shí)提供新舊版本的網(wǎng)頁是必要的。收到包含自定義 HTTP 標(biāo)頭或 HTTPPURGE方法的特殊“清除”請求時(shí),將清除緩存。
配置緩存清除
讓我們設(shè)置一個(gè)配置來識別使用 HTTPPURGE方法的請求并刪除匹配的 URL。
在http {}上下文中,創(chuàng)建一個(gè)$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;
}
}
發(fā)送清除命令
當(dāng)proxy_cache_purge指令配置,你需要發(fā)送一個(gè)特殊的緩存清除請求清除緩存。您可以使用一系列工具發(fā)出清除請求,包括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參數(shù)確定proxy_cache_path)或緩存清除器(使用purger 參數(shù) to啟用proxy_cache_path)或客戶端而被刪除嘗試訪問它們。
限制對清除命令的訪問
我們建議您限制允許發(fā)送緩存清除請求的 IP 地址數(shù)量:
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;
}
在這個(gè)例子中,NGINX 檢查該P(yáng)URGE方法是否在請求中使用,如果是,則分析客戶端 IP 地址。如果 IP 地址被列入白名單,則$purge_method設(shè)置為$purge_allowed:1允許清除,并0拒絕它。
從緩存中完全刪除文件
要完全刪除與星號匹配的緩存文件,請激活一個(gè)特殊cache purger過程,該過程會永久迭代所有緩存條目并刪除與通配符鍵匹配的條目。 在上下文中包含指令的purger 參數(shù):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;
}
}
初始緩存填充操作有時(shí)需要相當(dāng)長的時(shí)間,尤其是對于大文件。例如,當(dāng)一個(gè)視頻文件開始下載以滿足部分文件的初始請求時(shí),后續(xù)請求必須等待整個(gè)文件下載并放入緩存中。
NGINX 可以緩存此類范圍請求,并使用Cache Slice 模塊逐漸填充緩存,該模塊將文件劃分為更小的“切片”。每個(gè)范圍請求選擇覆蓋所請求范圍的特定切片,如果該范圍仍未緩存,則將其放入緩存中。對這些切片的所有其他請求都從緩存中獲取數(shù)據(jù)。
要啟用字節(jié)范圍緩存:
確保 NGINX 是使用緩存切片 模塊編譯的。
使用slice 指令指定切片的大小:
location / {
slice 1m;
}
選擇使切片下載速度更快的切片大小。如果大小太小,可能會導(dǎo)致內(nèi)存使用過多,處理請求時(shí)會打開大量文件描述符,而過大可能會導(dǎo)致延遲。
將$slice_range 變量包含到緩存鍵中:
proxy_cache_key $uri$is_args$args$slice_range;
使用206狀態(tài)代碼啟用響應(yīng)緩存:
proxy_cache_valid 200 206 1h;
通過$slice_range 在Range標(biāo)頭字段中設(shè)置變量來啟用范圍請求到代理服務(wù)器的傳遞:
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;
}
請注意,如果打開切片緩存,則不得更改初始文件。
以下示例配置結(jié)合了上述一些緩存選項(xiàng)。
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;
}
}
}
在此示例中,兩個(gè)位置使用相同的緩存,但方式不同。
因?yàn)轫憫?yīng)backend1很少改變,所以不包含緩存控制指令。響應(yīng)在第一次發(fā)出請求時(shí)被緩存,并且無限期地保持有效。
相比之下,對請求服務(wù)的響應(yīng)backend2頻繁更改,因此它們僅在 1 分鐘內(nèi)有效,并且在發(fā)出 3 次相同請求之前不會被緩存。此外,如果請求與proxy_cache_bypass指令定義的條件匹配,NGINX Plus 會立即將請求傳遞給 ,backend2而無需在緩存中查找相應(yīng)的響應(yīng)。
動力節(jié)點(diǎn)Java在線學(xué)習(xí)中有更多關(guān)于Java的知識點(diǎn),針對沒有任何Java基礎(chǔ)的讀者學(xué)習(xí),讓你從入門到精通,主要介紹了一些Java基礎(chǔ)的核心知識,讓同學(xué)們更好更方便的學(xué)習(xí)和了解Java編程,感興趣的同學(xué)可以關(guān)注一下。
初級 202925
初級 203221
初級 202629
初級 203743