nginx使用詳解--緩存

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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/711240.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/711240.shtml
英文地址,請注明出處:http://en.pswp.cn/news/711240.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【XR806開發板試用】全網首發,對接騰訊云平臺的血淚史

1.前面的話 在上次連夜肝出了華為云平臺的帖子:https://aijishu.com/a/1060000000287434 之后,論壇里的反響平平,好評沒有,點贊更無,抱著已完成任務成功白嫖一塊板子的心態,把板子收在了盒子里,第二天,助手小姐姐跟我說為何不把騰訊云的做了,對于這個要求我其實是拒絕的,但是小…

鴻蒙開發之組件間方法傳遞(方法回調)

目前使用的方式有兩種,一種是父子組件方法傳遞,一種是系統提供的emitter。 一、父子組件方法傳遞 1.1 使用場景 當我們父組件中有一個方法,需要子組件在修改完數據后回調父組件的方法時候。有點抽象:這樣解釋一下,父…

深度學習-Pytorch運算的基本數據類型

深度學習-Pytorch模型運算的基本數據類型 用pytorch構建模型,并訓練模型,得到一個優化的模型,那么模型構造的數據類型怎樣的? 數據分析 數據分析-Pandas如何轉換產生新列 數據分析-Pandas如何統計數據概況 數據分析-Pandas如…

Three.js-04軌道控制器

1.導入 說明:相機圍繞目標進行軌道運動。也就是可以通過鼠標拖拽進行移動視角。 import { OrbitControls } from three/addons/controls/OrbitControls.js; 2.使用 說明:構造controls對象,再調用update方法;為了使效果更為明顯…

十二、Qt自定義Widget組件、靜態庫與動態庫

一、自定義Widget組件 1、自定義Widget組件 使用步驟采用提升法(promotion)重新定義paintEvent事件 2、實現程序 (1)創建項目,基于QWidget (2)添加類,為Widget組件提升類 #inclu…

Spring Boot 集成 Quartz 實現定時任務

Spring Boot 集成 Quartz 實現定時任務 在Spring Boot應用中,我們經常需要執行一些定時任務,如每天發送報表、定時更新數據庫等。雖然Spring Framework自帶了一個簡單的定時任務功能(Scheduled),但在一些復雜場景下&a…

Vue3 在SCSS中使用v-bind

template 先創建一個通用的頁面結構 <template><div class"v-bubble-bg"></div> </template>js 在JS中先對需要用的數據進行定義&#xff1a; 可以是參數&#xff0c;也可以是data <script setup>const props defineProps({bgCol…

cURL 命令中有$的問題

最近學會使用cURL來快速訪問網絡資源&#xff0c;確實很好用&#xff0c;但在使用過程中遇到一個奇怪的問題&#xff0c;多方查詢也沒有找到現成答案&#xff0c;最后經摸索終于解決&#xff0c;特記錄如下。 我們一般訪問網站使用Chrome瀏覽器獲取的cURL命令大概是這個樣子&am…

gpt批量原創文章生成器,不限制內容的生成器

在當今的數字化時代&#xff0c;內容創作是網站持續發展的重要組成部分。然而&#xff0c;對于擁有大量內容需求的網站來說&#xff0c;手動創作文章可能會耗費大量時間和精力。為了解決這一問題&#xff0c;許多GPT&#xff08;生成式預訓練模型&#xff09;文章生成軟件應運而…

【重溫設計模式】外觀模式及其Java示例

設計模式及外觀模式介紹 在編程世界中&#xff0c;設計模式就如同自然界的法則&#xff0c;是一種反復出現在各種情況下的通用解決方案。設計模式可以分為創建型、結構型和行為型三大類&#xff0c;每一類都有其獨特的應用場景和解決問題的方式。今天&#xff0c;我們要重點解…

【HbuilderX】 uniapp實現 android申請權限 和 退出app返回桌面

