2016年11月14日 星期一

電腦 nginx的http_slice_module功能


確認nginx 是否有包含aio功能
nginx -v
是否有 --with-http_slice_module
如果沒有,需重新編譯

設定nginx.conf
vi /etc/nginx/nginx.conf

    proxy_cache_path /tmp/nginx/cache levels=1:2 keys_zone=cache:100m;
 
        location / {
            slice 1m;
            proxy_cache cache;
            proxy_cache_key $uri$is_args$args$slice_range;
            proxy_set_header Range $slice_range;
            proxy_cache_valid 200 206 1h;
            #proxy_set_header Range $http_range;
            proxy_pass http://127.0.0.1:8080;

        }


嚐鮮:Nginx-1.9.8推出的切片模塊
首先,如果不帶Range 請求,後端大文件在本地cache 時,會按照配置的slice 大小進行切片存儲。

其次,如果帶Range 請求,則Nginx 會用合適的Range 大小(以slice 為邊界)去後端請求,這個大小跟客戶端請求的Range 可能不一樣,並將以slice 為大小的切片存儲到本地,並以正確的206響應客戶端。

注意上面所說的,Nginx 到後端的Range 並不一定等於客戶端請求的Range,因為無論你請求的Range 如何,Nginx 到後端總是以slice 大小為邊界,將客戶端請求分割成若干個子請求到後端,假設配置的slice 大小為1M,即1024字節,那麼如果客戶端請求Range 為0-1023範圍以內任何數字,均會落到第一個切片上,如果請求的Range 橫跨了幾個slice 大小,則nginx會向後端發起多個子請求,將這幾個slice 緩存下來。而對客戶端,均以客戶端請求的Range 為準。如果一個請求中,有一部分文件之前沒有緩存下來,則Nginx 只會去向後端請求缺失的那些切片。

由於這個模塊是建立在子請求的基礎上,會有這麼一個潛在問題:當文件很大或者slice 很小的時候,會按照slice 大小分成很多個子請求,而這些個子請求並不會馬上釋放自己的資源,可能會導致文件描述符耗盡等情況。

需要注意的點:

1.該模塊用在proxy_cache 大文件的場景,將大文件切片緩存
2.編譯時對configure 加上--with-http_slice_module 參數
3.$slice_range 一定要加到proxy_cache_key 中,並使用proxy_set_header 將其作為Range 頭傳遞給後端
4.要根據文件大小合理設置slice 大小

Nginx:作為緩存,支持Range回源

沒有留言:

張貼留言

注意:只有此網誌的成員可以留言。