首页 > 解决方案 > jQuery/PHP 文件上传在 99% 处重新启动,然后返回超时

问题描述

我在 EC2 实例上运行的 AMI Linux 上上传 jQuery/PHP 文件时遇到了一些问题。我尝试使用这个和其他几个插件(只是为了确保问题不在于插件本身),结果相同。尝试上传 14MB PDF 时,进度条达到 75%(或更多,最高 99%),然后从 0% 重新开始,再次达到 75%(或更多,最高 99%),然后它就停止了没有错误(甚至没有说Request Timeout)。做了几次尝试,只有几次进度条没有重新启动就达到了99%,然后弹出错误说Request Timeout。这是我在 apache 中发现的access_log

12.34.56.78 - - [02/Jul/2019:15:50:09 +0000] “POST /uploader/demo/backend/upload.php HTTP/1.1”408 221

12.34.56.78 - - [02/Jul/2019:15:50:31 +0000] “POST /uploader/demo/backend/upload.php HTTP/1.1”408 221

所以它打印408 Request Timeout在 2 行上(实际上上传重新启动一次)。上传需要 22 或 23 秒(从日志中可以看出)。

这就是我设置我的方式php.ini(我使用的是 PHP 7.1 FPM):

max_execution_time = 360
max_input_time = 360
memory_limit = 256M
post_max_size = 100M
upload_max_filesize = 100M

phpinfo()表明这些值已正确应用。我还尝试在文件中使用set_time_limit(0)和设置所有上述值,但没有任何改变。上传目录具有适当的权限,实际上一个 9.3MB 的 PDF 正确上传,没有错误。upload.phpini_set()

在我的一项尝试中,我还尝试设置这些 apache 指令:

KeepAlive On
KeepAliveTimeout 360
TimeOut 360

唯一的结果是上传进度一直达到 99% 并重新启动几次,而不是只重新启动一次。

现在我没有想法了,提出的大多数解决方案都与php.ini我的情况下正确应用的设置有关。

标签: phpjqueryapacheuploadtimeout

解决方案


经过数小时的尝试,我一发布我的问题,就找到了答案。它可能对任何有同样问题的人有用。如果我的问题中列出的所有其他内容都不起作用,则可能是由于mod_reqtimeout(对我而言)。我只是创建了一个名为:的文件并将/etc/httpd/conf.d/mod_reqtimeout.conf 其放入其中:

<IfModule reqtimeout_module>
  RequestReadTimeout header=20-40,MinRate=500 body=20,MinRate=500
</IfModule>

正如上面链接的 apache 文档所建议的那样。然后我重新启动了 apache,上传达到 100% 没有问题。

mod_security当我尝试使用 60MB PDF 时,也参与其中。我必须设置以下设置以匹配在php.ini里面设置的 100MB 限制/etc/httpd/conf.d/mod_security.conf

SecRequestBodyLimit 100000000

推荐阅读