一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Nginx緩存配置詳解

馬哥Linux運(yùn)維 ? 來源:CSDN技術(shù)社區(qū) ? 2025-05-07 14:03 ? 次閱讀

nginx使用詳解--緩存

Nginx 是一個(gè)功能強(qiáng)大的 Web 服務(wù)器和反向代理服務(wù)器,它可以用于實(shí)現(xiàn)靜態(tài)內(nèi)容的緩存,緩存可以分為客戶端緩存和服務(wù)端緩存。

客戶端緩存

客戶端緩存指的是瀏覽器緩存, 瀏覽器緩存是最快的緩存, 因?yàn)樗苯訌谋镜孬@取(但有可能需要發(fā)送一個(gè)協(xié)商緩存的請(qǐng)求), 它的優(yōu)勢(shì)是可以減少網(wǎng)絡(luò)流量, 加快請(qǐng)求速度。

服務(wù)端緩存指的是反向代理服務(wù)器或CDN的緩存, 他的作用是用于減輕后端實(shí)際的Web Server的壓力。

瀏覽器緩存可以分為兩種模式,強(qiáng)緩存和協(xié)商緩存。

強(qiáng)緩存(無HTTP請(qǐng)求,無需協(xié)商)

直接讀取本地緩存,無需向服務(wù)端發(fā)送請(qǐng)求確認(rèn),HTTP返回狀態(tài)碼是200(from memory cache或者from disk cache ,不同瀏覽器返回的信息不一致的)。

相關(guān)的HTTP Header有:

Cache-Control
Expires

協(xié)商緩存(有HTTP請(qǐng)求,需協(xié)商)

瀏覽器雖然發(fā)現(xiàn)了本地有該資源的緩存,但是緩存已經(jīng)過期,于是向服務(wù)器詢問緩存內(nèi)容是否還可以使用,若服務(wù)器認(rèn)為瀏覽器的緩存內(nèi)容還可用,那么便會(huì)返回304(Not Modified)HTTP狀態(tài)碼,告訴瀏覽器讀取本地緩存;如果服務(wù)器認(rèn)為瀏覽器的緩存內(nèi)容已經(jīng)改變,則返回新的請(qǐng)求的資源。

實(shí)現(xiàn)客戶端緩存通常需要通過 HTTP 頭信息來控制瀏覽器對(duì)資源的緩存行為。以下是幾種常見的實(shí)現(xiàn)方式:

1. Cache-Control 頭:
使用 Cache-Control 頭來控制客戶端緩存的行為。通過設(shè)置 max-age 指令來指定資源的有效期,以秒為單位。例如:

Cache-Control: max-age=3600

上述示例指定資源在客戶端緩存中的有效期為 3600 秒(1 小時(shí))。

2. Expires 頭:
使用 Expires 頭來指定資源的過期時(shí)間。該頭信息的值為一個(gè) HTTP 格式的日期時(shí)間,表示資源的過期時(shí)間。例如:

Expires: Tue, 01 Jan 2025 0000 GMT

上述示例指定資源的過期時(shí)間為 2025 年 1 月 1 日。

3. Last-Modified 頭和 If-Modified-Since 頭:
服務(wù)器可以在響應(yīng)中添加 Last-Modified 頭,表示資源的最后修改時(shí)間??蛻舳嗽诤罄m(xù)的請(qǐng)求中可以通過 If-Modified-Since 頭將上次請(qǐng)求的響應(yīng)的 Last-Modified 時(shí)間發(fā)送給服務(wù)器。如果資源在這個(gè)時(shí)間之后沒有修改過,服務(wù)器可以返回 304 Not Modified 響應(yīng),告訴客戶端可以繼續(xù)使用緩存的資源。例如:

Last-Modified: Mon, 01 Jan 2022 0000 GMT

客戶端請(qǐng)求中:

If-Modified-Since: Mon, 01 Jan 2022 0000 GMT

服務(wù)器在檢查資源的修改時(shí)間后,如果資源沒有修改,則返回 304 Not Modified。

4. ETag 頭和 If-None-Match 頭:
類似于 Last-Modified 和 If-Modified-Since,服務(wù)器可以在響應(yīng)中添加 ETag 頭,表示資源的唯一標(biāo)識(shí)符??蛻舳嗽诤罄m(xù)的請(qǐng)求中可以通過 If-None-Match 頭將上次請(qǐng)求的響應(yīng)的 ETag 發(fā)送給服務(wù)器。如果資源的 ETag 沒有改變,服務(wù)器可以返回 304 Not Modified 響應(yīng)。例如:

ETag: "abc123"

客戶端請(qǐng)求中:

If-None-Match: "abc123"

服務(wù)器在檢查資源的 ETag 后,如果資源沒有修改,則返回 304 Not Modified。

緩存校驗(yàn)流程
由于網(wǎng)站內(nèi)容的經(jīng)常變化,為了保持緩存的內(nèi)容與網(wǎng)站服務(wù)器的內(nèi)容一致,客戶端會(huì)通過內(nèi)容緩存的有效期(強(qiáng)制緩存)以及Web服務(wù)器提供的訪問請(qǐng)求的校驗(yàn)(協(xié)商緩存),快速判斷請(qǐng)求的內(nèi)容是否已經(jīng)更新??蛻舳司彺嫘r?yàn)流程圖如下:

