Nginx緩存使用

Nginx緩存使用

一個web緩存坐落于客戶端和“原始服務器(origin server)”中間,它保留了所有可見內容的拷貝。如果一個客戶端請求的內容在緩存中存儲,則可以直接在緩存中獲得該內容而不需要與服務器通信。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ( 推薦學習:nginx使用?)

這樣一來,由于web緩存距離客戶端“更近”,就可以提高響應性能,并更有效率的使用應用服務器,因為服務器不用每次請求都進行頁面生成工作。

在瀏覽器和應用服務器之間,存在多種“潛在”緩存,如:客戶端瀏覽器緩存、中間緩存、內容分發網絡(CDN)和服務器上的負載平衡和反向代理。緩存,僅在反向代理和負載均衡的層面,就對性能提高有很大的幫助。

舉個例子說明,去年,我接手了一項任務,這項任務的內容是對一個加載緩慢的網站進行性能優化。

首先引起我注意的事情是,這個網站差不多花費了超過1秒鐘才生成了主頁。經過一系列調試,我發現加載緩慢的原因在于頁面被標記為不可緩存,即為了響應每一個請求,頁面都是動態生成的。

由于頁面本身并不需要經常性的變更,并且不涉及個性化,那么這樣做其實并沒有必要。

為了驗證一下我的結論,我將頁面標記為每5秒緩存一次,僅僅做了這一個調整,就能明顯的感受到性能的提升。第一個字節到達的時間降低到幾毫秒,同時頁面的加載明顯要更快。

并不是只有大規模的內容分發網絡(CDN)可以在使用緩存中受益——緩存還可以提高負載平衡器、反向代理和應用服務器前端web服務的性能。

通過上面的例子,我們看到,緩存內容結果,可以更高效的使用應用服務器,因為不需要每次都去做重復的頁面生成工作。此外,Web緩存還可以用來提高網站可靠性。

當服務器宕機或者繁忙時,比起返回錯誤信息給用戶,不如通過配置nginx將已經緩存下來的內容發送給用戶。這意味著,網站在應用服務器或者數據庫故障的情況下,可以保持部分甚至全部的功能運轉。

如何安裝和配置基礎緩存

我們只需要兩個命令就可以啟用基礎緩存:proxy_cache_path和proxy_cache。proxy_cache_path用來設置緩存的路徑和配置,proxy_cache用來啟用緩存。

proxy_cache_path/path/to/cache?levels=1:2?keys_zone=my_cache:10m?max_size=10g?inactive=60m  use_temp_path=off;  server?{  ...  location?/?{  proxy_cachemy_cache;  proxy_pass?http://my_upstream;  }  }

1.用于緩存的本地磁盤目錄是/path/to/cache/

2.levels在/path/to/cache/設置了一個兩級層次結構的目錄。

將大量的文件放置在單個目錄中會導致文件訪問緩慢,所以針對大多數部署,我們推薦使用兩級目錄層次結構。如果levels參數沒有配置,則NGINX會將所有的文件放到同一個目錄中。

3.keys_zone設置一個共享內存區,該內存區用于存儲緩存鍵和元數據,有些類似計時器的用途。

將鍵的拷貝放入內存可以使NGINX在不檢索磁盤的情況下快速決定一個請求是`HIT`還是`MISS`,這樣大大提高了檢索速度。

一個1MB的內存空間可以存儲大約8000個key,那么上面配置的10MB內存空間可以存儲差不多80000個key。

4.max_size設置了緩存的上限(在上面的例子中是10G)。這是一個可選項;如果不指定具體值,那就是允許緩存不斷增長,占用所有可用的磁盤空間。

當緩存達到這個上線,處理器便調用cache manager來移除最近最少被使用的文件,這樣把緩存的空間降低至這個限制之下。

5.inactive指定了項目在不被訪問的情況下能夠在內存中保持的時間。在上面的例子中,如果一個文件在60分鐘之內沒有被請求,則緩存管理將會自動將其在內存中刪除,不管該文件是否過期。該參數默認值為10分鐘(10m)。

注意,非活動內容有別于過期內容。NGINX不會自動刪除由緩存控制頭部指定的過期內容(本例中Cache-Control:max-age=120)。

過期內容只有在inactive指定時間內沒有被訪問的情況下才會被刪除。

如果過期內容被訪問了,那么NGINX就會將其從原服務器上刷新,并更新對應的inactive計時器。

6.NGINX最初會將注定寫入緩存的文件先放入一個臨時存儲區域,use_temp_path=off命令指示NGINX將在緩存這些文件時將它們寫入同一個目錄下。

我們強烈建議你將參數設置為off來避免在文件系統中不必要的數據拷貝。use_temp_path在NGINX1.7版本和NGINX Plus R6中有所介紹。

最終,proxy_cache命令啟動緩存那些URL與location部分匹配的內容(本例中,為`/`)。你同樣可以將proxy_cache命令添加到server部分,這將會將緩存應用到所有的那些location中未指定自己的proxy_cache命令的服務中。

? 版權聲明
THE END
喜歡就支持一下吧
點贊12 分享