1、瀏覽器緩存php
瀏覽器緩存,也稱爲客戶端緩存,是靜態緩存中最多見最直接的表現形式,不少時候都每每被人忽略掉。css
案例1:html
咱們常常在nginx的配置文件中看到如下緩存配置:前端
案例2:nginx
在常常寫 jsp 的時候,html 標籤中關於 http 頭信息也能夠注意到「 expires 」的字樣:web
對於案例1和案例2中(nginx設置的expires優先級大於代碼中設置的expires優先級),expires是給一個資源設定一個過時時間,也就是說無需去服務端驗證,直接經過瀏覽器自身確認是否過時便可,因此不會產生額外的流量。此種方法很是適合不常常變更的資源。若是文件變更較頻繁,就不要使用 expires 來緩存。chrome
好比對於常見類web網站來講,css 樣式和 js 腳本基本已經定型,因此最適合的方法是 expires 來緩存一些內容到訪問者瀏覽器。apache
案例3:後端
經過 chrome 訪問服務器端的一張圖片,用F12鍵打開開發者前端調試工具:瀏覽器
第一次訪問,響應200狀態,當第二次及後續訪問的時候,變成304狀態,客戶端已經開始獲取瀏覽器緩存內容,而不須要去服務器端獲取對應的請求內容,即 nginx 中 expires 參數設置已經生效。等待客戶端緩存時間過時後,會再次請求服務器端內容來更新本地緩存。
介紹到這裏,忽然想起一個有意思的需求。好比,訪問一張靜態文件,不想客戶端緩存,須要每次都去服務器端取數據。咱們能夠用「 last-modified 」參數來實現,即「 last-modified 」是根據文件更新時間來肯定是否再次發送加載。
Nginx核心配置以下:
咱們更改掉服務器傳回客戶端的「 last-modified 」文件修改時間參數的值,這樣致使客戶端本地保存的文件時間每次跟服務器端傳回來的時間不一致,因此每次客戶端「 誤認爲 」服務器端有靜態文件更新,每次都會去服務器端取「 所謂的最新數據 」。這樣咱們能夠看到,無論在瀏覽器訪問多少次,返回的 http 狀態都是200,再也找不到304狀態了。
誤區:在 nginx 中設置 expires,並非指把靜態內容緩存在 nginx 中,而是設置客戶端瀏覽器緩存的時間,這是不少人的誤區所在。
2、磁盤緩存
除了存儲在客戶端的靜態緩存(瀏覽器靜態)技術外,在服務器端的靜態緩存技術主要分爲磁盤緩存和內存緩存兩大類。單純圍繞 nginx 的 squid、varnish 等一類中間件,處理靜態數據的性能十分優秀。核心是 nginx 基於 epoll 網絡模型,而相比 apache 基於 select 網絡模型。因此 apache 的優點在於密計算型,穩定性好。而 nginx 偏向靜態處理,反向代理,高併發。好比 apache+php 的穩定性比 nginx+php 要好,而性能是明顯 nginx 要優秀許多。
以上僅單純是對磁盤中靜態數據處理的能力,所謂磁盤緩存,指另外的一種緩存靜態文件的技術。以 nginx 配置爲例:
能夠看出 nginx 主要經過 proxy_cache 來實現 web cache,熟悉 nginx 的同窗,不難看出,以上配置在 location 這裏,不只能夠實現靜態文件的緩存,還能夠實現動態文件的緩存(這裏放在下章節詳細介紹)。咱們編寫個 test.html測試文件,而後並訪問。test.html 源碼以下:
咱們發現服務器的 cache 目錄裏面,多了兩個緩存文件:
有意思的,這兩個文件裏面的內容分別爲(經過 less 命令查看):
(b0ad5d3e7f099bfff9e4fc6a159d868c)
(53edc39ed253e14415a29412cfc01faf)
因此不難看出,nginx 把 html 內容和圖片二進制所有緩存到本地磁盤上了。下次用戶再次來訪問 test.html 的時候,nginx 直接將緩存在本地磁盤的文件返回給用戶。特別是後端如如果部署的 tomcat、iis 等,nginx 強大的靜態緩存能力,有效減小了服務器壓力。
3、內存緩存
緊接上面描述的磁盤緩存,內存緩存顧名思義,就是把靜態文件緩存在服務器端的內存中。因此這種緩存,如若命中緩存的話,取內存中的緩存數據返回比取磁盤中的緩存數據返回,性能要高不少。以 varnish 爲例,varnish 核心配置以下:
啓動命令:
參數簡介:
default.vcl核心配置以下:
Varnish對.gif、.jpg、.jpeg、.png等結尾的 URL 緩存時間設置1小時。varnish設置完畢後,咱們用命令行方式,經過查看網頁頭來查看命中狀況:
最後,咱們能夠經過 varnishadm 命令來清理緩存,也能夠經過 varnishstat 命令來查看 varnish 系統緩存狀態。
4、Nginx 的內存緩存