從整體來看,nginx的緩存cache總共有五種,接下來分別來介紹每一種緩存的機制以及各自的特色:css
1.傳統緩存之一html
該方法是將nginx的404錯誤頁面定位到後端,而後在使用poxy_store將後端返回的頁面進行保存。java
location/{nginx
root/home/html;#主目錄web
expires 1d;#網頁的過時時間shell
error_page 404=200/fetch$request_uri;#404界面定向到fetch目錄下數據庫
}後端
location /fetch{#404界面定向到該路徑下緩存
internal;#指明該目錄下不能再外部直接訪問服務器
expires:1d :#網頁訪問過時時間
alias/home/html;#虛擬目錄文件系統要和location /同樣,proxy_store會將文件保存到這個目錄下面
proxy_pass:http://javaDevelopment.com;#後端upstream地址,/fetch同時是一個代理
proxy_set_header Accept-Encoding'';#爲了使得後端不要返回壓縮的內容
proxy_store on ;#指定nginx代理返回的文件保存
proxy_temp_path /home/tmp;#臨時目錄,該目錄必定要和/home/html放到同一磁盤分區中
}
使用的時候還要確保nginx要有權限在/home/tmp和/home/html下面有寫入文件的權限,直接使用chmod 777進行受權便可。
2.傳統緩存之二
原理同上,可是使用更簡潔一些,以下:
location /{
root/home/html;
proxy_store on;
proxy_set_header Accept-Encoding'';
poxy_temp /home/tmp;
if(!-f $request_filename)
{
proxy_pass http://javaDevelopMent.com;
}
}
該配置屬性代碼比較少,使用!-f來判斷請求的文件系統上存不存在,若是不存在就使用proxy_pass到後端去,一樣返回的是proxy_store保存。
該兩種方式有着一樣的優缺點:
缺點1:不支持帶參數的動態連接,同時也不支持一級目錄和二級目錄同時緩存,nginx會把二級目錄認爲跟一級目錄是同一個連接,因此會保存失敗,在這種狀況下都須要寫rewrite才能正確保存。
缺點2:nginx內部沒有緩存過時和任何清理的任何機制,這些緩存的文件將永遠的保存在服務器上。若是不及時的清理,必定程度上硬盤中將沒法存儲多的文件,須要寫shell腳本進行定時的清理。
缺點3:nginx服務器上智能緩存status爲200的,後端返回的301,302,404狀態的都不會緩存。
缺點4:nginx不會自動選擇內存或硬盤做爲存儲介質,一切有配置決定。
3.基於memcached
nginx對memcached也會支持
location /mem/{
if ($uri~"^/mem/([0-9A-Za-z_]*$)"){
set $memcached_key "$1";
memcached_pass 192.168.9.12:11211
}
expires 120;
}
該配置會將http://javaDevelopMent.com/mem/java指明到memcached的java這個key去取數據
nginx目前沒有寫入memcached的任何機制,所以要往memcached中寫入數據須要用動態語言來完成,可使用404定向到後端寫入數據中。
4.基於第三方插件ncache
ncache是基於web服務器模型構建起來的緩存系統,屬於sina公司的開源產品。
起初的目的是爲了提高緩存響應速度而開發的,而squid(磁盤緩存)的速度比較慢,ncache的優點就在於此。
ncache最先的時候是做爲nginx的一個HTTP模塊進行開發的,由於考慮到其以後的兼容性和可擴展性,做爲更好的獨立模塊,能夠普遍的推廣和使用。但後來隨着功能的擴充,代碼的增多,nginx原有的框架異能不能知足開發中的需求,所以採用提取nginx內部核心代碼,並把cache部分嵌入其中,就造成了今天的ncache。
ncache徹底是一套定製化的產品,能夠知足快速部署、簡單易用,高併發、大存儲量的需求,它不須要複雜的配置。
直接安裝便可。
運行ncache的命令
/usr/local/webserver/nacahe/sbin/nginx
中止nacahe命令
killall -9 nginx
查看ncache狀態
curl "http://127.0.0.1/ncache_state"
ncache後端內容服務器設置
(1)必須使用Http Head頭「Cache-Controll:max-age=秒數」來控制緩存時間,若是不指定將不緩存。
(2)後端內容源服務器發送ncache的Http數據,必須帶有「Content-Length」Header頭部。
(3)ncache的緩存時間以分鐘爲單位,會將全部max-age=秒數轉換成分鐘數,若是max-age小於1分鐘,ncache將默認將緩存時間設置成1分鐘。
(4)自動刪除緩存文件進程,會在天天的凌晨兩點刪除大約20%的不活動緩存數據。
ncache能夠對數據進行快速和線性可擴展的分佈式緩存,減小對數據庫的訪問。ncache能夠幫助消除數據庫的性能瓶頸,擴展java應用程序的事務處理極限。
ncache2.0版本,是做爲一個完整的nginx模塊進行發佈和使用的,在原有的內核上進行了剝離,更方便開發者的安裝和配置。
5.proxy_cache功能(新功能)
從nginx-0.7.44版本開始,nginx支持相似squid較爲正規的cache功能,目前還處於開發階段,這個緩存是把連接用MD5編碼hash後保存,所以支持任意連接,也支持404/301/302非正常狀態。
首先配置一個cache空間
proxy_cache_path /javaDevelopMent.com/to cache
levels=1:2 keys_zone=java1:10M inactive=5m max_size=2M celan_time=1m;
proxy_temp_path參數路勁也要跟proxy_cache_path在一個分區上
以上配置參數說明;
levels:指定該緩存空間有兩層hash目錄,第一層爲1個字母,第二層爲2個字母;
keys_zone:爲空間起名字 10M指空間大小
inactive=5m指默認緩存時間5分鐘
max_size=2M文件最大超過2M就不緩存
celan_time=1m指定一分鐘清理一次
綜合起來以下:
location ~.*\.(js|css|gif|jpg|jpeg|png|bmp|swf|flv)$
{
proxy_pass :http://backend;
expires 6h;
proxy_cache java1;//使用java1這個keys_zone
proxy_cache_vaild 200 302 1h;
proxy_cache_vaild 301 1d;
proxy_cache_vaild any 1m;
}
注:支持緩存的cache0.7.44和0.7.51之間的這個版本穩定性均有問題,這幾個版本不建議在生產環境中使用,0.7.39位目前最穩定的版本,建議使用。