【nginx】大文件下载

摘要:
nginx自带文件读取功能,而且实现地很好。但是对于很大的文件,比如有2个G的视频,nginx如何吐出2G的内容呢?chrome会保存这个量,下次使用这个偏移量作为起始点,nginx会从该偏移量开始取数据,而不是从头开始。再看一下最后一次请求的header信息:request的header是:Range:bytes=416186368-response的header是:Content-Range:bytes/2191722878结论:现代浏览器都已经内置了对于大文件的默认处理,nginx等WebServer都必须支持文件按Range获取内容。

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页

【nginx】大文件下载第1张

可以看到有6个请求,第一个请求的状态码是200,剩余请求的状态码都是206(partial content-部分内容)。

可以看到chrome非常贴心地用内置的视频解码工具来播放MP4文件,非常有用的是暂停按钮(如果开始播放后不暂停,nginx会不断地给chrome吐数据,这个过程不会中断,暂停按钮会中断此次通信,断开connection,此时nginx才会写入access log)。

可以看到这个交互过程是:

1,chrome发起新的请求,nginx吐数据;

2,点暂停,chrome断开nginx连接;

3,再点开始,chrome重新连接到nginx,nginx吐数据一直到再次点暂停;

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

第一次请求:

【nginx】大文件下载第2张

第二次请求:

【nginx】大文件下载第3张

可以看到第一次获取了内容的基本信息(文件类型,文件长度)

第二次请求获取了真正的数据内容(Range:bytes=0-125534207),具体能获取到多少Bytes的内容,是动态计算的,以connection的四次握手结束后计算得来的。

chrome会保存这个量(已经下载的Bytes),下次使用这个偏移量作为起始点,nginx会从该偏移量开始取数据,而不是从头开始。这个地方如果文件内容有变化,会返回200,从0开始取数据;如果内容没变化,会返回206,表示取的还是原来的文件。

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

【nginx】大文件下载第4张

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

response的header是:Content-Range:bytes (416186368-2191722877)/2191722878(分别表示请求偏移量,文件尾的index-从0开始的,总的文件大小)

结论:现代浏览器都已经内置了对于大文件的默认处理(会自动记录已下载文件的数据量),nginx等WebServer都必须支持文件按Range获取内容。

header中的Range,和Content-Range是静态的(从请求开始就知道),但是请求数据量是动态的,从connection开始到结束统计得来。

免责声明:文章转载自《【nginx】大文件下载》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇shell取余数mysql 解决全角半角 问题下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Nginx 用最快方式让缓存失效

103 一般让及时缓存失效针对nginx官方是收费的 我们可以用第三方模块 https://github.com/FRiCKLE/ngx_cache_purge proxy_cache_path /data/nginx/tmpcache levels=2:2 keys_zone=two:10m loader_threshold=300...

java文件断点续传的简单实现

一、概述   所谓断点续传,其实只是指下载,也就是要从文件已经下载的地方开始继续下载。在以前版本的HTTP协议是不支持断点的,HTTP/1.1开始就支持了。一般断点下载时才用到Range和Content-Range实体头。HTTP协议本身不支持断点上传,需要自己实现。   二、Range    用于请求头中,指定第一个字节的位置和最后一个字节的位置,一般格...

前端访问服务器

本地部署前端访问服务器    PS:本系列内容进度节奏会放的很慢,每次知识点都尽量少一点,这样大家接触的知识点少了,会更容易理解,因为少即是多。另外,对于后面代码部分,虽然尽量不用那些复杂的封装和类,但它并不表示看了就能全部记住,并懂得每个函数的用法,在什么时候去调用,清楚它输入的参数类型、能处理的参数类型和输出的结果是什么。它需要动手去调用,去大量的...

nginx+tomcat做负载均衡,当某个tomcat宕机,会发生什么情况,如何解决?

使用两台Tomcat,一台nginx做了一个小实验:   步骤一:     当两台tomcat正常运行的情况下,访问http://localhost的速度是很很迅速的,通过修改主页内容也可以观察到是通过负载均衡得到的效果。   步骤二:     实验性的将其中一台tomcat服务器关掉(将8080端口的关闭),再查看http://localhost ,会发...

python__007内置函数

本文摘自:https://docs.python.org/3/library/functions.html?highlight=built#ascii            内置功能     abs() delattr() hash() memoryview() set() all() dict() help() min() s...

使用Google浏览器做真机页面调试

步骤1: 从Windows,Mac或Linux计算机远程调试Android设备上的实时内容。本教程将教您如何: 设置您的Android设备进行远程调试,并从开发机器中发现它。从您的开发机器检查和调试Android设备上的实时内容。将来自Android设备的内容屏幕截图到开发机器上的DevTools实例。 要求 Chrome 32或更高版本安装在您的开发机...