前一阵子被一个需求困扰:附件的打包下载,需要将一批逻辑上一起的文件,让用户通过一个下载按钮打包下载。首先想到的方案是服务端调用什么
zip
之类的类库,将文件打包好后返回客户端。但是这样做有一个很明显的问题:文件很多很大的情况下,打包可能会占用大量的内存和cpu,就算在磁盘上构建临时的打包文件,也会增加服务器的磁盘IO负担,而且这些临时的文件无故占用大量的磁盘空间,删除还是个问题。用户体验也是问题,因为必须打包完成后,才能开始返回,无法边打包边下载。本来都准备放弃了,不过发现百度网盘好像实现了这个功能,于是再次考虑如何实现。想到我们实际上使用了Nginx作为文件服务器,会不会有第三方模块能够支持这种功能呢?寻觅之后果然有结果,就是本文要探讨的mod_zip。
mod_zip介绍
mod_zip
能够动态的构建zip包,这种动态体现在当Nginx作为反向代理服务器的时候,该模块能够根据上游服务器返回的文件列表来打包文件。mod_zip
实际上是利用Nginx的subreques
t功能,将zip流
发送到客户端的,而且它实际上只打包不压缩,所以借助Nginx本身作为文件服务器的能力,该模块的内存占用十分少,对于上G的大文件也没有问题。zip文件本身是结构化的,可以自定义目录结构,所以对于mod_zip
而言,要做的只是添加zip的头部尾部和zip内部的目录结构元数据而已,文件数据本身依靠Nginx自身的机制发送。
除此之外,还有如下两点:
- 由于使用
s