目錄 android申請權限&#xff1a; 監聽用戶是否開啟權限或關閉權限&#xff1a; 退出app返回桌面&#xff1a; android申請權限&#xff1a; 首先在 manifest.json 內添加你所需要用到權限 添加權限插件 permission.js 一次就好1/權限插件 - Gitee.comhttps://gitee.co…

數據庫分庫分表中間件選擇

目前分庫分表的中間件有三種設計思路&#xff0c;分別是&#xff1a; 采用分散式架構&#xff0c;適用于用Java開發的高性能輕量級OLTP應用程序&#xff0c;以Sharding-JDBC為代表。采用中間層Proxy架構&#xff0c;提供了靜態輸入和所有語言支持&#xff0c;適用于OLAP應用程…

MATLAB環境下基于小波和濾波器組的音頻信號處理

音頻分類研究的重點&#xff0c;一方面在于音頻特征的提取和選擇&#xff0c;通常來說數據集和特征集在分類系統中有著極為重要的作用&#xff0c;離開了對數據集的處理、對特征集中特征的提取和選擇&#xff0c;分類結果必將產生巨大誤差。對于提高音頻分類系統的分類準確度和…

vulnhub-----Hackademic靶機

文章目錄 1.C段掃描2.端口掃描3.服務掃描4.web分析5.sql注入6.目錄掃描7.寫馬php反彈shell木馬 8.反彈shell9.內核提權 1.C段掃描 kali:192.168.9.27 靶機&#xff1a;192.168.9.25 ┌──(root?kali)-[~] └─# arp-scan -l Interface: eth0,…

Docker容器(3)單容器管理

一、單容器 1.1概念簡介 Docker三個重要概念: 倉庫(Repository); 鏡像(Image); 容器(Container). *Docker的三個重要概念是倉庫(Repository)、鏡像(Image)和容器(Container)**。具體如下&#xff1a; **鏡像(Image)**&#xff1a;Docker鏡像是創建容器的基礎&#xff0c;它類似…

『NLP學習筆記』圖解Word2vec(The Illustrated Word2vec)

圖解Word2vec(The Illustrated Word2vec) 文章目錄 一. 詞嵌入(word embedding)1.1. 個性嵌入:你是什么樣的人?1.2. 詞嵌入1.3. 類比1.4. 語言模型1.5. 語言模型訓練1.6. 顧及兩頭(上下文)1.7. Skip-gram模型1.8. 重新審視訓練過程1.9. 負例采樣1.10. 基于負例采樣的Skip…

Maven面試題

以下是一些關于Maven的經典面試題以及它們的答案&#xff1a; 1、什么是Maven&#xff1f; Maven是一個項目管理工具&#xff0c;用于構建、管理、發布Java項目。 2、為什么要使用Maven而不是手動管理項目依賴&#xff1f; Maven提供了依賴管理、統一的構建、打包、文檔生…

Linux DKMS

DKMS&#xff08;Dynamic Kernel Module Support&#xff09;是一個框架&#xff0c;用于構建和安裝內核模塊。它允許第三方內核模塊在系統內核升級時自動重新構建和安裝&#xff0c;從而確保這些模塊與新內核版本兼容。 DKMS的工作原理是將內核模塊的源代碼和安裝腳本存儲在一…

Google索引腳本:快速索引你的網站

公眾號&#xff1a;【可樂前端】&#xff0c;每天3分鐘學習一個優秀的開源項目&#xff0c;分享web面試與實戰知識。 每天3分鐘開源 hi&#xff0c;這里是每天3分鐘開源&#xff0c;很高興又跟大家見面了&#xff0c;今天介紹的開源項目簡介如下&#xff1a; 倉庫名&#xff1…

園區停車管理系統的設計與實現

** &#x1f345;點贊收藏關注 → 私信領取本源代碼、數據庫&#x1f345; 本人在Java畢業設計領域有多年的經驗&#xff0c;陸續會更新更多優質的Java實戰項目希望你能有所收獲&#xff0c;少走一些彎路。&#x1f345;關注我不迷路&#x1f345;** 一 、設計說明 1.1 選題…