6f13780e-24e0-11f0-9310-92fbcf53809c.png在這里插入圖片描述

強(qiáng)制緩存
強(qiáng)制緩存原理: 瀏覽器在加載資源的時(shí)候,會(huì)先根據(jù)本地緩存資源的header中的信息(Expires 和 Cache-Control)來判斷緩存是否過期。如果緩存沒有過期,則會(huì)直接使用緩存中的資源;否則,會(huì)向服務(wù)端發(fā)起協(xié)商緩存的請(qǐng)求。

客戶端判斷緩存是否過期和先前請(qǐng)求時(shí)服務(wù)端返回的HTTP消息頭字段有關(guān):

服務(wù)端返回字段 作用
Cache-Control: max-age=x 客戶端緩存時(shí)間超出x秒后則緩存過期
Cache-Control: no-cache 客戶端不能直接使用本地緩存的響應(yīng),需要進(jìn)行協(xié)商緩存,發(fā)送請(qǐng)求到服務(wù)器確認(rèn)是否可以使用緩存。如果Web服務(wù)器返回304,則客戶端使用本地緩存,如果返回200,則使用Web服務(wù)器返回的新的數(shù)據(jù)
Cache-Control: no-store 客戶端不能對(duì)響應(yīng)進(jìn)行緩存
Cache-Control: public 可以被所有的用戶緩存,包括終端用戶和 CDN 等中間代理服務(wù)器
Cache-Control:private 只能被終端用戶的瀏覽器緩存,不允許 CDN 等中繼緩存服務(wù)器對(duì)其緩存
expires x 客戶端緩存時(shí)間超出x秒后則緩存過期,優(yōu)先級(jí)比Cache-Control: max-age=x低

協(xié)商緩存
協(xié)商緩存原理: 當(dāng)客戶端向服務(wù)端發(fā)起請(qǐng)求時(shí),服務(wù)端會(huì)檢查請(qǐng)求中是否有對(duì)應(yīng)的標(biāo)識(shí)(If-Modified-Since或Etag),如果沒有對(duì)應(yīng)的標(biāo)識(shí),服務(wù)器端會(huì)返回標(biāo)識(shí)給客戶端,客戶端下次再次請(qǐng)求的時(shí)候,把該標(biāo)識(shí)帶過去,然后服務(wù)器端會(huì)驗(yàn)證該標(biāo)識(shí),如果驗(yàn)證通過了,則會(huì)響應(yīng)304,告訴瀏覽器讀取緩存。如果標(biāo)識(shí)沒有通過,則返回請(qǐng)求的資源。

Last-Modified與If-Modified-Since屬于HTTP/1.0,是用于服務(wù)端對(duì)響應(yīng)數(shù)據(jù)修改時(shí)間進(jìn)行校驗(yàn)的服務(wù)端校驗(yàn)方法。Last-Modified的值是由服務(wù)端生成后傳遞給客戶端的,客戶端發(fā)送請(qǐng)求時(shí),會(huì)將本地內(nèi)容緩存中的Last-Modified的值由請(qǐng)求消息頭的If-Modified-Since字段傳遞給服務(wù)端,如果服務(wù)端的被請(qǐng)求的內(nèi)容的最后修改時(shí)間和If-Modified-Since的(默認(rèn)是exact精確匹配)值不一致,則將返回新的內(nèi)容,否則返回響應(yīng)狀態(tài)碼304,客戶端將使用本地緩存。

Etag與If-None-Match屬于HTTP/1.1,優(yōu)先級(jí)高于Last-Modified的驗(yàn)證,是用于服務(wù)端對(duì)響應(yīng)數(shù)據(jù)進(jìn)行實(shí)體標(biāo)簽校驗(yàn)的服務(wù)端校驗(yàn)方法。Etag類似于身份指紋,是一個(gè)可以與Web資源關(guān)聯(lián)的記號(hào)。當(dāng)客戶端第一次發(fā)起請(qǐng)求時(shí),Etag的值在響應(yīng)頭中傳遞給客戶端;當(dāng)客戶端再次發(fā)起請(qǐng)求時(shí),如果驗(yàn)證完本地內(nèi)容緩存后需要發(fā)起服務(wù)端驗(yàn)證,Etag的值將由請(qǐng)求消息頭的If-None-Match字段傳遞給服務(wù)端。如果服務(wù)端驗(yàn)證If-None-Match的值與服務(wù)端的Etag值不匹配,則認(rèn)為請(qǐng)求的內(nèi)容已經(jīng)更新,服務(wù)端將會(huì)返回新的內(nèi)容,否則返回響應(yīng)狀態(tài)碼304,客戶端將使用本地緩存。

