从归档文件中提供静态文件

9

是否有适用于apache/nginx的模块,可以从存档文件(zip,tgz,tbz等)中提供静态文件,以便在指定位置没有文件时,请求该文件所在的存档文件?

5个回答

3
我不知道有这样的模块。
如果你要编写自己的模块,我建议你看一下 http://wiki.nginx.org/HttpCoreModule#try_files 上的 try_files 指令,并将请求参数传递给一个脚本,例如 php 文件(请参见 wiki 页面上以以下内容结尾的 try_files 行:/index.php?q=$uri&$args;)。
性能: 通过这种方式,你可以使用 php 进行一些安全检查、筛选出搜索引擎机器人,甚至在解压后将一些文件存入 memcache。但这取决于你的具体请求统计/模式。
一些工具或 pear 包可能允许你提取文件到管道(stdout),避免将其倾倒到文件系统中,或者解压可以在 ramdisk 中发生以加快速度。但是,选择哪种方法取决于你的文件大小,以确保可靠性。

2
对于.tgz和.tbz的情况,大多数性能损失(尤其是对于大型存档文件)应该来自于您必须从磁盘读取并解压缩所有数据,直到包括您要求的文件为止。如果您请求存档中的最后一个文件,则无论是CGI脚本还是Web服务器,都需要花费时间来读取、解压缩并且舍弃所有归档数据,以获取您的文件。
Zip格式确实允许随机访问。如果您的CGI脚本非常简单(可以是一个sh脚本),并且基本上只是使用正确的参数调用“unzip”,那么从有服务器模块执行这项任务中获得的加速量将相当小。
话虽如此,如果没有用于执行此操作的模块,那就有点荒谬了(但是,是的,我还没有找到这样的模块)。

我使用zip脚本,因为我知道压缩的tar档案的随机访问速度很慢。 - tig

1

另一种可能性是使用压缩文件系统,具体取决于文件类型和分布,还可以进行去重。

优点:

-在存储方面几乎与.zip文件相同

-Web服务器部分无需更改

缺点:

-可能需要新的zip DIR文件系统

-可能在未使用的操作系统下不存在(例如ZFS)

如果您澄清您想要实现什么,也许还有其他方法。


1

你应该看一下SquashFS,它是一个压缩文件系统。

你可以把它想象成一个tar.gz归档文件,主要用于LiveCD/DVD/USB ISOs,但完全适用于你的情况。

这里有一个教程。

附注:与其他答案相反,你不需要特定的操作系统来使用SquashFS,但如果你碰巧运行Solaris或FreeBSD,请选择ZFS压缩,它非常棒!


0
我认为这种方法并不存在,特别是在常规文件找不到时作为备选方案。尽管如此,编写一个CGI脚本来实现这个功能还是相当简单的。然而,在负载较大时,性能损失很可能会明显可见。

1
我使用CGI脚本,并且提出问题是因为存在性能损失(虽然不是很大,但比提供静态页面要慢得多),而且它不如一个配置指令美观。 - tig

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接