共計 3332 個字符,預計需要花費 9 分鐘才能閱讀完成。
本篇內容主要講解“Nginx 客戶端緩存的原理是什么”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓丸趣 TV 小編來帶大家學習“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 服務器發起請求,因為請求中沒有攜帶服務端驗證的消息頭字段,服務端會直接返回新的內容。
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 類似,但它僅對代理服務器的共享緩存有效。
到此,相信大家對“Nginx 客戶端緩存的原理是什么”有了更深的了解,不妨來實際操作一番吧!這里是丸趣 TV 網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!