本篇內(nèi)容主要講解“Nginx客戶端緩存的原理是什么”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“Nginx客戶端緩存的原理是什么”吧!
讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對這個(gè)行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長期合作伙伴,公司提供的服務(wù)項(xiàng)目有:空間域名、網(wǎng)頁空間、營銷軟件、網(wǎng)站建設(shè)、蚌埠網(wǎng)站維護(hù)、網(wǎng)站推廣。
緩存對于Web服務(wù)至關(guān)重要,尤其對于大型高負(fù)載Web站點(diǎn)。緩存作為性能優(yōu)化的一個(gè)重要手段,可以在極大程度上減輕后端服務(wù)器的負(fù)載。通常對于靜態(tài)資源,即不經(jīng)常更新的資源,如圖片,CSS或JS等進(jìn)行緩存,而不用每次都向服務(wù)器請求,這樣就可以減輕服務(wù)器的壓力。
緩存可以分為客戶端緩存
和服務(wù)端緩存
。
客戶端緩存指的是瀏覽器緩存
, 瀏覽器緩存是最快的緩存, 因?yàn)樗苯訌谋镜孬@取(但有可能需要發(fā)送一個(gè)協(xié)商緩存的請求), 它的優(yōu)勢是可以減少網(wǎng)絡(luò)流量, 加快請求速度。
服務(wù)端緩存指的是反向代理服務(wù)器或cdn的緩存, 他的作用是用于減輕后端實(shí)際的Web Server的壓力。
瀏覽器緩存可以分為兩種模式,強(qiáng)緩存
和協(xié)商緩存
。
強(qiáng)緩存(無HTTP請求,無需協(xié)商)
直接讀取本地緩存,無需向服務(wù)端發(fā)送請求確認(rèn),HTTP返回狀態(tài)碼是200(from memory cache或者from disk cache ,不同瀏覽器返回的信息不一致的)。
相關(guān)的HTTP Header
有:
Cache-Control
Expires
協(xié)商緩存(有HTTP請求,需協(xié)商)
瀏覽器雖然發(fā)現(xiàn)了本地有該資源的緩存,但是緩存已經(jīng)過期,于是向服務(wù)器詢問緩存內(nèi)容是否還可以使用,若服務(wù)器認(rèn)為瀏覽器的緩存內(nèi)容還可用,那么便會返回304(Not Modified)HTTP狀態(tài)碼,告訴瀏覽器讀取本地緩存;如果服務(wù)器認(rèn)為瀏覽器的緩存內(nèi)容已經(jīng)改變,則返回新的請求的資源。
相關(guān)的HTTP Header
有:
Last-Modified
ETag
由于網(wǎng)站內(nèi)容的經(jīng)常變化,為了保持緩存的內(nèi)容與網(wǎng)站服務(wù)器的內(nèi)容一致,客戶端會通過內(nèi)容緩存的有效期(強(qiáng)制緩存)以及Web服務(wù)器提供的訪問請求的校驗(yàn)(協(xié)商緩存),快速判斷請求的內(nèi)容是否已經(jīng)更新??蛻舳司彺嫘r?yàn)流程圖如下:
強(qiáng)制緩存原理:瀏覽器在加載資源的時(shí)候,會先根據(jù)本地緩存資源的header中的信息(Expires 和 Cache-Control)來判斷緩存是否過期。如果緩存沒有過期,則會直接使用緩存中的資源;否則,會向服務(wù)端發(fā)起協(xié)商緩存的請求。
客戶端判斷緩存是否過期和先前請求時(shí)服務(wù)端返回的HTTP消息頭字段有關(guān):
服務(wù)端返回字段 | 作用 |
---|---|
Cache-Control: max-age=x | 客戶端緩存時(shí)間超出x秒后則緩存過期。 |
Cache-Control: no-cache | 客戶端不能直接使用本地緩存的響應(yīng),需要進(jìn)行協(xié)商緩存,發(fā)送請求到服務(wù)器確認(rèn)是否可以使用緩存。如果Web服務(wù)器返回304,則客戶端使用本地緩存,如果返回200,則使用Web服務(wù)器返回的新的數(shù)據(jù)。 |
Cache-Control: no-store | 客戶端不能對響應(yīng)進(jìn)行緩存。 |
Cache-Control: public | 可以被所有的用戶緩存,包括終端用戶和 CDN 等中間代理服務(wù)器。 |
Cache-Control:private | 只能被終端用戶的瀏覽器緩存,不允許 CDN 等中繼緩存服務(wù)器對其緩存。 |
expires x | 客戶端緩存時(shí)間超出x秒后則緩存過期,優(yōu)先級比Cache-Control: max-age=x低。 |
協(xié)商緩存原理:當(dāng)客戶端向服務(wù)端發(fā)起請求時(shí),服務(wù)端會檢查請求中是否有對應(yīng)的標(biāo)識(If-Modified-Since或Etag),如果沒有對應(yīng)的標(biāo)識,服務(wù)器端會返回標(biāo)識給客戶端,客戶端下次再次請求的時(shí)候,把該標(biāo)識帶過去,然后服務(wù)器端會驗(yàn)證該標(biāo)識,如果驗(yàn)證通過了,則會響應(yīng)304,告訴瀏覽器讀取緩存。如果標(biāo)識沒有通過,則返回請求的資源。
Last-Modified
與If-Modified-Since
屬于HTTP/1.0,是用于服務(wù)端對響應(yīng)數(shù)據(jù)修改時(shí)間進(jìn)行校驗(yàn)的服務(wù)端校驗(yàn)方法。Last-Modified的值是由服務(wù)端生成后傳遞給客戶端的,客戶端發(fā)送請求時(shí),會將本地內(nèi)容緩存中的Last-Modified的值由請求消息頭的If-Modified-Since字段傳遞給服務(wù)端,如果服務(wù)端的被請求的內(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)先級高于Last-Modified的驗(yàn)證,是用于服務(wù)端對響應(yīng)數(shù)據(jù)進(jìn)行實(shí)體標(biāo)簽校驗(yàn)的服務(wù)端校驗(yàn)方法。Etag類似于身份指紋,是一個(gè)可以與Web資源關(guān)聯(lián)的記號。當(dāng)客戶端第一次發(fā)起請求時(shí),Etag的值在響應(yīng)頭中傳遞給客戶端;當(dāng)客戶端再次發(fā)起請求時(shí),如果驗(yàn)證完本地內(nèi)容緩存后需要發(fā)起服務(wù)端驗(yàn)證,Etag的值將由請求消息頭的If-None-Match字段傳遞給服務(wù)端。如果服務(wù)端驗(yàn)證If-None-Match的值與服務(wù)端的Etag值不匹配,則認(rèn)為請求的內(nèi)容已經(jīng)更新,服務(wù)端將會返回新的內(nèi)容,否則返回響應(yīng)狀態(tài)碼304,客戶端將使用本地緩存。
下圖可以看到客戶端第一次請求時(shí),客戶端請求中沒有If-Modified-Since和Etag標(biāo)識,服務(wù)端響應(yīng)了200,并且返回了Etag和Last-Modified消息頭。
當(dāng)?shù)诙慰蛻舳苏埱髸r(shí),帶上了If-Modified-Since和If-None-Match消息頭,并且服務(wù)端經(jīng)過校驗(yàn)后返回了304讓客戶端使用本地緩存。
當(dāng)按下F5或者刷新時(shí),客戶端瀏覽器會添加請求消息頭字段Cache-Control: max-age=0,該請求不進(jìn)行內(nèi)容緩存的本地驗(yàn)證,會直接向Web服務(wù)器發(fā)起請求,服務(wù)端根據(jù)If-Modified-Since或者If-None-Match的值進(jìn)行驗(yàn)證。
當(dāng)按下Ctrl+F5或者強(qiáng)制刷新時(shí),客戶端瀏覽器會添加請求消息頭字段Cache-Control: no-cache,并且忽略所有服務(wù)端驗(yàn)證的消息頭字段(Etag和Last-Modified),該請求不進(jìn)行內(nèi)容緩存的本地驗(yàn)證,它會直接向Web服務(wù)器發(fā)起請求,因?yàn)檎埱笾袥]有攜帶服務(wù)端驗(yàn)證的消息頭字段,服務(wù)端會直接返回新的內(nèi)容。
max-age:不想要在代理服務(wù)器中緩存了太長時(shí)間(>max-age seconds)的資源。
max-stale:可以接收代理服務(wù)器上的過期緩存。若max-stable后沒有值,則表示無論過期多久客戶端都可以使用。
min-fresh:要求服務(wù)器使用其緩存時(shí),至少保證在min-fresh秒內(nèi)不會過期。
no-cache:告訴代理服務(wù)器,不能直接使用已有緩存作為響應(yīng)返回,除非帶著緩存條件到上游服務(wù)端得到 304 驗(yàn)證返回碼才可使用現(xiàn)有緩存。
no-store:告訴各代理服務(wù)器不得緩存這個(gè)請求及其相應(yīng)。
no-transform: 告訴代理服務(wù)器不要修改消息包體的內(nèi)容。
only-if-cached:告訴代理服務(wù)器僅能返回緩存,沒有緩存的話就返回 504。
max-age:告訴客戶端緩存 Age 超出 max-age 秒后則緩存過期。
s-maxage:與max-age相似,但僅針對共享緩存,且優(yōu)先級高于max-age和Expires。
public:可以被所有的用戶緩存,包括終端用戶和 CDN 等中間代理服務(wù)器。
private: 只能被終端用戶的瀏覽器緩存,不允許 CDN 等中繼緩存服務(wù)器對其緩存。
no-store:告訴所有下游節(jié)點(diǎn)不能對響應(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 類似,但它僅對代理服務(wù)器的共享緩存有效。
到此,相信大家對“Nginx客戶端緩存的原理是什么”有了更深的了解,不妨來實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!