本節(jié)介紹如何啟用和配置從代理服務(wù)器接收的響應(yīng)的緩存。主要涉及以下內(nèi)容 -
當(dāng)啟用緩存時(shí),NGINX將響應(yīng)保存在磁盤緩存中,并使用它們來響應(yīng)客戶端,而不必每次都為同一內(nèi)容代理請(qǐng)求。
要啟用緩存,請(qǐng)?jiān)陧攲拥?code>http上下文中包含proxy_cache_path指令。 強(qiáng)制的第一個(gè)參數(shù)是緩存內(nèi)容的本地文件系統(tǒng)路徑,強(qiáng)制keys_zone參數(shù)定義用于存儲(chǔ)有關(guān)緩存項(xiàng)目的元數(shù)據(jù)的共享內(nèi)存區(qū)域的名稱和大?。?/p>
http {
...
proxy_cache_path /data/nginx/cache keys_zone=one:10m;
}
然后在要緩存服務(wù)器響應(yīng)的上下文(協(xié)議類型,虛擬服務(wù)器或位置)中包含proxy_cache指令,將由keys_zone參數(shù)定義的區(qū)域名稱指定為proxy_cache_path指令(在本例中為一):
http {
...
proxy_cache_path /data/nginx/cache keys_zone=one:10m;
server {
proxy_cache one;
location / {
proxy_pass http://localhost:8000;
}
}
}
請(qǐng)注意,由keys_zone參數(shù)定義的大小不會(huì)限制緩存的響應(yīng)數(shù)據(jù)的總量。 緩存響應(yīng)本身存儲(chǔ)在文件系統(tǒng)上的特定文件中的元數(shù)據(jù)副本。 要限制緩存的響應(yīng)數(shù)據(jù)量,請(qǐng)將max_size參數(shù)包含到proxy_cache_path指令中(但請(qǐng)注意,緩存數(shù)據(jù)的數(shù)量可能會(huì)臨時(shí)超出此限制,如以下部分所述。)
緩存中還有兩個(gè)額外的NGINX進(jìn)程:
緩存管理器周期性地被激活以檢查緩存的狀態(tài)。 如果緩存大小超過了由max_cize_path指令設(shè)置的max_size參數(shù),緩存管理器將刪除最近訪問的數(shù)據(jù)。如前所述,高速緩存管理器激活之間的緩存數(shù)據(jù)量可以臨時(shí)超過限制。
NGINX啟動(dòng)后,緩存加載程序只運(yùn)行一次。 它將有關(guān)以前緩存的數(shù)據(jù)的元數(shù)據(jù)加載到共享內(nèi)存區(qū)域。一次加載整個(gè)緩存可能會(huì)在啟動(dòng)后的最初幾分鐘內(nèi)消耗足夠的資源來減慢NGINX的性能。 為了避免這種情況,請(qǐng)通過將以下參數(shù)包含到proxy_cache_path偽指令來配置緩存的迭代加載:
loader_threshold - 迭代的持續(xù)時(shí)間,以毫秒為單位(默認(rèn)為200)loader_files - 在一次迭代期間加載的最大項(xiàng)目數(shù)(默認(rèn)為100)loader_sleeps - 迭代之間的延遲(以毫秒為單位)(默認(rèn)為50)在以下示例中,迭代持續(xù)300毫秒或直到加載了200個(gè)項(xiàng)目:
proxy_cache_path /data/nginx/cache keys_zone=one:10m loader_threshold=300 loader_files=200;
默認(rèn)情況下,NGINX首次從代理服務(wù)器接收到這樣的響應(yīng)后,緩存對(duì)HTTP GET和HEAD方法的請(qǐng)求的所有響應(yīng)。 作為請(qǐng)求的密鑰(標(biāo)識(shí)符),NGINX使用請(qǐng)求字符串。 如果請(qǐng)求具有與緩存響應(yīng)相同的密鑰,則NGINX將緩存的響應(yīng)發(fā)送給客戶端。 您可以在http, server, 或 location上下文中包含各種指令,以控制哪些響應(yīng)被緩存。
要更改在計(jì)算密鑰時(shí)使用的請(qǐng)求字符,請(qǐng)包括proxy_cache_key偽指令:
proxy_cache_key "$host$request_uri$cookie_user";
要定義在緩存響應(yīng)之前必須進(jìn)行具有相同密鑰的請(qǐng)求的最小次數(shù),請(qǐng)包括proxy_cache_min_uses指令:
proxy_cache_min_uses 5;
要使用除GET和HEAD之外的方法來緩存對(duì)請(qǐng)求的響應(yīng),請(qǐng)將它們與GET和HEAD一起列為proxy_cache_methods偽指令的參數(shù):
proxy_cache_methods GET HEAD POST;
默認(rèn)情況下,響應(yīng)將無限期地保留在緩存中。 只有緩存超過最大配置大小,然后按照最后一次請(qǐng)求的時(shí)間長(zhǎng)度,它們才被刪除。 您可以通過在http, server, 或 location上下文中包含指令來設(shè)置緩存響應(yīng)被認(rèn)為有效的時(shí)間長(zhǎng)度,甚至是否使用它們。
要限制緩存響應(yīng)與特定狀態(tài)代碼被認(rèn)為有效的時(shí)間,請(qǐng)包括proxy_cache_valid指令:
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
在此示例中,使用代碼200或302的響應(yīng)有效時(shí)間為10分鐘,并且代碼404的響應(yīng)有效1分鐘。 要定義具有所有狀態(tài)代碼的響應(yīng)的有效時(shí)間,請(qǐng)指定any作為第一個(gè)參數(shù):
proxy_cache_valid any 5m;
要定義NGINX不會(huì)向客戶端發(fā)送緩存響應(yīng)的條件,請(qǐng)包括proxy_cache_bypass指令。 每個(gè)參數(shù)定義一個(gè)條件并由多個(gè)變量組成。 如果至少有一個(gè)參數(shù)不為空,并且不等于“0”(零),則NGINX不會(huì)在緩存中查找響應(yīng),而是將請(qǐng)求立即轉(zhuǎn)發(fā)到后端服務(wù)器。
proxy_cache_bypass $cookie_nocache $arg_nocache$arg_comment;
要定義NGINX根本不緩存響應(yīng)的條件,請(qǐng)包括proxy_no_cache指令,以與proxy_cache_bypass偽指令相同的方式定義參數(shù)。
proxy_no_cache $http_pragma $http_authorization;
NGINX可以從緩存中刪除過期的緩存文件。刪除過期的緩存內(nèi)容以防止同時(shí)提供舊版本和新版本的網(wǎng)頁。 在接收到包含自定義HTTP頭或“PURGE” HTTP方法的特殊“purge”請(qǐng)求時(shí),緩存被清除。
我們?cè)O(shè)置一個(gè)配置來標(biāo)識(shí)使用“PURGE” HTTP方法的請(qǐng)求并刪除匹配的URL。
http塊層級(jí)上,創(chuàng)建一個(gè)新變量,例如:$purge_method,這將取決于$request_method變量:http {
...
map $request_method $purge_method {
PURGE 1;
default 0;
}
}
在location中配置高速緩存,包括指定緩存清除請(qǐng)求的條件的proxy_cache_purge指令。 在我們的例子中,它是在上一步配置的$purge_method:
server {
listen 80;
server_name www.example.com;
location / {
proxy_pass http://localhost:8002;
proxy_cache mycache;
proxy_cache_purge $purge_method;
}
}
配置proxy_cache_purge指令后,您需要發(fā)送一個(gè)特殊的緩存清除請(qǐng)求來清除緩存。 您可以使用一系列工具發(fā)出清除請(qǐng)求,例如curl命令:
$ curl -X PURGE -D – "http://www.example.com/*"
HTTP/1.1 204 No Content
Server: nginx/1.5.7
Date: Sat, 01 Dec 2015 16:33:04 GMT
Connection: keep-alive
在該示例中,具有公共URL部分(由星號(hào)通配符指定)的資源將被刪除。 但是,這些高速緩存條目將不會(huì)從緩存中完全刪除:它們將保留在磁盤上,直到它們被刪除為非活動(dòng)狀態(tài)(proxy_cache_path的非活動(dòng)參數(shù)),或由緩存清除程序進(jìn)程處理,或客戶端嘗試訪問它們 。
建議您配置允許發(fā)送緩存清除請(qǐng)求的有限數(shù)量的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;
}
在這個(gè)例子中,NGINX檢查請(qǐng)求中是否使用“PURGE”方法,如果是,分析客戶端IP地址。 如果IP地址被列入白名單,那么$purge_method設(shè)置為$purge_allowed:“1”允許清除,“0”表示清除。
要完全刪除與星號(hào)相匹配的緩存文件,您將需要激活一個(gè)特殊的緩存清除程序,該過程將永久地遍歷所有緩存條目,并刪除與通配符相匹配的條目。 在http塊級(jí)別上,將purger參數(shù)添加到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 http://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í),初始緩存填充操作可能需要一些時(shí)間,特別是對(duì)于大文件。 當(dāng)?shù)谝粋€(gè)請(qǐng)求開始下載視頻文件的一部分時(shí),下一個(gè)請(qǐng)求將不得不等待整個(gè)文件被下載并放入高速緩存。
NGINX使緩存這樣的范圍請(qǐng)求成為可能,并逐漸用緩存片模塊填充高速緩存。 該文件分為較小的“切片”。 每個(gè)范圍請(qǐng)求選擇將覆蓋所請(qǐng)求范圍的特定切片,并且如果此范圍仍未緩存,請(qǐng)將其放入緩存中。 對(duì)這些切片的所有其他請(qǐng)求將從緩存中獲取響應(yīng)。
要啟用字節(jié)范圍緩存:
確保您的NGINX是使用slice模塊編譯的。
使用slice指令指定切片的大?。?/p>
location / {
slice 1m;
}
slice的大小應(yīng)適當(dāng)調(diào)整,使切片快速下載。 在處理請(qǐng)求時(shí),太小的大小可能會(huì)導(dǎo)致內(nèi)存使用量過多和大量打開的文件描述符,太大的值可能會(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;
通過在Range頭字段中傳遞$slice_range變量來將傳遞范圍請(qǐng)求設(shè)置為代理服務(wù)器:
proxy_set_header Range $slice_range;
字節(jié)范圍緩存示例:
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)注意,如果切片(slice)緩存打開,則不應(yīng)更改初始文件。
以下示例配置組合了上述某些緩存選項(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 one;
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è)例子中,兩個(gè)位置使用相同的緩存,但是以不同的方式。
由于backend1服務(wù)器的響應(yīng)很少更改,因此不包括緩存控制指令。 首次請(qǐng)求響應(yīng)緩存,并無限期保持有效。
相比之下,對(duì)backend2服務(wù)的請(qǐng)求的響應(yīng)頻繁變化,因此它們被認(rèn)為只有1分鐘有效,并且在相同請(qǐng)求3次之前不被緩存。 此外,如果請(qǐng)求符合proxy_cache_bypass指令定義的條件,則NGINX會(huì)立即將請(qǐng)求傳遞給backend2,而不在緩存中查找。