天天看點

反向代理or後端nginx 生産用于緩存視訊需要解決的問題

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函數生成

反向代理or後端nginx 生産用于緩存視訊需要解決的問題

當緩存代理轉發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将有可能導緻錯誤傳回

反向代理or後端nginx 生産用于緩存視訊需要解決的問題

解決方法如下:

修改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截圖:

反向代理or後端nginx 生産用于緩存視訊需要解決的問題

nginx log日志截圖:

反向代理or後端nginx 生産用于緩存視訊需要解決的問題

整個一套完備的緩存政策就介紹到此,這套方案中不僅實作了基本的緩存配置,還解決了實際場景應用中會遇到的,磁盤擴充,緩存清理,斷點續傳,緩存過期時間,緩存命中提示等問題,隻要将這套方案靈活運用,不管是再複雜的場景,基本都能滿足需求。以上都是我在工作中爬過的坑,不斷完善總結出的結果,希望對讀者能有幫助。

本文轉自 liqius 51CTO部落格,原文連結:http://blog.51cto.com/szgb17/1909584,如需轉載請自行聯系原作者

繼續閱讀