您好,登錄后才能下訂單哦!
本篇內容主要講解“Nginx客戶端緩存的原理是什么”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Nginx客戶端緩存的原理是什么”吧!
緩存對于Web服務至關重要,尤其對于大型高負載Web站點。緩存作為性能優化的一個重要手段,可以在極大程度上減輕后端服務器的負載。通常對于靜態資源,即不經常更新的資源,如圖片,CSS或JS等進行緩存,而不用每次都向服務器請求,這樣就可以減輕服務器的壓力。
緩存可以分為客戶端緩存
和服務端緩存
。
客戶端緩存指的是瀏覽器緩存
, 瀏覽器緩存是最快的緩存, 因為它直接從本地獲取(但有可能需要發送一個協商緩存的請求), 它的優勢是可以減少網絡流量, 加快請求速度。
服務端緩存指的是反向代理服務器或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服務器發起請求,因為請求中沒有攜帶服務端驗證的消息頭字段,服務端會直接返回新的內容。
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 類似,但它僅對代理服務器的共享緩存有效。
到此,相信大家對“Nginx客戶端緩存的原理是什么”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。