在Plesk / Nginx / Apache上通过PHP提供大文件(> 1GB)

时间:2017-10-19 17:10:26

标签: php linux apache nginx plesk

我正在尝试通过PHP提供任意大文件。 由于我需要先检查权限,我不能让Web服务器直接处理文件下载。

服务器正在运行Plesk 17.0。据我所知,Plesk默认使用Nginx作为Apache的代理。但是这可以关闭,所以Apache直接提供所有东西。

我的问题: 在下载时,如果我使用默认配置(运行Nginx时),1GB后会出现几MB的网络错误。

我已经阅读了很多关于如何在PHP中处理大文件上传的建议。目前我基本上使用这个:


    if ( isset( $_SERVER['MOD_X_SENDFILE_ENABLED'] ) &&
         $_SERVER['MOD_X_SENDFILE_ENABLED'] == 1 ) {
        header( "X-Sendfile: " . $this->options['base_path'] . $file );
    } else {
        readfile( $file );
    }

如您所见,我已尝试将文件下载卸载到Apache。它也可以正常工作,如果我关闭了Nginx。 打开Nginx后,PHP中的max_execution_time标记了Nginx产生网络错误的限制。虽然它至少服务1GB。对我来说,似乎Apache和Nginx之间存在某种块大小限制,设置为1GB。但我找不到这样的选择。例如,将max_execution_time设置为5秒,即使下载需要10分钟,仍然可以提供1GB。

当提供1GB且传递max_execution_time时,在proxy_error_log中记录此错误:


    [error] 3524#0: *796853 upstream prematurely closed connection while reading upstream

在Apache直接服务且mod_xsendfile处于活动状态时,max_execution_time无关紧要。使用PHP readfile,max_execution_time很重要。这对我来说也很有意义。

但根据Plesk documentation,使用Nginx进行服务是有益的。

因此,我正在寻找一种方法来保持Nginx和Apache的运行,并且在提供多个GB文件时不受max_execution_time的限制。

0 个答案:

没有答案