nginx proxy_cache 生産上需要解決的問題
http://blog.csdn.net/dengjiexian123/article/details/53386586
提出疑問:
到此,就完成了最基本的proxy_cache配置和通路過程介紹,但是最基本的配置,往往無法滿足我們的業務需求,我們往往會提出以下幾點疑問和需求:
需要主動清理緩存檔案
寫入路徑為一塊磁盤,如果磁盤打滿該怎麼解決?
如何讓源站支援斷點續傳,以及斷點續傳的緩存政策
如果請求端 range 請求(分片下載下傳)一個大資源,同樣的uri,如何差別請求?
還需要告訴請求端,資源的過期時間
日志統計,如何配置命中與不命中字段,如何做統計?
問題一:主動清理緩存
采用:nginx proxy_cache_purge 子產品 ,該子產品與proxy_cache成對出現,功能正好相反。
設計方法:在nginx中,另啟一個server,當需要清理響應資源的緩存時,在本機通路這個server。
例如:
通路 127.0.0.1:8083/tmp-test/TL39ef7ea6d8e8d48e87a30c43b8f75e30.txt 即可清理該資源的緩存檔案。
由于寫入路徑為一個單一目錄,隻能寫入一塊磁盤。一塊磁盤很快就會被打滿,解決該問題有如下兩種方法:
1、将多塊磁盤做磁盤陣列? 缺點是:減小了實際的存儲空間。
2、巧妙得運用proxy_cache_path的目錄結構,由于levels=1:2,這導緻緩存檔案的目錄結構為兩層,每層目錄名,都是由hash函數生成

當緩存代理轉發http請求到後端伺服器時,http header會改變,header中的部分參數,會被取消掉。其中range參數被取消,導緻,後端nginx伺服器沒有收到range參數,最終導緻這個分片下載下傳不成功。是以需要對代理轉發的header進行配置。
location /tmp-test/ {
proxy_cache tmp-test;
proxy_cache_valid 200 206 304 301 302 10d;
proxy_cache_key $uri;
proxy_set_header Range $http_range;
proxy_pass http://127.0.0.1:8081/media_store.php/tmp-test/;
}
紅色部分的含義:将http請求中的range值($http_range)放到代理轉發的http請求頭中作為參數range的值。
如果請求端 Range請求(分片下載下傳)一個大資源,同樣的uri,proxy cache如何識别資源對應的key。
由于nginx配置為:proxy_cache_key $uri,用uri作為key
是以當請求為普通請求和range請求時,都是同樣的uri作為key。proxy_cache将有可能導緻錯誤傳回
解決方法如下:
修改proxy_cache_key ,配置proxy_cache_key $http_range$uri;
這樣就能解決:key唯一性。可以避免不管是正常請求還是不同的range請求,第一次擷取的内容和之後擷取的緩存内容都不會出現異常
需要通過傳回過期時間來指定請求端,哪些資源需要緩存,哪些資源不緩存,
參數
正常請求
range請求
傳回過期時間
傳回
不傳回
為了防止請求端将分片資源當做完整資源緩存起來,我們需要對正常請求,傳回過期時間;對range請求, 不傳回過期時間。
解決該問題,通過對nginx配置即可解決:
location /media_store.php {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index media_store.php;
fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
include fastcgi_params;
if ( $http_range = ''){
expires 2592000s;
}
在proxy_pass代理之後的location中加入對$http_range的判斷,expires 表示過期時間。 2592000s指緩存過期時間。
解決方法:
利用nginx $upstream_cache_status變量:該變量代表緩存命中的狀态,
如果命中,為HIT;如果未命中,為MISS
在傳回nginx server配置中添加:
add_header Nginx-Cache "$upstream_cache_status";
在nginxlog中添加:
log_format combinedio …$upstream_cache_status;
http傳回head截圖:
nginx log日志截圖:
整個一套完備的緩存政策就介紹到此,這套方案中不僅實作了基本的緩存配置,還解決了實際場景應用中會遇到的,磁盤擴充,緩存清理,斷點續傳,緩存過期時間,緩存命中提示等問題,隻要将這套方案靈活運用,不管是再複雜的場景,基本都能滿足需求。以上都是我在工作中爬過的坑,不斷完善總結出的結果,希望對讀者能有幫助。
本文轉自 liqius 51CTO部落格,原文連結:http://blog.51cto.com/szgb17/1909584,如需轉載請自行聯系原作者