下圖可以看到客戶端第一次請(qǐng)求時(shí),客戶端請(qǐng)求中沒有If-Modified-Since和Etag標(biāo)識(shí),服務(wù)端響應(yīng)了200,并且返回了Etag和Last-Modified消息頭。
6f318ee8-24e0-11f0-9310-92fbcf53809c.png在這里插入圖片描述 當(dāng)?shù)诙慰蛻舳苏?qǐng)求時(shí),帶上了If-Modified-Since和If-None-Match消息頭,并且服務(wù)端經(jīng)過校驗(yàn)后返回了304讓客戶端使用本地緩存。
7008a982-24e0-11f0-9310-92fbcf53809c.png在這里插入圖片描述

用戶行為對(duì)瀏覽器緩存的影響
當(dāng)按下F5或者刷新時(shí),客戶端瀏覽器會(huì)添加請(qǐng)求消息頭字段Cache-Control: max-age=0,該請(qǐng)求不進(jìn)行內(nèi)容緩存的本地驗(yàn)證,會(huì)直接向Web服務(wù)器發(fā)起請(qǐng)求,服務(wù)端根據(jù)If-Modified-Since或者If-None-Match的值進(jìn)行驗(yàn)證。

當(dāng)按下Ctrl+F5或者強(qiáng)制刷新時(shí),客戶端瀏覽器會(huì)添加請(qǐng)求消息頭字段Cache-Control: no-cache,并且忽略所有服務(wù)端驗(yàn)證的消息頭字段(Etag和Last-Modified),該請(qǐng)求不進(jìn)行內(nèi)容緩存的本地驗(yàn)證,它會(huì)直接向Web服務(wù)器發(fā)起請(qǐng)求,因?yàn)檎?qǐng)求中沒有攜帶服務(wù)端驗(yàn)證的消息頭字段,服務(wù)端會(huì)直接返回新的內(nèi)容。

Cache-Control字段在請(qǐng)求和響應(yīng)中的含義
客戶端請(qǐng)求
max-age:不想要在代理服務(wù)器中緩存了太長(zhǎng)時(shí)間(>max-age seconds)的資源。
max-stale:可以接收代理服務(wù)器上的過期緩存。若max-stable后沒有值,則表示無論過期多久客戶端都可以使用。
min-fresh:要求服務(wù)器使用其緩存時(shí),至少保證在min-fresh秒內(nèi)不會(huì)過期。
no-cache:告訴代理服務(wù)器,不能直接使用已有緩存作為響應(yīng)返回,除非帶著緩存條件到上游服務(wù)端得到 304 驗(yàn)證返回碼才可使用現(xiàn)有緩存。
no-store:告訴各代理服務(wù)器不得緩存這個(gè)請(qǐng)求及其相應(yīng)。
no-transform: 告訴代理服務(wù)器不要修改消息包體的內(nèi)容。
only-if-cached:告訴代理服務(wù)器僅能返回緩存,沒有緩存的話就返回 504。
服務(wù)端響應(yīng)
max-age:告訴客戶端緩存 Age 超出 max-age 秒后則緩存過期。
s-maxage:與max-age相似,但僅針對(duì)共享緩存,且優(yōu)先級(jí)高于max-age和Expires。
public:可以被所有的用戶緩存,包括終端用戶和 CDN 等中間代理服務(wù)器。
private: 只能被終端用戶的瀏覽器緩存,不允許 CDN 等中繼緩存服務(wù)器對(duì)其緩存。
no-store:告訴所有下游節(jié)點(diǎn)不能對(duì)響應(yīng)進(jìn)行緩存。
no-cache: 告訴客戶端不能直接使用緩存的響應(yīng),使用前必須在源服務(wù)器驗(yàn)證得到304返回碼。
no-transform:告訴代理服務(wù)器不能修改消息包體的內(nèi)容。
must-revalidate:告訴客戶端一旦緩存過期,必須向服務(wù)器驗(yàn)證后才可使用。
proxy-revalidate:與 must-revalidate 類似,但它僅對(duì)代理服務(wù)器的共享緩存有效。

服務(wù)端緩存

proxy cache屬于服務(wù)端緩存,主要實(shí)現(xiàn)nginx 服務(wù)器對(duì)客戶端數(shù)據(jù)請(qǐng)求的快速響應(yīng)。 nginx 服務(wù)器在接收到被代理服務(wù)器的響應(yīng)數(shù)據(jù)之后,一方面將數(shù)據(jù)傳遞給客戶端,另一方面根據(jù)proxy cache的配置將這些數(shù)據(jù)緩存到本地硬盤上。 當(dāng)客戶端再次訪問相同的數(shù)據(jù)時(shí),nginx服務(wù)器直接從硬盤檢索到相應(yīng)的數(shù)據(jù)返回給用戶,從而減少與被代理服務(wù)器交互的時(shí)間。

開啟nginx緩存

7029a4fc-24e0-11f0-9310-92fbcf53809c.png在這里插入圖片描述

