PHP AWS Elastic Beanstalk - 不能发布超过 2GB 的文件

Posted

技术标签:

【中文标题】PHP AWS Elastic Beanstalk - 不能发布超过 2GB 的文件【英文标题】:PHP AWS Elastic Beanstalk - Cannot post file more than 2GB 【发布时间】:2020-11-19 05:30:07 【问题描述】:

我在 Elastic Beanstalk 中部署了一个应用程序,更改了一些配置,以便我可以上传更大的文件并重新启动 nginx 服务器。 当我上传一个小于 2 GB 的文件时,它已成功上传。但是,当我上传超过 2 GB 的文件时,它不会成功上传。以下是我在 /etc/nginx/nginx.conf 文件中添加的行:

client_max_body_size 7500M;
proxy_connect_timeout 1200s;
proxy_send_timeout 1200s;
proxy_read_timeout 1200s;
fastcgi_send_timeout 1200s;
fastcgi_read_timeout 1200s;

另外,我在 .ebextensions 中添加了配置文件并放入以下内容:

files:
    "/etc/php.d/99uploadsize.ini":
        mode: "000644"
        owner: root
        group: root
        content: |
            post_max_size = 5000M
            upload_max_filesize = 5000M
            memory_limit = 5000M
commands:
    remove_old_ini:
        command: "rm -f /etc/php.d/99uploadsize.ini.bak"

还尝试了以下内容:

files:
    "/etc/nginx/conf.d/proxy.conf":
        mode: "000755"
        owner: root
        group: root
        content: |
            post_max_size = 7500M
            upload_max_filesize = 5000M
            memory_limit = 7500M
            client_max_body_size = 5000M

这是 phpinfo() 快照:

我哪里出错了?请帮助我

【问题讨论】:

为什么需要你的 Nginx 服务器来代理上传? 之前我得到了“实体太大”,因为它添加了这些行 我们需要更多信息。您确定您的 EC2 实例大小有足够的内存和足够的存储空间吗?另外,为什么不直接使用 S3 而不是 EB? EB 实例是易失性的,VM 上的存储不是持久的。 @Labu 我们已将内存容量增加到 32 GB,并且我们正在托管服务器端脚本,因此我们无法在 S3 上托管它 @user1584253 您是否检查了 phpinfo() 中显示 post_max_size 和 upload_max_filesize 已正确更新的部分?可能没有正确读取这些值。 【参考方案1】:

PHP 设置

您的 PHP 设置是绝对正确的,没有错误就是设置。

上传错误不是 PHP

根据您的图片发布错误代码,即 7,这意味着

UPLOAD_ERR_CANT_WRITE - 7; Failed to write file to disk. Introduced in PHP 5.1.0

这意味着您上传代码是正确的,但在系统上写入文件时它失败了。

Apache 设置

LimitRequestBody

该指令指定请求正文中允许的从 0(表示无限)到 2147483647 (2GB) 的字节数。

LimitRequestBody 指令允许用户在给出指令的上下文(服务器、每个目录、每个文件或每个位置)内设置 HTTP 请求消息正文的允许大小限制。如果客户端请求超过该限制,服务器将返回错误响应而不是为请求提供服务。正常请求消息正文的大小将根据资源的性质和该资源允许的方法而有很大差异。 CGI 脚本通常使用消息正文来检索表单信息。 PUT 方法的实现将需要一个至少与服务器希望为该资源接受的任何表示一样大的值。

该指令使服务器管理员可以更好地控制异常客户端请求行为,这可能有助于避免某些形式的拒绝服务攻击。

解决方案:

您不能通过 PHP 发布/上传超过 2 GB 的文件,因为 Apache 服务器不允许这样做。

唯一的解决方案是您可以对其进行压缩,并在进行压缩时将文件拆分为每个文件小于 2 GB,然后将它们解压缩到每个请求的服务器。

运行脚本解压文件并执行操作。

【讨论】:

以上是关于PHP AWS Elastic Beanstalk - 不能发布超过 2GB 的文件的主要内容,如果未能解决你的问题,请参考以下文章

AWS Elastic Beanstalk PHP 日志不在 CloudWatch 中

AWS Elastic BeanStalk php.ini 文件更新

如何在 AWS Elastic Beanstalk Docker 容器中记录 PHP 错误

PHP AWS Elastic Beanstalk 后台工作者

在 AWS Elastic Beanstalk 中,如何更改 php.ini 的参数

在 AWS Elastic Beanstalk 上部署后运行 PHP 脚本