1. 程式人生 > >Nginx快取原理及配置

Nginx快取原理及配置

1.Nginx的快取簡介nginx的http_proxy模組,可以實現類似於Squid的快取功能。Nginx對客戶已經訪問過的內容在Nginx伺服器本地建立副本,這樣在一段時間內再次訪問該資料,就不需要通過Nginx伺服器再次向後端伺服器發出請求,所以能夠減少Nginx伺服器與後端伺服器之間的網路流量,減輕網路擁塞,同時還能減小資料傳輸延遲,提高使用者訪問速度。同時,當後端伺服器宕機時,Nginx伺服器上的副本資源還能夠迴應相關的使用者請求,這樣能夠提高後端伺服器的魯棒性。2.nginx 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 {
     set $upstream http://ip:port
          location / {
                   proxy_cache my_cache;
                   proxy_pass $upstream;
                }
}
配置項說明如下:
/path/to/cache  #本地路徑,用來設定Nginx快取資源的存放地址
levels          #預設所有快取檔案都放在同一個/path/to/cache下,但是會影響快取的效能,因此通常會在/path/to/cache下面建立子目錄用來分別存放不同的檔案。假設levels=1:2,Nginx為將要快取的資源生成的key為f4cd0fbc769e94925ec5540b6a4136d0,那麼key的最後一位0,以及倒數第2-3位6d作為兩級的子目錄,也就是該資源最終會被快取到/path/to/cache/0/6d目錄中
key_zone        #在共享記憶體中設定一塊儲存區域來存放快取的key和metadata(類似使用次數),這樣nginx可以快速判斷一個request是否命中或者未命中快取,1m可以儲存8000個key,10m可以儲存80000個key
max_size        #最大cache空間,如果不指定,會使用掉所有disk space,當達到配額後,會刪除最少使用的cache檔案
inactive        #未被訪問檔案在快取中保留時間,本配置中如果60分鐘未被訪問則不論狀態是否為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表示關閉掉快取。

3.nginx快取的一些其他知識(1)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錯誤,並且在其快取中有請求檔案的陳舊版本,則會將這些陳舊版本的檔案而不是錯誤資訊傳送給客戶端。(2)多磁碟分割快取使用NGINX,不需要建立一個RAID(磁碟陣列)。如果有多個硬碟,NGINX可以用來在多個硬碟之間分割快取。舉個栗子:
proxy_cache_path /path/to/hdd1 levels=1:2 keys_zone=my_cache_hdd1:10m max_size=10g inactive=60m use_temp_path=off;
proxy_cache_path /path/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定義了兩個快取(my_cache_hdd1和my_cache_hd22)分屬兩個不同的硬碟。split_clients配置部分指定了請求結果的一半在my_cache_hdd1中快取,另一半在my_cache_hdd2中快取。基於$request_uri(請求URI)變數的雜湊值決定了每一個請求使用哪一個快取,對於指定URI的請求結果通常會被快取在同一個快取中。(3)快取命中情況的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 —— 響應包含來自快取的最新有效的內容
(4)http響應頭Cache-Control當在響應頭部中Cache-Control被配置為Private,No-Cache,No-Store或者Set-Cookie,不允許代理對資源進行快取。(5)nginx對快取的資源會設定一個key,NGINX生成的鍵的預設格式是類似於下面的NGINX變數的MD5雜湊值:$scheme$proxy_host$request_uri,實際的演算法有些複雜。 為了改變變數(或其他項)作為基礎鍵,可以使用proxy_cache_key命令。例如,
proxy_cache_key $proxy_host$request_uri$cookie_jessionid;
(6)快取指令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分鐘
(7)快取清理指令proxy_cache_purge

4.Nginx做cache快取機制問題