反向代理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 : 默認(rèn)所有緩存文件都放在同一個(gè)目錄下時(shí),會(huì)影響緩存的性能,大部分場(chǎng)景推薦使用2級(jí)目錄來存儲(chǔ)緩存文件,1和2表示用1位和2位16進(jìn)制來命名目錄名稱。第一級(jí)目錄用1位16進(jìn)制命名,如b;第二級(jí)目錄用2位16進(jìn)制命名,如2b。所以一級(jí)目錄有16個(gè),二級(jí)目錄有1616=256個(gè),總目錄數(shù)為16256=4096個(gè)。
key_zone : 在共享內(nèi)存中設(shè)置一塊存儲(chǔ)區(qū)域來存放緩存的key字符串,這樣nginx可以快速判斷一個(gè)request是否命中或者未命中緩存,1m可以存儲(chǔ)8000個(gè)key,10m可以存儲(chǔ)80000個(gè)key;
max_size(可選) : 最大cache空間,如果不指定,會(huì)使用掉所有磁盤空間。當(dāng)達(dá)到配額后,會(huì)刪除最少使用的cache文件。
inactive(可選) : 未被訪問文件在緩存中保留時(shí)間,本配置中如果60秒未被訪問則不論狀態(tài)是否為expired,緩存控制程序會(huì)刪掉文件,默認(rèn)為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; #代理服務(wù)器本身設(shè)置對(duì)200 302響應(yīng)緩存80s
   proxy_cache mycache; #引用前面定義的proxy_cache_path
   add_header cache $upstream_cache_status; #這個(gè)不是必須的,只是方便我們測(cè)試的時(shí)候查看是否命中緩存
  }
 }
}

被代理服務(wù)器配置

被代理服務(wù)器上需要通知代理服務(wù)器緩存內(nèi)容的時(shí)間,否則代理服務(wù)器不會(huì)對(duì)內(nèi)容進(jìn)行緩存,通過X-Accel-Expires,expires,Cache-Control "max-age="其中一個(gè)參數(shù)指定時(shí)間。如果代理服務(wù)器上配置了proxy_cache_valid的時(shí)間,那么被代理服務(wù)器可以不指定緩存內(nèi)容的時(shí)間。

events {
}
http {
 server {
  listen 8080;
  location /cache {
   add_header X-Accel-Expires 100; #通知代理服務(wù)器緩存100s
   #expires 50;  #通知代理服務(wù)器緩存50s
   #add_header Cache-Control "max-age=50"; #通知代理服務(wù)器緩存50s
   alias /www/html/docs/ ;
  }
 }
}

驗(yàn)證緩存

客戶端連續(xù)兩次去訪問代理服務(wù)器,可以看到第一次請(qǐng)求未命中緩存,第二次請(qǐng)求命中緩存。

? curl http://192.168.1.134/cache/ -I
HTTP/1.1 200 OK
Server: nginx/1.14.2
Date: Sat, 09 Jan 2021 1638 GMT
Content-Type: text/html
Content-Length: 26065
Connection: keep-alive
Last-Modified: Wed, 21 Oct 2020 1408 GMT
ETag: "5f9042e4-65d1"
Expires: Sat, 09 Jan 2021 1627 GMT
Cache-Control: max-age=50
cache: MISS #第一次請(qǐng)求未命中緩存
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 1639 GMT
Content-Type: text/html
Content-Length: 26065
Connection: keep-alive
Last-Modified: Wed, 21 Oct 2020 1408 GMT
ETag: "5f9042e4-65d1"
Expires: Sat, 09 Jan 2021 1627 GMT
Cache-Control: max-age=50
cache: HIT #第二次請(qǐng)求命中緩存
Accept-Ranges: bytes

并且在代理服務(wù)器上我們之前指定的緩存文件路徑下可以看到該文件。

[root@nginx-plus1 e2]# pwd
/tmp/nginx/cache/9/e2
[root@nginx-plus1 e2]# ls
b5ba0009996f20ce25cbca96ac976e29

緩存配置綜合例子

