【问题标题】:Nginx: referring too-large files uploads to application?Nginx:将太大的文件上传到应用程序?
【发布时间】:2016-07-07 21:51:25
【问题描述】:

在 nginx 发出错误 413 页面之前,我需要能够处理超过最大 nginx 和 php 限制的上传文件大小。相反,我想在我的应用程序 (symfony) 对话框中发出错误消息。

为了测试 symfony 中的文件大小限制,我的测试上传文件是 600 Mb。当我在nginx下上传600Mb文件时,上传运行到100%,然后 报告“413 请求实体太大”。

如果我运行“app/console server:run”(它使用 symfony 服务器而不是 nginx),symfony 会在上传之前(如预期)在 gui 中报告错误。

有什么方法可以修改 nginx 配置,使其读取 $_SERVER[CONTENT_LENGTH] 或 $_SERVER[HTTP_CONTENT_LENGTH],中止上传,然后将拒绝的请求传递给应用程序? Symfony 根据 CONTENT_LENGTH 标记错误(以及解决 symfony 问题的方法,HTTP_CONTENT_LENGTH)。

文件大小限制:

src/my_app/CoreBundle/Resources/config/validation.yml: maxSize: '500M'
/etc/php5/cgi/php.ini:post_max_size = 550M
/etc/php5/cgi/php.ini:upload_max_filesize = 500M
/etc/php5/cli/php.ini:post_max_size = 550M
/etc/php5/cli/php.ini:upload_max_filesize = 500M
/etc/php5/fpm/php.ini:post_max_size = 550M
/etc/php5/fpm/php.ini:upload_max_filesize = 500M

版本:

symfony 2.5.12  
nginx 1.4.6-1ubuntu3.4

【问题讨论】:

    标签: symfony nginx file-upload


    【解决方案1】:

    您可以在 nginx 配置 http 块中增加允许的大小。

    client_max_body_size 800m;
    

    设置一个高于 php.ini 中的值的值。然后nginx服务器没有响应413,symfony由于php限制显示正常的错误页面。

    【讨论】:

    • 谢谢,Crofly。增加限制意味着 >800Mb 文件发生相同问题需要更长的时间。我需要能够在上传开始之前发现问题。
    【解决方案2】:

    我通过在 javascript 中捕获文件选择中的更改来解决此问题,然后在文件太大时弹出警告并清除选择。

    我的直觉是nginx不会以任何方式解析传入的请求,即它不会读取CONTENT_LENGTH或HTTP_CONTENT_LENGTH,并且纯粹根据请求的大小是否超过client_max_body_size来拒绝请求。如果这是真的(确认或拒绝会很好),那么在使用 nginx 时没有办法处理这个问题,除非让 nginx 运行上传并遇到 413 错误(这对于大文件和/或慢速网络来说很耗时) .

    【讨论】:

      【解决方案3】:

      Content-Length 将适用于非分块内容,但是我怀疑您的上传被分块,然后 nginx 无法找出您的内容的大小。 即使可以,也不应该通过。

      按 HTTP/1.1 规范: http://www.ietf.org/rfc/rfc2616.txt:

      3.If a Content-Length header field (section 14.13) is present, its
       decimal value in OCTETs represents both the entity-length and the
       transfer-length. The Content-Length header field MUST NOT be sent
       if these two lengths are different (i.e., if a Transfer-Encoding
       header field is present). If a message is received with both a
       Transfer-Encoding header field and a Content-Length header field,
       the latter MUST be ignored.
      

      【讨论】:

        猜你喜欢
        • 2013-04-25
        • 1970-01-01
        • 1970-01-01
        • 2022-01-13
        • 2019-01-23
        • 2020-06-17
        • 1970-01-01
        • 2020-09-21
        • 1970-01-01
        相关资源
        最近更新 更多