Nginx 是一個功能強大的 Web 服務器和反向代理服務器,它可以用于實現靜態內容的緩存,緩存可以分為客戶端緩存和服務端緩存。
客戶端緩存
客戶端緩存指的是瀏覽器緩存, 瀏覽器緩存是最快的緩存, 因為它直接從本地獲取(但有可能需要發送一個協商緩存的請求), 它的優勢是可以減少網絡流量, 加快請求速度。
服務端緩存指的是反向代理服務器或CDN的緩存, 他的作用是用于減輕后端實際的Web Server的壓力。
瀏覽器緩存可以分為兩種模式,強緩存和協商緩存。
強緩存(無HTTP請求,無需協商)
直接讀取本地緩存,無需向服務端發送請求確認,HTTP返回狀態碼是200(from memory cache或者from disk cache ,不同瀏覽器返回的信息不一致的)。
相關的HTTP Header有:
Cache-Control
Expires
協商緩存(有HTTP請求,需協商)
瀏覽器雖然發現了本地有該資源的緩存,但是緩存已經過期,于是向服務器詢問緩存內容是否還可以使用,若服務器認為瀏覽器的緩存內容還可用,那么便會返回304(Not Modified)HTTP狀態碼,告訴瀏覽器讀取本地緩存;如果服務器認為瀏覽器的緩存內容已經改變,則返回新的請求的資源。
相關的HTTP Header有:
Last-Modified
ETag
緩存校驗流程
由于網站內容的經常變化,為了保持緩存的內容與網站服務器的內容一致,客戶端會通過內容緩存的有效期(強制緩存)以及Web服務器提供的訪問請求的校驗(協商緩存),快速判斷請求的內容是否已經更新。客戶端緩存校驗流程圖如下:
強制緩存
強制緩存原理: 瀏覽器在加載資源的時候,會先根據本地緩存資源的header中的信息(Expires 和 Cache-Control)來判斷緩存是否過期。如果緩存沒有過期,則會直接使用緩存中的資源;否則,會向服務端發起協商緩存的請求。
客戶端判斷緩存是否過期和先前請求時服務端返回的HTTP消息頭字段有關:
服務端返回字段 | 作用 |
---|---|
Cache-Control: max-age=x | 客戶端緩存時間超出x秒后則緩存過期 |
Cache-Control: no-cache | 客戶端不能直接使用本地緩存的響應,需要進行協商緩存,發送請求到服務器確認是否可以使用緩存。如果Web服務器返回304,則客戶端使用本地緩存,如果返回200,則使用Web服務器返回的新的數據 |
Cache-Control: no-store | 客戶端不能對響應進行緩存 |
Cache-Control: public | 可以被所有的用戶緩存,包括終端用戶和 CDN 等中間代理服務器 |
Cache-Control:private | 只能被終端用戶的瀏覽器緩存,不允許 CDN 等中繼緩存服務器對其緩存 |
expires x | 客戶端緩存時間超出x秒后則緩存過期,優先級比Cache-Control: max-age=x低 |
協商緩存
協商緩存原理: 當客戶端向服務端發起請求時,服務端會檢查請求中是否有對應的標識(If-Modified-Since或Etag),如果沒有對應的標識,服務器端會返回標識給客戶端,客戶端下次再次請求的時候,把該標識帶過去,然后服務器端會驗證該標識,如果驗證通過了,則會響應304,告訴瀏覽器讀取緩存。如果標識沒有通過,則返回請求的資源。
Last-Modified與If-Modified-Since屬于HTTP/1.0,是用于服務端對響應數據修改時間進行校驗的服務端校驗方法。Last-Modified的值是由服務端生成后傳遞給客戶端的,客戶端發送請求時,會將本地內容緩存中的Last-Modified的值由請求消息頭的If-Modified-Since字段傳遞給服務端,如果服務端的被請求的內容的最后修改時間和If-Modified-Since的(默認是exact精確匹配)值不一致,則將返回新的內容,否則返回響應狀態碼304,客戶端將使用本地緩存。
Etag與If-None-Match屬于HTTP/1.1,優先級高于Last-Modified的驗證,是用于服務端對響應數據進行實體標簽校驗的服務端校驗方法。Etag類似于身份指紋,是一個可以與Web資源關聯的記號。當客戶端第一次發起請求時,Etag的值在響應頭中傳遞給客戶端;當客戶端再次發起請求時,如果驗證完本地內容緩存后需要發起服務端驗證,Etag的值將由請求消息頭的If-None-Match字段傳遞給服務端。如果服務端驗證If-None-Match的值與服務端的Etag值不匹配,則認為請求的內容已經更新,服務端將會返回新的內容,否則返回響應狀態碼304,客戶端將使用本地緩存。
下圖可以看到客戶端第一次請求時,客戶端請求中沒有If-Modified-Since和Etag標識,服務端響應了200,并且返回了Etag和Last-Modified消息頭。
當第二次客戶端請求時,帶上了If-Modified-Since和If-None-Match消息頭,并且服務端經過校驗后返回了304讓客戶端使用本地緩存。
用戶行為對瀏覽器緩存的影響
當按下F5或者刷新時,客戶端瀏覽器會添加請求消息頭字段Cache-Control: max-age=0,該請求不進行內容緩存的本地驗證,會直接向Web服務器發起請求,服務端根據If-Modified-Since或者If-None-Match的值進行驗證。
當按下Ctrl+F5或者強制刷新時,客戶端瀏覽器會添加請求消息頭字段Cache-Control: no-cache,并且忽略所有服務端驗證的消息頭字段(Etag和Last-Modified),該請求不進行內容緩存的本地驗證,它會直接向Web服務器發起請求,因為請求中沒有攜帶服務端驗證的消息頭字段,服務端會直接返回新的內容。
Cache-Control字段在請求和響應中的含義
客戶端請求
max-age:不想要在代理服務器中緩存了太長時間(>max-age seconds)的資源。
max-stale:可以接收代理服務器上的過期緩存。若max-stable后沒有值,則表示無論過期多久客戶端都可以使用。
min-fresh:要求服務器使用其緩存時,至少保證在min-fresh秒內不會過期。
no-cache:告訴代理服務器,不能直接使用已有緩存作為響應返回,除非帶著緩存條件到上游服務端得到 304 驗證返回碼才可使用現有緩存。
no-store:告訴各代理服務器不得緩存這個請求及其相應。
no-transform: 告訴代理服務器不要修改消息包體的內容。
only-if-cached:告訴代理服務器僅能返回緩存,沒有緩存的話就返回 504。
服務端響應
max-age:告訴客戶端緩存 Age 超出 max-age 秒后則緩存過期。
s-maxage:與max-age相似,但僅針對共享緩存,且優先級高于max-age和Expires。
public:可以被所有的用戶緩存,包括終端用戶和 CDN 等中間代理服務器。
private: 只能被終端用戶的瀏覽器緩存,不允許 CDN 等中繼緩存服務器對其緩存。
no-store:告訴所有下游節點不能對響應進行緩存。
no-cache: 告訴客戶端不能直接使用緩存的響應,使用前必須在源服務器驗證得到304返回碼。
no-transform:告訴代理服務器不能修改消息包體的內容。
must-revalidate:告訴客戶端一旦緩存過期,必須向服務器驗證后才可使用。
proxy-revalidate:與 must-revalidate 類似,但它僅對代理服務器的共享緩存有效。
服務端緩存
proxy cache屬于服務端緩存,主要實現 nginx 服務器對客戶端數據請求的快速響應。 nginx 服務器在接收到被代理服務器的響應數據之后,一方面將數據傳遞給客戶端,另一方面根據proxy cache的配置將這些數據緩存到本地硬盤上。 當客戶端再次訪問相同的數據時,nginx服務器直接從硬盤檢索到相應的數據返回給用戶,從而減少與被代理服務器交互的時間。
開啟nginx緩存
反向代理nginx配置
首先需要指定proxy_cache_path,可以指定多條:
proxy_cache_path /tmp/nginx/cache levels=1:2 inactive=60s keys_zone=mycache:10m max_size=10g;
/tmp/nginx/cache:緩存文件存放的路徑。
levels : 默認所有緩存文件都放在同一個目錄下時,會影響緩存的性能,大部分場景推薦使用2級目錄來存儲緩存文件,1和2表示用1位和2位16進制來命名目錄名稱。第一級目錄用1位16進制命名,如b;第二級目錄用2位16進制命名,如2b。所以一級目錄有16個,二級目錄有1616=256個,總目錄數為16\256=4096個。
key_zone : 在共享內存中設置一塊存儲區域來存放緩存的key字符串,這樣nginx可以快速判斷一個request是否命中或者未命中緩存,1m可以存儲8000個key,10m可以存儲80000個key;
max_size(可選) : 最大cache空間,如果不指定,會使用掉所有磁盤空間。當達到配額后,會刪除最少使用的cache文件。
inactive(可選) : 未被訪問文件在緩存中保留時間,本配置中如果60秒未被訪問則不論狀態是否為expired,緩存控制程序會刪掉文件,默認為10分鐘。
然后在http,server或者location上下文中通過proxy_cache引用前面定義的proxy_cache_path:
user nginx;
events {
}http {proxy_cache_path /tmp/nginx/cache levels=1:2 inactive=60s keys_zone=mycache:10m max_size=10g;server {listen 80;location /cache {proxy_pass http://192.168.1.135:8080;#proxy_cache_valid 200 302 80s; #代理服務器本身設置對200 302響應緩存80sproxy_cache mycache; #引用前面定義的proxy_cache_pathadd_header cache $upstream_cache_status; #這個不是必須的,只是方便我們測試的時候查看是否命中緩存}}
}
被代理服務器配置
被代理服務器上需要通知代理服務器緩存內容的時間,否則代理服務器不會對內容進行緩存,通過X-Accel-Expires,expires,Cache-Control "max-age="其中一個參數指定時間。如果代理服務器上配置了proxy_cache_valid的時間,那么被代理服務器可以不指定緩存內容的時間。
events {
}
http {server {listen 8080;location /cache {add_header X-Accel-Expires 100; #通知代理服務器緩存100s#expires 50; #通知代理服務器緩存50s#add_header Cache-Control "max-age=50"; #通知代理服務器緩存50salias /www/html/docs/ ;}}
}
驗證緩存
客戶端連續兩次去訪問代理服務器,可以看到第一次請求未命中緩存,第二次請求命中緩存。
? curl http://192.168.1.134/cache/ -I
HTTP/1.1 200 OK
Server: nginx/1.14.2
Date: Sat, 09 Jan 2021 16:09:38 GMT
Content-Type: text/html
Content-Length: 26065
Connection: keep-alive
Last-Modified: Wed, 21 Oct 2020 14:17:08 GMT
ETag: "5f9042e4-65d1"
Expires: Sat, 09 Jan 2021 16:10:27 GMT
Cache-Control: max-age=50
cache: MISS #第一次請求未命中緩存
Accept-Ranges: bytes? curl http://192.168.1.134/cache/ -I
HTTP/1.1 200 OK
Server: nginx/1.14.2
Date: Sat, 09 Jan 2021 16:09:39 GMT
Content-Type: text/html
Content-Length: 26065
Connection: keep-alive
Last-Modified: Wed, 21 Oct 2020 14:17:08 GMT
ETag: "5f9042e4-65d1"
Expires: Sat, 09 Jan 2021 16:10:27 GMT
Cache-Control: max-age=50
cache: HIT #第二次請求命中緩存
Accept-Ranges: bytes
并且在代理服務器上我們之前指定的緩存文件路徑下可以看到該文件。
[root@nginx-plus1 e2]# pwd
/tmp/nginx/cache/9/e2
[root@nginx-plus1 e2]# ls
b5ba0009996f20ce25cbca96ac976e29
緩存配置綜合例子
user nginx;
events{worker_connections 1024;
}
http {#設置緩存路徑和相關參數(必選)proxy_cache_path /tmp/nginx/cache levels=1:2 keys_zone=mycache:10m max_size=10g;server {listen 80;location /cache {proxy_pass http://192.168.1.135:8080;#引用緩存配置(必選)proxy_cache mycache;#對響應狀態碼為200 302的響應緩存100sproxy_cache_valid 200 302 100s;#對響應狀態碼為404的響應緩存200proxy_cache_valid 404 200s;#請求參數帶有nocache或者comment時不使用緩存proxy_cache_bypass $arg_nocache $arg_comment;#忽略被代理服務器設置的"Cache-Control"頭信息proxy_ignore_headers "Cache-Control"; #對GET HEAD POST方法進行緩存 proxy_cache_methods GET HEAD POST;#當緩存過期時,當構造上游請求時,添加If-Modified-Since和If-None-Match頭部,值為過期緩存中的Last-Modified值和Etag值。proxy_cache_revalidate on;#當被代理服務器返回403時,nginx可以使用歷史緩存來響應客戶端,該功能在一定程度上能能夠為客戶端提供不間斷訪問proxy_cache_use_stale http_403;#默認開啟,開啟代理緩沖區(內存)proxy_buffering on;#設置響應頭的緩沖區設為8kproxy_buffer_size 8k;#設置網頁內容緩沖區個數為8,單個大小為8kproxy_buffers 8 8k;#設置當nginx還在讀取被代理服務器的數據響應的同時間一次性向客戶端響應的數據的最大為16kproxy_busy_buffers_size 16k;#臨時文件最大為1024mproxy_max_temp_file_size 1024m;#設置一次往臨時文件的大小最大為16kproxy_temp_file_write_size 16k;#設置臨時文件存放目錄proxy_temp_path /tmp/proxy_temp;#設置和被代理服務器連接的超時時間為60sproxy_connect_timeout 60;#設置向被代理服務器發送請求的超時時間為60sproxy_send_timeout 60;#設置從被代理服務器讀取響應的超時時間為60sproxy_read_timeout 60;#添加緩存狀態參數,方便測試是否命中緩存add_header cache $upstream_cache_status;}}
}
緩存狀態
$upstream_cache_status中包含以下幾個狀態:
MISS:未命中緩存,請求被傳送到后端服務器。
HIT: 命中緩存,使用緩存響應客戶端。
EXPIRED: 緩存已經過期,請求被傳送到后端。
UPDATING: 正在更新緩存,將使用舊緩存的應答客戶端。
STALE: 客戶端將得到過期的應答。
BYPASS: 緩存被繞過了,請求被傳送到后端服務器。
REVALIDATED: nginx通過過期緩存中的Etag和Last-Modified字段的值向被代理服務器發起驗證請求。
緩存多久
參數(優先級從高到低) | 位置 |
---|---|
inactive | 代理服務器 |
X-Accel-Expires | 被代理服務器 |
Cache-Control | 被代理服務器 |
expires | 被代理服務器 |
proxy_cache_valid | 代理服務器 |
通過nginx變量限制是否使用緩存
proxy_cache_bypass
該參數設定,什么情況下的請求不讀取cache而是直接從后端的服務器上獲取資源。這里的string通常為nginx的的一些內置變量或者自己定義的變量。
Syntax: proxy_cache_bypass string ...;
Default: —
Context: http, server, location
例如:
proxy_cache_bypass $arg_nocache $arg_comment;
當客戶端訪問請求中帶有nocache或者comment參數時,不使用緩存數據。
? curl http://192.168.1.134/cache/?nocache=1 -I
HTTP/1.1 200 OK
Server: nginx/1.14.2
Date: Sun, 10 Jan 2021 05:38:25 GMT
Content-Type: text/html
Content-Length: 26065
Connection: keep-alive
Last-Modified: Wed, 21 Oct 2020 14:17:08 GMT
ETag: "5f9042e4-65d1"
Cache-Control: max-age=10
cache: BYPASS
Accept-Ranges: bytes
? curl http://192.168.1.134/cache/?comment=3 -I
HTTP/1.1 200 OK
Server: nginx/1.14.2
Date: Sun, 10 Jan 2021 05:38:29 GMT
Content-Type: text/html
Content-Length: 26065
Connection: keep-alive
Last-Modified: Wed, 21 Oct 2020 14:17:08 GMT
ETag: "5f9042e4-65d1"
Cache-Control: max-age=10
cache: BYPASS
Accept-Ranges: bytes
proxy_no_cache
該參數和proxy_cache_bypass類似,用來設定什么情況下不緩存。
Syntax: proxy_no_cache string ...;
Default: —
Context: http, server, location
例如:
proxy_no_cache $cookie_nocache $arg_nocache $arg_comment;
定義緩存與請求間匹配的關鍵字
proxy_cache_key
設置nginx服務器在共享內存中為緩存數據建立索引時使用的關鍵字。
Syntax: proxy_cache_key string;
Default: proxy_cache_key $scheme$proxy_host$request_uri;
Context: http, server, location
例如:
proxy_cache_key $scheme$proxy_host$uri$is_args$args;
影響緩存的HTTP method
proxy_cache_methods
設置可以緩存的HTTP請求方法。
Syntax: proxy_cache_methods GET | HEAD | POST ...;
Default: proxy_cache_methods GET HEAD;
Context: http, server, location
This directive appeared in version 0.7.59.
proxy_cache_convert_head
當客戶端一次使用HEAD方法請求時,nginx會通過GET方法向上游請求完整的header和body,只返回header給客戶端。 當客戶端下次使用GET方法請求時,nginx會把緩存好的body返回給客戶端,就不用去請求上游了。
Syntax: proxy_cache_convert_head on | off;
Default: proxy_cache_convert_head on;
Context: http, server, location
This directive appeared in version 1.9.7.
影響緩存的HTTP header
proxy_ignore_headers
當被代理服務器的響應存在以下頭部時,nginx不會緩存:
Set-Cookie
Cache-Control中存在以下項之一:
private
no-cache
no-store
可以設置忽略被代理服務器的響應頭。
Syntax: proxy_ignore_headers field ...;
Default: —
Context: http, server, location
例如:
proxy_ignore_headers Set-Cookie Cache-Control;
影響緩存的HTTP 響應
proxy_cache_valid
通過該參數,可以配置相應的http code類型的請求,生成的緩存的過期時間,可以配置多條。
Syntax: proxy_cache_valid [code ...] time;
Default: —
Context: http, server, location
例如:
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
緩存請求次數
proxy_cache_min_uses
當客戶端請求發送的次數達到設置次數后才會緩存該請求的響應數據,如果不想緩存低頻請求可以設置此項。
Syntax: proxy_cache_min_uses number;
Default: proxy_cache_min_uses 1;
Context: http, server, location
緩存大小
proxy_buffering
默認是開啟狀態,當關閉時,nginx將不會對任何響應做緩存。
Syntax: proxy_buffering on | off;
Default: proxy_buffering on;
Context: http, server, location
proxy_buffers
在內存中設置緩沖區存儲被代理服務器響應的body所占用的buffer個數和每個buffer大小,默認情況下buffer size等于一個memory page,32為操作系統為4k,64位為8k。當buffer大小(內存)無法容納被代理服務器響應數據時,會將響應數據存放在proxy_temp_path中定義的臨時目錄(硬盤)中。
Syntax: proxy_buffers number size;
Default: proxy_buffers 8 4k|8k;
Context: http, server, location
proxy_buffer_size
proxy_buffer_size 用來接受被代理服務器響應頭,如果響應頭超過了這個長度,nginx會報upstream sent too big header錯誤,然后client收到的是502。
Syntax: proxy_buffer_size size;
Default: proxy_buffer_size 4k|8k;
Context: http, server, location
proxy_busy_buffers_size
nginx將會盡可能的讀取被代理服務器的數據到buffer,直到proxy_buffers設置的所有buffer被寫滿或者數據被讀取完,此時nginx開始向客戶端傳輸數據。如果數據很大的話,nginx會接收并把他們寫入到temp_file里去,大小由proxy_max_temp_file_size 控制。當數據沒有完全讀完的時候,nginx同時向客戶端傳送的buffer大小不能超過 proxy_busy_buffers_size。
Syntax: proxy_busy_buffers_size size;
Default: proxy_busy_buffers_size 8k|16k;
Context: http, server, location
proxy_temp_path
定義proxy的臨時文件存在目錄以及目錄的層級。
Syntax: proxy_temp_path path [level1 [level2 [level3]]];
Default: proxy_temp_path proxy_temp;
Context: http, server, location
例如:
proxy_temp_path /spool/nginx/proxy_temp 1 2;
那么臨時文件將會類似:
/spool/nginx/proxy_temp/7/45/00000123457
proxy_temp_file_write_size
設置一次寫入臨時文件的數據的最大的大小。
Syntax: proxy_temp_file_write_size size;
Default: proxy_temp_file_write_size 8k|16k;
Context: http, server, location
proxy_max_temp_file_size
設置臨時文件的最大的大小。
Syntax: proxy_max_temp_file_size size;
Default: proxy_max_temp_file_size 1024m;
Context: http, server, location
超時時間
proxy_connect_timeout
設置和被代理服務器建立連接超時時間。
Syntax: proxy_connect_timeout time;
Default: proxy_connect_timeout 60s;
Context: http, server, location
proxy_read_timeout
設置從被代理服務器讀取響應的時間。
Syntax: proxy_read_timeout time;
Default: proxy_read_timeout 60s;
Context: http, server, location
proxy_send_timeout
設置發送請求給被代理服務器的超時時間。
Syntax: proxy_send_timeout time;
Default: proxy_send_timeout 60s;
Context: http, server, location
并發回源請求
proxy_cache_lock
針對同一個key,僅允許一個請求回源去更新緩存,用于鎖住并發回源請求。
Syntax: proxy_cache_lock on | off;
Default: proxy_cache_lock off;
Context: http, server, location
This directive appeared in version 1.1.12.
proxy_cache_lock_timeout
鎖住請求的最長等待時間,超時后直接回源,但不會以此響應更新緩存。
Syntax: proxy_cache_lock_timeout time;
Default: proxy_cache_lock_timeout 5s;
Context: http, server, location
This directive appeared in version 1.1.12.
proxy_cache_lock_age
更新緩存的回源請求最大超時時間,超時后放行其他請求更新緩存。
Syntax: proxy_cache_lock_age time;
Default: proxy_cache_lock_age 5s;
Context: http, server, location
This directive appeared in version 1.7.8.
歷史緩存
proxy_cache_use_stale
如果nginx在訪問被代理服務器過程中出現被代理服務器無法訪問或者訪問出錯等現象時,nginx服務器可以使用歷史緩存響應客戶端的請求,這些數據不一定和被代理服務器上最新的數據相一致,但對于更新頻率不高的后端服務器來說,nginx服務器的該功能在一定程度上能夠為客戶端提供不間斷訪問。該指令用來設置一些狀態,當被代理服務器處于這些狀態時,nginx服務器啟用該功能。
Syntax: proxy_cache_use_stale error | timeout | invalid_header | updating | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | http_429 | off ...;
Default: proxy_cache_use_stale off;
Context: http, server, location
例如: 配置當被代理服務器返回404 HTTP響應碼時,nginx可以使用歷史緩存來響應客戶端。
proxy_cache_use_stale http_404;
客戶端訪問測試:
? curl http://192.168.1.134/cache/index.html -I
HTTP/1.1 200 OK
Server: nginx/1.14.2
Date: Mon, 11 Jan 2021 06:00:58 GMT
Content-Type: text/html
Content-Length: 26065
Connection: keep-alive
Last-Modified: Wed, 21 Oct 2020 14:17:08 GMT
ETag: "5f9042e4-65d1"
Expires: Mon, 11 Jan 2021 06:01:07 GMT
Cache-Control: max-age=10
cache: MISS #第一次請求沒有緩存
Accept-Ranges: bytes
? curl http://192.168.1.134/cache/index.html -I
HTTP/1.1 200 OK
Server: nginx/1.14.2
Date: Mon, 11 Jan 2021 06:01:01 GMT
Content-Type: text/html
Content-Length: 26065
Connection: keep-alive
Last-Modified: Wed, 21 Oct 2020 14:17:08 GMT
ETag: "5f9042e4-65d1"
Expires: Mon, 11 Jan 2021 06:01:07 GMT
Cache-Control: max-age=10
cache: HIT #第二次請求nginx使用緩存響應
Accept-Ranges: bytes
? curl http://192.168.1.134/cache/index.html -I
HTTP/1.1 200 OK
Server: nginx/1.14.2
Date: Mon, 11 Jan 2021 06:01:29 GMT
Content-Type: text/html
Content-Length: 26065
Connection: keep-alive
Last-Modified: Wed, 21 Oct 2020 14:17:08 GMT
ETag: "5f9042e4-65d1"
Expires: Mon, 11 Jan 2021 06:01:07 GMT
Cache-Control: max-age=10
cache: STALE #第三次請求之前先將被代理服務器上的index.html文件刪除,nginx使用歷史緩存響應
Accept-Ranges: bytes
過期緩存
proxy_cache_revalidate
當緩存過期時,當nginx構造上游請求時,添加If-Modified-Since和If-None-Match頭部,值為過期緩存中的Last-Modified值和Etag值。
Syntax: proxy_cache_revalidate on | off;
Default:proxy_cache_revalidate off;
Context: http, server, location
This directive appeared in version 1.5.7.
當接收到被代理服務器的304響應時,且打開了proxy_cache_revalidate功能,則用緩存來響應客戶端,并且更新緩存狀態。
? curl http://192.168.1.134/cache/ -I
HTTP/1.1 200 OK
Server: nginx/1.14.2
Date: Sun, 10 Jan 2021 08:11:37 GMT
Content-Type: text/html
Content-Length: 26065
Connection: keep-alive
Last-Modified: Wed, 21 Oct 2020 14:17:08 GMT
ETag: "5f9042e4-65d1"
Expires: Sun, 10 Jan 2021 08:11:36 GMT
Cache-Control: max-age=10
cache: REVALIDATED #表示nginx通過過期緩存中的Etag和Last-Modified字段的值向被代理服務器發起驗證請求,并且被代理服務器返回了304
Accept-Ranges: bytes
? curl http://192.168.1.134/cache/ -I
HTTP/1.1 200 OK
Server: nginx/1.14.2
Date: Sun, 10 Jan 2021 08:11:38 GMT
Content-Type: text/html
Content-Length: 26065
Connection: keep-alive
Last-Modified: Wed, 21 Oct 2020 14:17:08 GMT
ETag: "5f9042e4-65d1"
Expires: Sun, 10 Jan 2021 08:11:36 GMT
Cache-Control: max-age=10
cache: HIT
Accept-Ranges: bytes
原文鏈接:
https://www.nginx.org.cn/article/detail/409
https://www.nginx.org.cn/article/detail/410