user nginx;
events{
worker_connections 1024; 
}
http {
  #設(shè)置緩存路徑和相關(guān)參數(shù)(必選)
  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;

      #對(duì)響應(yīng)狀態(tài)碼為200 302的響應(yīng)緩存100s
      proxy_cache_valid 200 302 100s;
      #對(duì)響應(yīng)狀態(tài)碼為404的響應(yīng)緩存200
      proxy_cache_valid 404 200s;

      #請(qǐng)求參數(shù)帶有nocache或者comment時(shí)不使用緩存
      proxy_cache_bypass $arg_nocache $arg_comment;

      #忽略被代理服務(wù)器設(shè)置的"Cache-Control"頭信息
      proxy_ignore_headers "Cache-Control";

      #對(duì)GET HEAD POST方法進(jìn)行緩存
      proxy_cache_methods GET HEAD POST;

      #當(dāng)緩存過期時(shí),當(dāng)構(gòu)造上游請(qǐng)求時(shí),添加If-Modified-Since和If-None-Match頭部,值為過期緩存中的Last-Modified值和Etag值。
      proxy_cache_revalidate on;

      #當(dāng)被代理服務(wù)器返回403時(shí),nginx可以使用歷史緩存來響應(yīng)客戶端,該功能在一定程度上能能夠?yàn)榭蛻舳颂峁┎婚g斷訪問
      proxy_cache_use_stale http_403;

      #默認(rèn)開啟,開啟代理緩沖區(qū)(內(nèi)存)
      proxy_buffering on;
      #設(shè)置響應(yīng)頭的緩沖區(qū)設(shè)為8k
      proxy_buffer_size 8k;
      #設(shè)置網(wǎng)頁內(nèi)容緩沖區(qū)個(gè)數(shù)為8,單個(gè)大小為8k
      proxy_buffers 8 8k;
      #設(shè)置當(dāng)nginx還在讀取被代理服務(wù)器的數(shù)據(jù)響應(yīng)的同時(shí)間一次性向客戶端響應(yīng)的數(shù)據(jù)的最大為16k
      proxy_busy_buffers_size 16k;
      #臨時(shí)文件最大為1024m
      proxy_max_temp_file_size 1024m;
      #設(shè)置一次往臨時(shí)文件的大小最大為16k
      proxy_temp_file_write_size 16k;
      #設(shè)置臨時(shí)文件存放目錄
      proxy_temp_path /tmp/proxy_temp;

      #設(shè)置和被代理服務(wù)器連接的超時(shí)時(shí)間為60s
      proxy_connect_timeout 60;
      #設(shè)置向被代理服務(wù)器發(fā)送請(qǐng)求的超時(shí)時(shí)間為60s
      proxy_send_timeout 60;
      #設(shè)置從被代理服務(wù)器讀取響應(yīng)的超時(shí)時(shí)間為60s
      proxy_read_timeout 60;

      #添加緩存狀態(tài)參數(shù),方便測(cè)試是否命中緩存
      add_header cache $upstream_cache_status;
    }
  }
}

緩存狀態(tài)

$upstream_cache_status中包含以下幾個(gè)狀態(tài):
MISS:未命中緩存,請(qǐng)求被傳送到后端服務(wù)器。
HIT: 命中緩存,使用緩存響應(yīng)客戶端。
EXPIRED: 緩存已經(jīng)過期,請(qǐng)求被傳送到后端。
UPDATING: 正在更新緩存,將使用舊緩存的應(yīng)答客戶端。
STALE: 客戶端將得到過期的應(yīng)答。
BYPASS: 緩存被繞過了,請(qǐng)求被傳送到后端服務(wù)器。
REVALIDATED: nginx通過過期緩存中的Etag和Last-Modified字段的值向被代理服務(wù)器發(fā)起驗(yàn)證請(qǐng)求。

緩存多久

參數(shù)(優(yōu)先級(jí)從高到低) 位置
inactive 代理服務(wù)器
X-Accel-Expires 被代理服務(wù)器
Cache-Control 被代理服務(wù)器
expires 被代理服務(wù)器
proxy_cache_valid 代理服務(wù)器

通過nginx變量限制是否使用緩存

proxy_cache_bypass
該參數(shù)設(shè)定,什么情況下的請(qǐng)求不讀取cache而是直接從后端的服務(wù)器上獲取資源。這里的string通常為nginx的的一些內(nèi)置變量或者自己定義的變量。

Syntax: proxy_cache_bypass string ...;
Default: —
Context: http, server, location

例如:

proxy_cache_bypass $arg_nocache $arg_comment;

當(dāng)客戶端訪問請(qǐng)求中帶有nocache或者comment參數(shù)時(shí),不使用緩存數(shù)據(jù)。

? 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 0525 GMT
Content-Type: text/html
Content-Length: 26065
Connection: keep-alive
Last-Modified: Wed, 21 Oct 2020 1408 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 0529 GMT
Content-Type: text/html
Content-Length: 26065
Connection: keep-alive
Last-Modified: Wed, 21 Oct 2020 1408 GMT
ETag: "5f9042e4-65d1"
Cache-Control: max-age=10
cache: BYPASS
Accept-Ranges: bytes

proxy_no_cache
該參數(shù)和proxy_cache_bypass類似,用來設(shè)定什么情況下不緩存。

Syntax: proxy_no_cache string ...;
Default: —
Context: http, server, location

例如:

proxy_no_cache $cookie_nocache $arg_nocache $arg_comment;

定義緩存與請(qǐng)求間匹配的關(guān)鍵字

proxy_cache_key
設(shè)置nginx服務(wù)器在共享內(nèi)存中為緩存數(shù)據(jù)建立索引時(shí)使用的關(guān)鍵字。

Syntax: proxy_cache_key string;
Default: proxy_cache_key $scheme$proxy_host$request_uri;
Context: http, server, location
70420f1a-24e0-11f0-9310-92fbcf53809c.png在這里插入圖片描述

例如:

proxy_cache_key $scheme$proxy_host$uri$is_args$args;

影響緩存的HTTP method

proxy_cache_methods
設(shè)置可以緩存的HTTP請(qǐng)求方法。

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
當(dāng)客戶端一次使用HEAD方法請(qǐng)求時(shí),nginx會(huì)通過GET方法向上游請(qǐng)求完整的header和body,只返回header給客戶端。 當(dāng)客戶端下次使用GET方法請(qǐng)求時(shí),nginx會(huì)把緩存好的body返回給客戶端,就不用去請(qǐng)求上游了。

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
當(dāng)被代理服務(wù)器的響應(yīng)存在以下頭部時(shí),nginx不會(huì)緩存:

