配置Apache进行大上传


Configuring Apache for Large Uploads

我正在为我的公司开发一个文件上传服务。我们的用户经常发送给我们非常大的。zip文件,里面装满了非常大的illustrator文件。一般来说,文件不会超过1.5GB,但我需要计划处理高达4GB的文件。

显然,这引起了很多关于如何配置Apache以允许如此大的文件传输而不使服务器过载或打开安全漏洞的担忧。

关注事项1:内存限制

我的系统的一个特点是,用户应该能够下载他们的文件后,他们上传。由于安全问题,我避免使用标准下载(只是链接到文件)-我不能让其他用户相互下载文件。我的解决方案是将上传的文件保存在www-root之外的受保护目录中,并通过PHP脚本加载它们。该PHP脚本看起来像这样:

$fo = fopen($uploadDir.$file_name, "r");
while(!feof($fo)) {
        $strang = fread($fo, 102400);
        echo $strang;
        ob_flush();
}
fclose($fo);

我将读取放入循环中,并将其锁定为每次只加载文件的一小部分。我这样做是因为我的服务器只有4GB的RAM,并且需要能够处理多人同时下载(可能最多20个人)。我的第一个问题是一次应该读取多大的数据块。现在下载一个1.5GB的文件是非常慢的,因为块的大小。

关注问题2:最大执行时间

上传/下载如此大的文件的另一个问题是最大的执行时间。虽然在我的内部网络上一切都非常快,但我应该为连接速度较慢的用户做好准备。我将我的低端上传速率设置为1Mbps,也就是说上传大约需要35分钟。让我们慷慨点,假设他们可以以两倍的速度下载,所以15分钟左右的下载时间。

设置max_execution_time为30分钟是否存在安全风险?它会杀死我服务器上的任何东西吗?我没有任何理由认为这是一个坏主意,但我的直觉只是尖叫,我将愚蠢地允许脚本运行那么长时间。有没有更好的方法来做我想做的事?


我看到了其他几个类似的问题,其中大多数建议使用java或silverlight之类的东西。我想,如果有任何明智的方法,避免java。我目前正在使用swfupload和随附的jQuery插件

关注事项1:内存限制

readfile流,所以它被转换成HTTP响应在飞行,它不会被加载到内存完成。

然而,对于上传,脚本必须有足够的内存,因为当上传和使用PHP时,如果我没记错的话,整个文件都会进入内存。

关注问题2:最大执行时间

如果您关心安全性,请通过HTTPD服务器处理身份验证和访问权限。当请求无效时,脚本将不会被执行。