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