Set-Cookie
Cache-Control中存在以下項(xiàng)之一:

private
no-cache
no-store

可以設(shè)置忽略被代理服務(wù)器的響應(yīng)頭。

Syntax: proxy_ignore_headers field ...;
Default: —
Context: http, server, location

例如:

proxy_ignore_headers Set-Cookie Cache-Control;

影響緩存的HTTP 響應(yīng)

proxy_cache_valid
通過該參數(shù),可以配置相應(yīng)的http code類型的請(qǐng)求,生成的緩存的過期時(shí)間,可以配置多條。

Syntax: proxy_cache_valid [code ...] time;
Default: —
Context: http, server, location

例如:

proxy_cache_valid 200 302 10m;
proxy_cache_valid 404   1m;

緩存請(qǐng)求次數(shù)

proxy_cache_min_uses
當(dāng)客戶端請(qǐng)求發(fā)送的次數(shù)達(dá)到設(shè)置次數(shù)后才會(huì)緩存該請(qǐng)求的響應(yīng)數(shù)據(jù),如果不想緩存低頻請(qǐng)求可以設(shè)置此項(xiàng)。

Syntax: proxy_cache_min_uses number;
Default: proxy_cache_min_uses 1;
Context: http, server, location

緩存大小

proxy_buffering
默認(rèn)是開啟狀態(tài),當(dāng)關(guān)閉時(shí),nginx將不會(huì)對(duì)任何響應(yīng)做緩存。

Syntax: proxy_buffering on | off;
Default: proxy_buffering on;
Context: http, server, location

proxy_buffers
在內(nèi)存中設(shè)置緩沖區(qū)存儲(chǔ)被代理服務(wù)器響應(yīng)的body所占用的buffer個(gè)數(shù)和每個(gè)buffer大小,默認(rèn)情況下buffer size等于一個(gè)memory page,32為操作系統(tǒng)為4k,64位為8k。當(dāng)buffer大小(內(nèi)存)無法容納被代理服務(wù)器響應(yīng)數(shù)據(jù)時(shí),會(huì)將響應(yīng)數(shù)據(jù)存放在proxy_temp_path中定義的臨時(shí)目錄(硬盤)中。

Syntax: proxy_buffers number size;
Default: proxy_buffers 8 4k|8k;
Context: http, server, location

proxy_buffer_size
proxy_buffer_size 用來接受被代理服務(wù)器響應(yīng)頭,如果響應(yīng)頭超過了這個(gè)長(zhǎng)度,nginx會(huì)報(bào)upstream sent too big header錯(cuò)誤,然后client收到的是502。

Syntax: proxy_buffer_size size;
Default: proxy_buffer_size 4k|8k;
Context: http, server, location

proxy_busy_buffers_size
nginx將會(huì)盡可能的讀取被代理服務(wù)器的數(shù)據(jù)到buffer,直到proxy_buffers設(shè)置的所有buffer被寫滿或者數(shù)據(jù)被讀取完,此時(shí)nginx開始向客戶端傳輸數(shù)據(jù)。如果數(shù)據(jù)很大的話,nginx會(huì)接收并把他們寫入到temp_file里去,大小由proxy_max_temp_file_size 控制。當(dāng)數(shù)據(jù)沒有完全讀完的時(shí)候,nginx同時(shí)向客戶端傳送的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的臨時(shí)文件存在目錄以及目錄的層級(jí)。

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;

那么臨時(shí)文件將會(huì)類似:

/spool/nginx/proxy_temp/7/45/00000123457


proxy_temp_file_write_size
設(shè)置一次寫入臨時(shí)文件的數(shù)據(jù)的最大的大小。

Syntax: proxy_temp_file_write_size size;
Default: proxy_temp_file_write_size 8k|16k;
Context: http, server, location


proxy_max_temp_file_size
設(shè)置臨時(shí)文件的最大的大小。

Syntax: proxy_max_temp_file_size size;
Default: proxy_max_temp_file_size 1024m;
Context: http, server, location

超時(shí)時(shí)間

proxy_connect_timeout
設(shè)置和被代理服務(wù)器建立連接超時(shí)時(shí)間。

Syntax: proxy_connect_timeout time;
Default: proxy_connect_timeout 60s;
Context: http, server, location


proxy_read_timeout
設(shè)置從被代理服務(wù)器讀取響應(yīng)的時(shí)間。

Syntax: proxy_read_timeout time;
Default: proxy_read_timeout 60s;
Context: http, server, location


proxy_send_timeout
設(shè)置發(fā)送請(qǐng)求給被代理服務(wù)器的超時(shí)時(shí)間。

Syntax: proxy_send_timeout time;
Default: proxy_send_timeout 60s;
Context: http, server, location

并發(fā)回源請(qǐng)求

