• UID12
  • 登录2016-06-14
  • 粉丝112
  • 关注50
  • 发帖1415
  • 主页
  • 金币8548枚
社区居民
最爱沙发
忠实会员
喜欢达人
原创写手
极分享 发布于2016-06-03 12:28
0/994

基于Nginx对巨型文件分片下载的解决方案

楼层直达

基于Nginx对巨型文件分片下载的解决方案

 

源码:https://github.com/Qihoo360/ngx_http_subrange_module

 

当Nginx作为文件下载服务的反向代理,用户请求一个非常大的文件的时候,它会一直占满反向代理服务器与后端主机之间的带宽。因为nginx一次获取整个文件,缓冲获取到的文件,导致客户端不能马上读取到。带宽使用和iowait会很高。

ngx_http_subrange_module就是为了解决这个问题,它能分割HTTP requests。将大数据量的HTTP请求切分为多个子请求,当下载一个1 G的文件,subrange将从后端主机中下载文件块,比如先获取5 M,然后再获取5 M,直到客户端下载完整个文件。

 

ngx_http_subrange_module

 

Split one big download file request to multiple subrange requests to avoid geting too much data from upstream at one time.

Install:

Configure nginx with --add-module=/path/to/ngx_http_subrange_module

Directive:

syntax : subrange size
default: subrange 0, 0 means disable
context: http, server, location

Example:

  location /{  
    root html;  
    subrange 10k;  
  }

Introduction:

When nginx is used as a reverse proxy for file downloading service, it will always run out of the bandwidth between nginx and upstream when the user requests a very large file. This is because nginx fetch a whole file at a time and buffer the left data that the client can not read in time. The bandwidth would be used up and the disk iowait would be high.

Nginx has an option to turn off the buffer mechanism, for example set proxy_buffering off or fastcgi_buffering off, which directive depends on the type of your upstream. However, this brings it with a problem. If your upstream is PHP or Java, it will block your PHP fastcgi process or yourJava threads, especially when the client is downloading a very large file and even worse he has a terrible speed.

The subrange module is created to solve this problem. It splits your HTTP requests. When you want to download an 1G file, the module will try to download a chunk of the file from the upstream, for example downloads 5M first, and then the next 5M, until the client receives the whole file. The whole process is non-sensible to client. You can set the chunk size in the nginx configuration file.

The module sets the HTTP Range header to perform a Range request to get a chunk from the upstream. So the supporting of Range request is needed by upstream. Supporting Range is easy, all standard HTTP servers like nginx/apache have implemented it. It is trivial to implement it yourself.

We just have one directive subrange which sets the size of chunk being fetched at a time. The directive takes a size as the parameter(1024 or 1k), or a variable as well. 0 meas disable subrange.

set $size 10m;
location /download{
    subrange $size;
}

0人打赏
您需要登录后才可以回帖
发表回复
极贡献
技术问答
专题荟萃
程序人生
视觉设计
Android开发
iOS开发
编程语言
前端开发
后端开发
服务器架构
软件测试
运维方案
创业路上



最热文章墙

  • 76999/375   【精品推荐】200多种Android动画效果的强悍框架,太全了,不看这个,再有动画的问题,不理你了^@^

  • 44075/191   情人节福利,程序员表白的正确姿势:改几行代码就变成自己的表白了

  • 43705/0   Python爬虫:常用浏览器的useragent

  • 40218/259   【精品推荐】Android版产品级的音乐播放器源码,功能太强大了,最好的产品原型有木有?

  • 37956/145   省时省力的Android组件群来了,非常棒的原型参考

  • 29218/142   2016抢红包软件及源码

  • 28975/2   超全!整理常用的iOS第三方资源

  • 28846/71   原创表白APP,以程序员的姿势备战新年后的7夕,持续完善中!

  • 23562/159   Android版类似UC浏览器:非常赞,产品级的源码

  • 22587/30   麻省理工的一帮疯子,真的实现了随意操控万物!(绝对黑科技)

  • 22270/25   Android工程师面试题大全

  • 22145/27   2016程序员跳槽全攻略

  • 21735/9   GitHub上排名前50的iOS项目:总有一款你用得着

  • 20701/20   码魂:程序员的牛B漫画

  • 18795/10   2016年最全的Android面试考题+答案 精编版

  • 18644/85   Android小而全的博客源码:非常适合全面掌握开发技巧

  • 18528/3   吐槽那些程序员的搞笑牛逼注释

  • 18517/42   一个绚丽的loading动效分析与实现!

  • 18504/73   【持续更新中】Android福利贴(二):资料源码大放送

  • 17453/1   iOS 动画总结

  • 17300/45   惊艳的App引导页:背景图片切换加各个页面动画效果

  • 17097/81   仿京东商城客户端Android最新版,不错的原型和学习资料

  • 16925/104   Android带弹幕的视频播放器源码,来自大名鼎鼎的Bilibili弹幕网站

  • 16838/23   个人收集的Android 各类功能源代码

  • 16324/5   新一代Android渠道打包工具:1000个渠道包只需要5秒

  • 16247/10   女程序员的梦,众网友的神回复

  • 16242/21   Android福利第三波【Android电子书】

  • 16109/53   基于瀑布流的美女图片浏览App,有注释的源代码

  • 16082/17   用JavaScript 来开发iOS和Android 原生应用:React Native开源框架中文版来啦

  • 16001/81   【精品推荐】类似360安全卫士安Android源码:非常赞的产品原型

  • 15938/11   年会上现场review代码是怎么样的体验!

  • 15744/23   珍藏多年的素材,灵感搜寻网站

  • 15742/0   iOS中文版资源库,非常全

  • 15048/18   65条最常用正则表达式,你要的都在这里了

  • 14573/15   基于Android支付宝支付设计和开发方案

  • 13999/17   什么是真正的黑客:收获12200+Stars,人气远超微软开源VS

  • 13968/11   有木有这样一张酷图帮你集齐所有git命令超实用

  • 13654/46   在线音乐播放器完整版(商用级的源码):非常赞,可听免费高品质专辑

  • 13480/0   GitHub iOS 库和框架Top100 

  • 13332/7   一张图搞定iOS学习路线,非常全面

  • 13325/7   用程序员的姿势抢过年的火车票

  • 13198/61   【技巧一】搭配Android Studio,如何实现App远程真机debug?

  • 12958/10   成为Java顶尖程序员 ,看这11本书就够了

  • 12875/10   微信支付终于成功了(安卓,iOS),在此分享

  • 12800/18   一张图搞定Android学习路线,非常全面

  • 12542/29   【持续更新中】Android福利贴(一):资料源码

  • 12475/3   基于Node.js的强大爬虫,能直接发布抓取的文章哦

  • 12185/4   46 个非常有用的 PHP 代码片段

  • 11740/3   即时通信第三方库

  • 11252/8   流媒体视频直播方案

  • 11170/18   八个最优秀的Android Studio插件

  • 11052/9   B站建开源工作组:APP想支持炫酷弹幕的看过来

  • 10882/9   烧了5亿美金,这家神秘的公司即将颠覆人类未来!

  • 10785/2   【精品推荐】高质量PHP代码的50个实用技巧:非常值得收藏

  • 10692/10   中国黑客的隐秘江湖:攻守对立,顶尖高手月入千万美元

  • 10056/6   开箱即用!Android四款系统架构工具

  • 9876/10   十大技巧快速提升Android应用开发性能

  • 9798/3   10款GitHub上最火爆的国产开源项目——可以媲美西半球

  • 9696/1   Android性能优化视频,文档以及工具

  • 9659/3   一张图看清Linux 内核运行原理

  • 返回顶部