【nginx】大文件下載


nginx自帶文件讀取功能,而且實現地很好。

比如直接讀取txt文件,png圖片等,用chrome可以直接獲取到內容。

但是對於很大的文件,比如有2個G的視頻,nginx如何吐出2G的內容呢?

實驗:

准備很大的MP4文件(比如2G),nginx搭建好webserver,nginx開啟access_log選項(log中要包含下載文件大小,http code,請求時間)

實驗步驟:

1,用chrome訪問nginx搭建網站的MP4,我自己的是:http://lww.diff.com/data/1.mp4

2,打開chrome的控制面板,切換到network tab頁

可以看到有6個請求,第一個請求的狀態碼是200,剩余請求的狀態碼都是206(partial content-部分內容)。

可以看到chrome非常貼心地用內置的視頻解碼工具來播放MP4文件,非常有用的是暫停按鈕(如果開始播放后不暫停,nginx會不斷地給chrome吐數據,這個過程不會中斷,暫停按鈕會中斷此次通信,斷開connection,此時nginx才會寫入access log)。

可以看到這個交互過程是:

1,chrome發起新的請求,nginx吐數據;

2,點暫停,chrome斷開nginx連接;

3,再點開始,chrome重新連接到nginx,nginx吐數據一直到再次點暫停;

 

 

那么第一次,和第二次請求有什么不同?

第一次請求:

 第二次請求:

可以看到第一次獲取了內容的基本信息(文件類型,文件長度)

第二次請求獲取了真正的數據內容(Range:bytes=0-125534207),具體能獲取到多少Bytes的內容,是動態計算的,以connection的四次握手結束后計算得來的。

chrome會保存這個量(已經下載的Bytes),下次使用這個偏移量作為起始點,nginx會從該偏移量開始取數據,而不是從頭開始。這個地方如果文件內容有變化,會返回200,從0開始取數據;如果內容沒變化,會返回206,表示取的還是原來的文件。

再看一下最后一次請求的header信息:

request的header是:Range: bytes=416186368- (這個表示偏移量是400M)

response的header是:Content-Range:bytes (416186368-2191722877)/2191722878(分別表示請求偏移量,文件尾的index-從0開始的,總的文件大小)

結論:現代瀏覽器都已經內置了對於大文件的默認處理(會自動記錄已下載文件的數據量),nginx等WebServer都必須支持文件按Range獲取內容。

header中的Range,和Content-Range是靜態的(從請求開始就知道),但是請求數據量是動態的,從connection開始到結束統計得來。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM