文章轉載地址:https://blog.csdn.net/wangjianno2/article/details/75201020/node
1、nginx緩存的原理及配置nginx
一、nginx的緩存簡介
算法
nginx的http_proxy模塊,能夠實現相似於squid的緩存功能。nginx對客戶已經訪問過的內容在nginx的服務器本地創建副本,這樣在一段時間內再次訪問該數據時,就不須要經過nginx服務器再次向後端服務器發出請求,因此能減小nginx服務器與後端服務器之間的網絡流量,減輕網絡擁塞,同時還能減小數據傳輸延遲,提升用戶訪問速度。同時,當後端服務器宕機時,nginx服務器上的副本資源還可以迴應相關的用戶請求,這樣可以提升後端服務器的魯棒性。後端
二、nginx cache的配置:
緩存
http{ proxy_cache_path /mnt/node1/cache levels=1:2 keys_zone=my_cache:5m max_size=10m inactive=120m use_temp_path=off;}服務器
server {cookie
set $upstream http://ip:port網絡
location / {ide
proxy_cache my_cache;性能
proxy_pass $upstream;
}
}
2.1配置說明以下:
proxy_cache_path:本地路徑,用來設置nginx緩存資源的存放路徑。
levels:默認全部緩存文件都放在同一個/mnt/node1/cache下,可是會影響緩存的性能,所以一般會在/mnt/node1/cache/ 目錄下創建子目錄用來分別存放不一樣的文件。假設levels=1:2,Nginx爲將要緩存的資源生成的 key爲f4cd0fbc769e94925ec5540b6a4136d0,那麼key的最後一位0,以及倒數第2-3位6d做爲兩級的子目錄,也就是該資源最終會被緩存到/mnt/node1/cache/0/6d目錄中。
keys_zone:在共享內存中設置一塊存儲區域來存放緩存的key和metadata(相似使用次數),這樣nginx能夠快速判斷一個request是否命中或者未命中緩存,1m能夠存儲8000個key,10m能夠存儲80000個key。
max_size:最大的cache空間,若是不指定,會使用掉全部的disk space,當達到配額後,會刪除最少使用的cache文件。
inactive:未被訪問文件在緩存中保留的時間。本設置中若是120分鐘未被訪問則不論狀態否是expired,緩存控制程序會刪掉文件。inactive默認是10分鐘。須要注意的是,inactive和expired配置項的含義是不一樣的, expired只是緩存過時,但不會被刪除,inactive是刪除指定時間內未被訪問的緩存文件
use_temp_path #若是爲off,則nginx會將緩存文件直接寫入指定的cache文件中,而不是使用temp_path存儲,official建議爲off,避免文件在不一樣文件系統中沒必要要的拷貝
proxy_cache #啓用proxy cache,並指定key_zone。另外,若是proxy_cache off表示關閉掉緩存。
三、緩存的一些其餘知識。
a、proxy_cache_use_stale 加強站點容錯能力
源站有問題時,nginx能夠經過proxy_cache_use_stale指令開啓容錯能力,即便用緩存內容來響應客戶端的請求,以下:
location / {
......
proxy_cache_use_stale error timeout http_500 http_502 http_503 http_504;
}
如上的配置表示,看成爲cache的nginx收到源站返回error、timeout或者其餘指定的5XX錯誤,而且在其緩存中有請求文件的陳舊版本,則會將這些陳舊的文件而不是錯誤信息發送給客戶端。
b、多磁盤分割緩存
使用nginx,不須要創建一個RAID(磁盤陣列)。若是有多個硬盤,nginx能夠用來在多個硬盤之間分割緩存,以下:
http { proxy_cache_path /cache/to/hdd1 levels=1:2 keys_zone=my_cache_hdd1:10m max_size=10g inactive=60m use_temp_path=off;
proxy_cache_path /cache/to/hdd2 levels=1:2 keys_zone=my_cache_hdd2:10m max_size=10g inactive=60m use_temp_path=off;
split_clients $request_uri $my_cache {
50% "my_cache_hdd1";
50% "my_cache_hdd2";
}
}
server {
...
location / {
proxy_cache $my_cache;
proxy_pass http://my_upstream;
}
}
例子中的兩個proxy_cache_path定義了兩個緩存分屬於兩個不一樣的磁盤。split_clients配置部分指定了請求結果的一半在hdb1,另外一半在hdb2中緩存,基於#request_uri(請求UEI)變量的哈希值決定了每個請求使用哪個緩存,對於指定URI請求結果一般會被緩存在同一個緩存中。
c、緩存命中狀況的nginx變量$upstream_cache_status
$upstream_cache_status的可能值有:
MISS —— 響應在緩存中找不到,因此須要在服務器中取得。這個響應以後可能會被緩存起來
BYPASS —— 響應來自原始服務器而不是緩存,由於請求匹配了一個proxy_cache_bypass,這個響應以後可能會被緩存起來
EXPIRED —— 緩存中的某一項過時了,來自原始服務器的響應包含最新的內容
STALE —— 內容陳舊是由於原始服務器不能正確響應。須要配置proxy_cache_use_stale
UPDATING —— 內容過時了,由於相對於以前的請求,響應的入口(entry)已經更新,而且proxy_cache_use_stale的updating已被設置
REVALIDATED —— proxy_cache_revalidate命令被啓用,NGINX檢測得知當前的緩存內容依然有效(If-Modified-Since或者If-None-Match)
HIT —— 響應包含來自緩存的最新有效的內容
d、http響應頭cache-control
當在響應頭部中cache-control被配置爲private、no-cache、no-store或者set-cookie,不容許代理對資源進行緩存。
e、nginx對緩存的資源會設置一個key,nginx生成的鍵的默認格式是相似於下面nginx變量的MD5哈希值:$scheme$proxy_host$request_uri,實際的算法比較複雜。爲了改變變量做爲基礎鍵,可使用proxy_cache_key命令。
proxy_cache_key $proxy_host$request_uri$cookie_jessionid;
f、緩存指令proxy_cache_valid
爲不一樣的HTTP返回狀態碼的資源設置不一樣的緩存時長。
命令格式爲:
proxy_cache_valid [code ...] time;
舉例以下:
proxy_cache_valid 200 302 10m; #爲響應碼是200和302的資源,設置緩存時長爲10分鐘
proxy_cache_valid 404 1m; #爲響應碼是404的資源,設置的緩存的時長爲1分鐘
g、緩存清理指令proxy_cache_purge
2、nginx的限制訪問次數
未完成。。。。。。