緩存可以減少冗余的數(shù)據(jù)傳輸。節(jié)省了網(wǎng)絡(luò)帶寬,從而更快的加載頁(yè)面。
緩存降低了服務(wù)器的要求,從而服務(wù)器更快的響應(yīng)。
那么我們使用緩存,緩存的資源文件到什么地方去了呢?首先來(lái)看下有哪幾種緩存類(lèi)型呢?
為子長(zhǎng)等地區(qū)用戶(hù)提供了全套網(wǎng)頁(yè)設(shè)計(jì)制作服務(wù),及子長(zhǎng)網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為成都網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站、子長(zhǎng)網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專(zhuān)業(yè)、用心的態(tài)度為用戶(hù)提供真誠(chéng)的服務(wù)。我們深信只要達(dá)到每一位用戶(hù)的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!
1.memory cache: 它是將資源文件緩存到內(nèi)存中。等下次請(qǐng)求訪(fǎng)問(wèn)的時(shí)候不需要重新下載資源,而是直接從內(nèi)存中讀取數(shù)據(jù)。
2.disk cache: 它是將資源文件緩存到硬盤(pán)中。等下次請(qǐng)求的時(shí)候它是直接從硬盤(pán)中讀取。
那么他們兩則的區(qū)別是?
3.memory cache(內(nèi)存緩存)退出進(jìn)程時(shí)數(shù)據(jù)會(huì)被清除,而disk cache(硬盤(pán)緩存)退出進(jìn)程時(shí)數(shù)據(jù)不會(huì)被清除。內(nèi)存讀取比硬盤(pán)中讀取的速度更快。但是我們也不能把所有數(shù)據(jù)放在內(nèi)存中緩存的,因?yàn)閮?nèi)存也是有限的。
memory cache(內(nèi)存緩存)一般會(huì)將腳本、字體、圖片會(huì)存儲(chǔ)到內(nèi)存緩存中。
4.disk cache(硬盤(pán)緩存) 一般非腳本會(huì)存放在硬盤(pán)中,比如css這些。
緩存讀取的原理:先從內(nèi)存中查找對(duì)應(yīng)的緩存,如果內(nèi)存中能找到就讀取對(duì)應(yīng)的緩存,否則的話(huà)就從硬盤(pán)中查找對(duì)應(yīng)的緩存,如果有就讀取,否則的話(huà),就重新網(wǎng)絡(luò)請(qǐng)求。
那么瀏覽器緩存它又分為2種: 強(qiáng)制緩存 和 協(xié)商緩存 。
協(xié)商緩存原理:客戶(hù)端向服務(wù)器端發(fā)出請(qǐng)求,服務(wù)端會(huì)檢測(cè)是否有對(duì)應(yīng)的標(biāo)識(shí),如果沒(méi)有對(duì)應(yīng)的標(biāo)識(shí),服務(wù)器端會(huì)返回一個(gè)對(duì)應(yīng)的標(biāo)識(shí)給客戶(hù)端,客戶(hù)端下次再次請(qǐng)求的時(shí)候,把該標(biāo)識(shí)帶過(guò)去,然后服務(wù)器端會(huì)驗(yàn)證該標(biāo)識(shí),如果驗(yàn)證通過(guò)了,則會(huì)響應(yīng)304,告訴瀏覽器讀取緩存。如果標(biāo)識(shí)沒(méi)有通過(guò),則返回請(qǐng)求的資源。
那么協(xié)商緩存的標(biāo)識(shí)又有2種:ETag/if-None-Match 和 Last-Modified/if-Modify-Since
Last-Modified/if-Modify-Since緩存
瀏覽器第一次發(fā)出請(qǐng)求一個(gè)資源的時(shí)候,服務(wù)器會(huì)返回一個(gè)last-Modify到hearer中. Last-Modify 含義是最后的修改時(shí)間。
當(dāng)瀏覽器再次請(qǐng)求的時(shí)候,request的請(qǐng)求頭會(huì)加上 if-Modify-Since,該值為緩存之前返回的 Last-Modify. 服務(wù)器收到if-Modify-Since后,根據(jù)資源的最后修改時(shí)間(last-Modify)和該值(if-Modify-Since)進(jìn)行比較,如果相等的話(huà),則命中緩存,返回304,否則, 如果 Last-Modify > if-Modify-Since, 則會(huì)給出200響應(yīng),并且更新Last-Modify為新的值。
ETag/if-None-Match緩存
ETag的原理和上面的last-modified是類(lèi)似的。ETag則是對(duì)當(dāng)前請(qǐng)求的資源做一個(gè)唯一的標(biāo)識(shí)。該標(biāo)識(shí)可以是一個(gè)字符串,文件的size,hash等。只要能夠合理標(biāo)識(shí)資源的唯一性并能驗(yàn)證是否修改過(guò)就可以了。ETag在服務(wù)器響應(yīng)請(qǐng)求的時(shí)候,返回當(dāng)前資源的唯一標(biāo)識(shí)(它是由服務(wù)器生成的)。但是只要資源有變化,ETag會(huì)重新生成的。瀏覽器再下一次加載的時(shí)候會(huì)向服務(wù)器發(fā)送請(qǐng)求,會(huì)將上一次返回的ETag值放到request header 里的 if-None-Match里面去,服務(wù)器端只要比較客戶(hù)端傳來(lái)的if-None-Match值是否和自己服務(wù)器上的ETag是否一致,如果一致說(shuō)明資源未修改過(guò),因此返回304,如果不一致,說(shuō)明修改過(guò),因此返回200。并且把新的Etag賦值給if-None-Match來(lái)更新該值。
last-modified 和 ETag之間對(duì)比
在精度上,ETag要優(yōu)先于 last-modified。
在性能上,Etag要遜于Last-Modified,Last-Modified需要記錄時(shí)間,而Etag需要服務(wù)器通過(guò)算法來(lái)計(jì)算出一個(gè)hash值。
在優(yōu)先級(jí)上,服務(wù)器校驗(yàn)優(yōu)先考慮Etag。
如上我們可以看到返回值里面有Etag的值。
然后當(dāng)我們?cè)俅嗡⑿聻g覽器代碼的時(shí)候,瀏覽器將會(huì)帶上 if-None-Match請(qǐng)求頭,并賦值為上一次返回頭的Etag的值。然后和服務(wù)器端的Etag的值進(jìn)行對(duì)比,如果相等的話(huà),就會(huì)返回304 Not Modified。如下圖所示:
我們?cè)賮?lái)改下html的內(nèi)容,我們?cè)賮?lái)刷新下看看,可以看到頁(yè)面內(nèi)容發(fā)生改變了,因此Etag值是不一樣的。如下圖所示
然后我們繼續(xù)刷新,就會(huì)返回304了,因?yàn)樗鼤?huì)把最新的Etag的值賦值給 if-None-Match請(qǐng)求頭,然后請(qǐng)求的時(shí)候,會(huì)把該最新值帶過(guò)去,因此如下圖所示可以看到。
強(qiáng)制緩存
基本原理:瀏覽器在加載資源的時(shí)候,會(huì)先根據(jù)本地緩存資源的header中的信息(Expires 和 Cache-Control)來(lái)判斷是否需要強(qiáng)制緩存。如果命中的話(huà),則會(huì)直接使用緩存中的資源。否則的話(huà),會(huì)繼續(xù)向服務(wù)器發(fā)送請(qǐng)求。
Expires 是http1.0的規(guī)范,它的值是一個(gè)絕對(duì)時(shí)間的GMT格式的時(shí)間字符串。這個(gè)時(shí)間代表的該資源的失效時(shí)間,如果在該時(shí)間之前請(qǐng)求的話(huà),則都是從緩存里面讀取的。但是使用該規(guī)范時(shí),可能會(huì)有一個(gè)缺點(diǎn)就是當(dāng)服務(wù)器的時(shí)間和客戶(hù)端的時(shí)間不一樣的情況下,會(huì)導(dǎo)致緩存失效。
Cache-Control
Cache-Control 是http1.1的規(guī)范,它是利用該字段max-age值進(jìn)行判斷的。該值是一個(gè)相對(duì)時(shí)間,比如 Cache-Control: max-age=3600, 代表該資源的有效期是3600秒。除了該字段外,我們還有如下字段可以設(shè)置:
no-cache: 需要進(jìn)行協(xié)商緩存,發(fā)送請(qǐng)求到服務(wù)器確認(rèn)是否使用緩存。
no-store:禁止使用緩存,每一次都要重新請(qǐng)求數(shù)據(jù)。
public:可以被所有的用戶(hù)緩存,包括終端用戶(hù)和 cdn 等中間代理服務(wù)器。
private:只能被終端用戶(hù)的瀏覽器緩存,不允許 CDN 等中繼緩存服務(wù)器對(duì)其緩存。
Cache-Control 與 Expires 可以在服務(wù)端配置同時(shí)啟用,同時(shí)啟用的時(shí)候 Cache-Control 優(yōu)先級(jí)高。
Nginx緩存的類(lèi)型
1.客戶(hù)端的緩存(一般指瀏覽器的緩存)。
2.服務(wù)端的緩存(使用proxy-cache實(shí)現(xiàn)的)。
Nginx如何配置
知道Nginx虛擬機(jī)的配置文件,示例如下圖:
server {
server_name www.qqdeveloper.com
location ~* \.(html)$ {
access_log off;
add_header Cache-Control max-age=no-cache;
}
location ~* \.(css|js|png|jpg|jpeg|gif|gz|svg|mp4|ogg|ogv|webm|htc|xml|woff)$ {
access_log off;
add_header Cache-Control max-age=360000;
}
}
~ 的含義是:通配任意字符(且大小寫(xiě)不敏感),\轉(zhuǎn)義字符,因此 ~ .(html)$的含義是:匹配所有以.html結(jié)尾的請(qǐng)求
access_log off; 的含義是 關(guān)閉日志功能。
add_header Cache-Control max-age=no-cache; 的含義:html文件不設(shè)置強(qiáng)制緩存時(shí)間,協(xié)商緩存,使用 Last-Modified。no-cache 會(huì)發(fā)起往返通信來(lái)驗(yàn)證緩存的響應(yīng),但如果資源未發(fā)生變化,則不會(huì)下載,返回304。
如下圖
add_header Cache-Control max-age=360000; 的含義給上面匹配后綴的文件設(shè)置強(qiáng)制緩存,且緩存的時(shí)間是360000秒,第一次訪(fǎng)問(wèn)的時(shí)候,從服務(wù)器請(qǐng)求,當(dāng)除了第一次以外,再次刷新瀏覽器,會(huì)從瀏覽器緩存讀取,那么強(qiáng)制緩存一般是從內(nèi)存里面先讀取,如果內(nèi)存沒(méi)有,再?gòu)挠脖P(pán)讀取。
本文標(biāo)題:如何通過(guò)Nginx配置來(lái)優(yōu)化你的網(wǎng)絡(luò)請(qǐng)求?
鏈接地址:http://aaarwkj.com/article8/igcoip.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供ChatGPT、面包屑導(dǎo)航、定制開(kāi)發(fā)、響應(yīng)式網(wǎng)站、App開(kāi)發(fā)、企業(yè)網(wǎng)站制作
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)