通过Apache提供动态zip文件

时间:2011-01-17 13:18:59

标签: apache zip streaming

我的Rails应用程序的职责之一是创建和提供签名的xmls。任何签名的xml一旦创建,就永远不会改变。因此,我将每个xml存储在public文件夹中,并相应地重定向客户端,以避免从控制器进行不必要的处理。

现在我需要一个新功能:每个xml都与一个日期相关联,我想实现提供包含每个xml的压缩文件的能力,该xml的日期位于客户端指定的时间段内。尽管如此,该功能的使用时间不能少于一个月,这意味着一些服务的zip文件将大到50M。

我的应用程序部署为Apache的Passenger模块。因此,使用send_data提供文件是完全不可接受的,因为客户端必须等待在实际下载开始之前生成整个压缩文件。虽然我知道如何在Rails中实现该功能,所以压缩文件是在服务时生成的,我觉得一旦分配了一些冗长的Ruby / Passenger进程,我的服务器就会变得稀缺资源大拉链文件。

我已经阅读了a better solution来通过Apache提供静态文件,但不是动态文件。

那么,问题的解决方案是什么?我需要像自定义Apache处理程序那样的东西吗?如何从我的应用程序通知Apache如何处理请求,压缩文件和同时传输结果?

4 个答案:

答案 0 :(得分:3)

查看我的mod_zip模块中的Nginx:

http://wiki.nginx.org/NgxZip

您可以让后端脚本告诉Nginx将哪些URL位置包含在存档中,Nginx会将ZIP文件动态流式传输到包含这些文件的客户端。该模块利用Nginx的单线程代理代码,非常轻量级。

该模块于2008年首次发布,目前相当成熟。根据您的描述,我认为它将满足您的需求。

答案 1 :(得分:0)

您只需使用您可用的任何API来创建zip文件并将其写入响应,定期刷新输出。如果这是服务大型zip文件,或者将经常请求,请考虑在具有高nice / ionice值/低优先级的单独进程中运行它。

最糟糕的情况是,您可以在低优先级进程中运行命令行zip并定期传递输出。

答案 2 :(得分:0)

答案 3 :(得分:0)

做起来很棘手,但是我制作了一个名为zipline(http://github.com/fringd/zipline)的宝石,它让我感觉很舒服。我想更新它,以便它可以支持普通文件句柄或路径,现在它假设你正在使用carrierwave ......

另外,你可能无法通过乘客流式传输响应......我不得不使用独角兽使流式传输正常工作......某些机架中间件甚至可以搞砸了(调用response.to_s打破它)

如果有人仍然需要在github页面上打扰我