利用Nginx第三方模块,实现网站中的打包下载
2014-12-04 10:58
651 查看
附件的打包下载,需要将一批逻辑上一起的文件,让用户通过一个下载按钮打包下载。首先想到的方案是服务端调用什么
除此之外,还有如下两点:
由于使用
在添加crc校验后,
下载源码:
重新编译Nginx,不要make install:
将生成的二进制文件覆盖现有的二进制文件。通常编译出来的二进制文件位于源码目录的
该模块不需要在nginx.conf中配置任何东西,一切的行为取决于上游服务器的响应内容。
同时,响应的body中需要包含一个欲打包的文件的列表,如:
每一行表示一个文件描述,行与行之间有一个换行符(最后也有个换行)。每行从左向右以空格分隔,依次是文件的crc-32校验,文件大小(Byte),文件的uri,文件名。其中crc-32可以忽略,并用-代替,文件名可以包含目录,会体现在最后的压缩包中的目录结构中。
重点是文件的uri怎么理解。这里的
于是,可以这样使用文件uri:
这样两个文件分别会向远程服务器请求文件:
上游服务器可以通过在头部注入
下面是个测试用的上游服务器例子
zip之类的类库,将文件打包好后返回客户端。但是这样做有一个很明显的问题:文件很多很大的情况下,打包可能会占用大量的内存和cpu,就算在磁盘上构建临时的打包文件,也会增加服务器的磁盘IO负担,而且这些临时的文件无故占用大量的磁盘空间,删除还是个问题。用户体验也是问题,因为必须打包完成后,才能开始返回,无法边打包边下载。本来都准备放弃了,不过发现百度网盘好像实现了这个功能,于是再次考虑如何实现。想到我们实际上使用了Nginx作为文件服务器,会不会有第三方模块能够支持这种功能呢?寻觅之后果然有结果,就是本文要探讨的mod_zip。
mod_zip介绍
mod_zip能够动态的构建zip包,这种动态体现在当Nginx作为反向代理服务器的时候,该模块能够根据上游服务器返回的文件列表来打包文件。
mod_zip实际上是利用Nginx的
subrequest功能,将
zip流发送到客户端的,而且它实际上只打包不压缩,所以借助Nginx本身作为文件服务器的能力,该模块的内存占用十分少,对于上G的大文件也没有问题。zip文件本身是结构化的,可以自定义目录结构,所以对于
mod_zip而言,要做的只是添加zip的头部尾部和zip内部的目录结构元数据而已,文件数据本身依靠Nginx自身的机制发送。
除此之外,还有如下两点:
由于使用
subrequest机制,文件甚至可以不在Nginx的服务器本身,可以是上游服务器,甚至是互联网的远程服务器上
在添加crc校验后,
mod_zip还能够支持HTTP的Range,支持断点续传
基本使用
安装
下载源码:12 | $ git clone <a href="https://github.com/evanmiller/mod_zip.git" target="_blank" rel="nofollow">https://github.com/evanmiller/mod_zip.git</a> |
1 2 3 | $ ./configure --add-module=/src/mod_zip $ make |
objs/nginx。更多关于如何添加第三方模块看如何安装nginx第三方模块
使用方法
该模块不需要在nginx.conf中配置任何东西,一切的行为取决于上游服务器的响应内容。mod_zip规定当响应头中包含
X-Archive-Files的时候,将启用mod_zip的功能:
12 | X-Archive-Files: zip |
1 2 3 | 1034ab38 428 /foo.txt My Document1.txt 83e8110b 100339 /bar.txt My Other Document1.txt |
重点是文件的uri怎么理解。这里的
/foo.txt和
/bar.txt并非指向文件系统的路径,而是一个子请求的地址。比如上面的
/foo.txt实际上会产生一个Nginx自身的请求:
http://host/foo.txt,至于这个请求得到什么又要根据
nginx.conf中的配置决定了。这样的设计十分灵活,例如下面的配置:
1234 | location ~ "^/(?<srv>server[12])/(?<file>.*txt)" { proxy_pass <a href="http://%24srv.domain.com/$file" target="_blank" rel="nofollow">http://$srv.domain.com/$file</a>} |
1 2 3 | 1034ab38 428 /server1/foo.txt My Document1.txt 83e8110b 100339 /server2/bar.txt My Other Document1.txt |
123 | <a href="http://server1.domain.com/foo.txt" target="_blank" rel="nofollow">http://server1.domain.com/foo.txt</a><a href="http://server2.domain.com/bar.txt" target="_blank" rel="nofollow">http://server2.domain.com/bar.txt</a> |
Content-Disposition来控制zip文件的输出文件名
1 2 | Content-Disposition: attachment; filename=foobar.zip |
上游服务器示例
下面是个测试用的上游服务器例子1 2 3 4 5 6 7 8 9 10 11 12 | <?php header('X-Accel-Chareset: utf-8'); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename=test.zip'); header('X-Archive-Files: zip'); $crc32 = "-"; printf("%s %d %s %s\n", $crc32, 66382593, '/video/raw/1dc3b670-f864-4050-9772-8ccff341d091.mp4', '1.mp4'); printf("%s %d %s %s\n", $crc32, 26160723, '/video/raw/4d6bf6ba-5b8a-49be-bede-481fe49093dc.mp4', '2.mp4'); ?> 转自:http://park.sinastorage.com/discussion/12/%E5%88%A9 |
相关文章推荐
- 利用Nginx第三方模块,实现附件打包下载
- nginx 的第三方模块ngx_http_accesskey_module 来实现下载文件的防盗链步骤(linux系统下)
- asp.net 利用winrar 实现服务器打包下载
- NGINX参考网站,很酷的第三方模块【备忘】
- https研究(五)利用从sslforfree网站下载的证书,实现https
- python自学笔记(8)--Python简单爬虫从网站上下载图片和用第三方库request实现百度翻译
- 利用Nginx的上传模块和上传进度模块实现网页上传文件
- nginx利用第三方模块nginx_upstream_check_module来检查后端服务器的健康情况
- nginx利用geo模块做限速白名单以及geo实现全局负载均衡的操作记录
- Nginx Http认证 实现访问网站或目录密码认证保护 | 使用 HttpAuthBasicModule 模块
- 利用第三方开源框架 PullToRefreshListView 实现下拉刷新(从网上下载图片)
- 如何简单的利用nginx实现多个网站的发布
- nginx利用第三方模块nginx_upstream_check_module来检查后端服务器的健康情况
- 利用Nginx的X-Accel-Redirect头实现下载控制(附带php和rails实例)
- nginx利用第三方模块nginx_upstream_check_module来检查后端服务器的健康情况
- 利用Nginx的上传模块和上传进度模块实现网页上传文件
- Docker的安装和镜像管理并利用Docker容器实现nginx的负载均衡、动静分离 Docker的安装 一、Docker的概念 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用
- nginx利用第三方模块nginx_upstream_check_module来检查后端服务器的健康情况
- 利用python实现 各大片 视频网站 视频下载
- nginx利用第三方模块nginx_upstream_check_module来检查后端服务器的健康情况