proxy_cache_lock
針對(duì)同一個(gè)key,僅允許一個(gè)請(qǐng)求回源去更新緩存,用于鎖住并發(fā)回源請(qǐng)求。

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
鎖住請(qǐng)求的最長(zhǎng)等待時(shí)間,超時(shí)后直接回源,但不會(huì)以此響應(yīng)更新緩存。

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
更新緩存的回源請(qǐng)求最大超時(shí)時(shí)間,超時(shí)后放行其他請(qǐng)求更新緩存。

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在訪問被代理服務(wù)器過程中出現(xiàn)被代理服務(wù)器無法訪問或者訪問出錯(cuò)等現(xiàn)象時(shí),nginx服務(wù)器可以使用歷史緩存響應(yīng)客戶端的請(qǐng)求,這些數(shù)據(jù)不一定和被代理服務(wù)器上最新的數(shù)據(jù)相一致,但對(duì)于更新頻率不高的后端服務(wù)器來說,nginx服務(wù)器的該功能在一定程度上能夠?yàn)榭蛻舳颂峁┎婚g斷訪問。該指令用來設(shè)置一些狀態(tài),當(dāng)被代理服務(wù)器處于這些狀態(tài)時(shí),nginx服務(wù)器啟用該功能。

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

例如: 配置當(dāng)被代理服務(wù)器返回404 HTTP響應(yīng)碼時(shí),nginx可以使用歷史緩存來響應(yīng)客戶端。

proxy_cache_use_stale http_404;

客戶端訪問測(cè)試:

? 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 0658 GMT
Content-Type: text/html
Content-Length: 26065
Connection: keep-alive
Last-Modified: Wed, 21 Oct 2020 1408 GMT
ETag: "5f9042e4-65d1"
Expires: Mon, 11 Jan 2021 0607 GMT
Cache-Control: max-age=10
cache: MISS #第一次請(qǐng)求沒有緩存
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 0601 GMT
Content-Type: text/html
Content-Length: 26065
Connection: keep-alive
Last-Modified: Wed, 21 Oct 2020 1408 GMT
ETag: "5f9042e4-65d1"
Expires: Mon, 11 Jan 2021 0607 GMT
Cache-Control: max-age=10
cache: HIT #第二次請(qǐng)求nginx使用緩存響應(yīng)
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 0629 GMT
Content-Type: text/html
Content-Length: 26065
Connection: keep-alive
Last-Modified: Wed, 21 Oct 2020 1408 GMT
ETag: "5f9042e4-65d1"
Expires: Mon, 11 Jan 2021 0607 GMT
Cache-Control: max-age=10
cache: STALE #第三次請(qǐng)求之前先將被代理服務(wù)器上的index.html文件刪除,nginx使用歷史緩存響應(yīng)
Accept-Ranges: bytes

過期緩存

proxy_cache_revalidate
當(dāng)緩存過期時(shí),當(dāng)nginx構(gòu)造上游請(qǐng)求時(shí),添加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.

當(dāng)接收到被代理服務(wù)器的304響應(yīng)時(shí),且打開了proxy_cache_revalidate功能,則用緩存來響應(yīng)客戶端,并且更新緩存狀態(tài)。

? curl http://192.168.1.134/cache/ -I
HTTP/1.1 200 OK
Server: nginx/1.14.2
Date: Sun, 10 Jan 2021 0837 GMT
Content-Type: text/html
Content-Length: 26065
Connection: keep-alive
Last-Modified: Wed, 21 Oct 2020 1408 GMT
ETag: "5f9042e4-65d1"
Expires: Sun, 10 Jan 2021 0836 GMT
Cache-Control: max-age=10
cache: REVALIDATED #表示nginx通過過期緩存中的Etag和Last-Modified字段的值向被代理服務(wù)器發(fā)起驗(yàn)證請(qǐng)求,并且被代理服務(wù)器返回了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 0838 GMT
Content-Type: text/html
Content-Length: 26065
Connection: keep-alive
Last-Modified: Wed, 21 Oct 2020 1408 GMT
ETag: "5f9042e4-65d1"
Expires: Sun, 10 Jan 2021 0836 GMT
Cache-Control: max-age=10
cache: HIT
Accept-Ranges: bytes

鏈接:https://blog.csdn.net/liulanba/article/details/136382616

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Web
    Web
    +關(guān)注

    關(guān)注

    2

    文章

    1278

    瀏覽量

    70616
  • 服務(wù)器
    +關(guān)注

    關(guān)注

    12

    文章

    9603

    瀏覽量

    87022
  • HTTP
    +關(guān)注

    關(guān)注

    0

    文章

    517

    瀏覽量

    32307
  • nginx
    +關(guān)注

    關(guān)注

    0

    文章

    162

    瀏覽量

    12457

原文標(biāo)題:Nginx緩存配置詳解:5分鐘讓你的網(wǎng)站速度提升3倍!?

文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    【NanoPi NEO試用體驗(yàn)】之安裝配置Nginx環(huán)境WEB網(wǎng)站詳解

    速度。root@nrjs-cn:~# apt-get install nginx【1.3啟動(dòng)NGINX服務(wù)】待NGINX安裝完成后不需要做任何配置就能夠直接使用如下命令啟動(dòng),如果啟動(dòng)錯(cuò)
    發(fā)表于 10-18 12:25

    詳解219 nginx

    219 nginx的詳細(xì)介紹
    發(fā)表于 04-15 11:26

    nginx中的sendfile配置說明

    nginx配置sendfile及詳細(xì)說明
    發(fā)表于 05-05 08:08

    Centos7Nginx安裝與配置步驟

    Centos7 Nginx安裝與配置,防火墻開啟端口監(jiān)聽
    發(fā)表于 06-02 12:58

    nginx錯(cuò)誤頁面配置

    16、nginx 錯(cuò)誤頁面配置nginx錯(cuò)誤頁面包括404 403 500 502 503 504等頁面,只需要在server中增加以下配置即可: error_page404 403
    發(fā)表于 07-26 06:54

    主要學(xué)習(xí)下nginx的安裝配置

    用于nginx編碼轉(zhuǎn)換的配置文件;/var/log/nginxnginx的訪問和錯(cuò)誤日志目錄;/var/cache/nginx/為
    發(fā)表于 10-19 14:12

    展示一下nginx的學(xué)習(xí)模塊

    修改為nginx,reload nginx后可以看到頁面:但是只修改了第一個(gè)tomcat,第二個(gè)沒有修改;如果要全部替換,需要配置:如果遇到頁面上沒有替換的情況,可能是瀏覽器緩存導(dǎo)致,
    發(fā)表于 10-19 14:16

    一文知道Nginx服務(wù)器的緩存原理和機(jī)制

    Nginx服務(wù)器的緩存原理,是在學(xué)習(xí)過程中比較重要的一個(gè)知識(shí)點(diǎn),學(xué)習(xí)通透之后,對(duì)于自己的能力會(huì)有不小的提升——而且提升不只限于nginx一方面,技術(shù)理論一通百通,對(duì)于理解其他內(nèi)容也會(huì)有很大幫助。
    的頭像 發(fā)表于 10-05 09:01 ?2552次閱讀
    一文知道<b class='flag-5'>Nginx</b>服務(wù)器的<b class='flag-5'>緩存</b>原理和機(jī)制

    運(yùn)行nginx所需的最低配置

    運(yùn)行nginx所需的最低配置: # /etc/nginx/nginx.confevents {} # event context have to be defined to consi
    的頭像 發(fā)表于 08-23 10:53 ?5633次閱讀

    Nginx軟件location目錄匹配詳解

    團(tuán)和滴滴)等等。使用過Nginx的同學(xué)都知道,你只需要按需求準(zhǔn)確的更改好配置啟動(dòng),那么就可以優(yōu)雅的訪問它了。 所以說Nginx對(duì)配置文件的很是看中呢,這就要求我們更改
    的頭像 發(fā)表于 10-08 17:10 ?3693次閱讀

    Nginx常用的配置和基本功能講解

    Nginx 已經(jīng)廣泛應(yīng)用于 J-one 和 Jdos 的環(huán)境部署上,本文對(duì) Nginx 的常用的配置和基本功能進(jìn)行講解,適合 Nginx 入門學(xué)習(xí)。
    的頭像 發(fā)表于 05-04 10:25 ?831次閱讀

    Nginx的特點(diǎn)和作用 Nginx常用命令和核心配置

    更新。性能是 Nginx 最重要的考量,其占用內(nèi)存少、并發(fā)能力強(qiáng)、能支持高達(dá) 5w 個(gè)并發(fā)連接數(shù),最重要的是, Nginx 是免費(fèi)的并可以商業(yè)化,配置使用也比較簡(jiǎn)單。
    的頭像 發(fā)表于 09-01 09:53 ?936次閱讀
    <b class='flag-5'>Nginx</b>的特點(diǎn)和作用 <b class='flag-5'>Nginx</b>常用命令和核心<b class='flag-5'>配置</b>

    Nginx常用配置與命令

    對(duì)于前端來說 Node.js 并不陌生, Nginx 和 Node.js 的很多理念類似, HTTP 服務(wù)器、事件驅(qū)動(dòng)、異步非阻塞等,且 Nginx 的大部分功能使用 Node.js 也可以實(shí)現(xiàn),但 Nginx 和 Node.j
    發(fā)表于 10-18 10:04 ?578次閱讀
    <b class='flag-5'>Nginx</b>常用<b class='flag-5'>配置</b>與命令

    nginx負(fù)載均衡配置介紹

    目錄 nginx負(fù)載均衡 nginx負(fù)載均衡介紹 反向代理與負(fù)載均衡 nginx負(fù)載均衡配置 Keepalived高可用nginx負(fù)載均衡器
    的頭像 發(fā)表于 11-10 13:39 ?545次閱讀
    <b class='flag-5'>nginx</b>負(fù)載均衡<b class='flag-5'>配置</b>介紹

    nginx中強(qiáng)緩存和協(xié)商緩存介紹

    強(qiáng)緩存直接告訴瀏覽器:在緩存過期前,無需與服務(wù)器通信,直接使用本地緩存
    的頭像 發(fā)表于 04-01 16:01 ?211次閱讀