首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >nginx upload client_max_body_size问题

nginx upload client_max_body_size问题
EN

Stack Overflow用户
提问于 2011-02-09 23:46:18
回答 3查看 213.3K关注 0票数 120

我正在运行nginx/ruby-on-rails,并且我有一个简单的多部分表单来上传文件。一切正常,直到我决定限制我想要上传的文件的最大大小。为此,我将nginx client_max_body_size设置为1m (1MB),并期望在该规则被打破时响应HTTP413(请求实体太大)状态。

的问题是,当我上传一个1.2MB的文件时,浏览器没有显示HTTP413错误页面,而是挂起了一点,然后死机了,并显示了一条"Connection reset when the page is loading“的消息。

我几乎尝试了nginx提供的所有选项,但似乎都不起作用。有人对此有什么想法吗?

这是我的nginx.conf:

代码语言:javascript
复制
worker_processes  1;
timer_resolution  1000ms;
events {
    worker_connections  1024;
}

http {
    passenger_root /the_passenger_root;
    passenger_ruby /the_ruby;

    include       mime.types;
    default_type  application/octet-stream;

    sendfile           on;
    keepalive_timeout  65;

    server {
      listen 80;
      server_name www.x.com;
      client_max_body_size 1M;
      passenger_use_global_queue on;
      root /the_root;
      passenger_enabled on;

      error_page 404 /404.html;
      error_page 413 /413.html;    
    }    
}

谢谢。

`Edit`

环境/UA: Windows XP/Firefox 3.6.13

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-11-17 05:09:37

当客户端通过发送413响应并关闭连接来通知它将发送比client_max_body_size更大的正文时,nginx“快速失败”。

大多数客户端在发送整个请求正文之前不会读取响应。因为nginx关闭了连接,所以客户端会将数据发送到关闭的套接字,从而导致TCP RST。

如果你的超文本传输协议客户端支持它,最好的处理方法就是发送一个Expect: 100-Continue报头。Nginx从1.2.7开始正确支持这一点,如果Content-Length超过最大正文大小,将使用413 Request Entity Too Large响应而不是100 Continue

票数 132
EN

Stack Overflow用户

发布于 2013-01-23 16:52:53

你的上传会在最后死掉吗?崩溃前的99%?客户端主体和缓冲区是关键,因为nginx必须缓冲传入的数据。正文配置(请求正文的数据)指定nginx如何处理从多部分形式的客户端到应用程序逻辑的二进制数据的批量流动。

clean设置释放内存和消耗限制,指示nginx将传入的缓冲区存储在一个文件中,然后通过删除该文件将其从磁盘中清除。

body_in_file_only设置为clean并调整client_max_body_size的缓冲区。原始问题的配置已经打开了sendfile,也增加了超时。我使用下面的设置来解决这个问题,适用于您的本地配置、服务器和http上下文。

代码语言:javascript
复制
client_body_in_file_only clean;
client_body_buffer_size 32K;

client_max_body_size 300M;

sendfile on;
send_timeout 300s;
票数 49
EN

Stack Overflow用户

发布于 2011-02-10 01:21:31

来自the documentation

有必要记住,浏览器不知道如何正确显示此错误。

我怀疑这就是正在发生的事情,如果你使用FirebugLive HTTP Headers (都是Firefox扩展)之类的工具来回检查HTTP,你就能看到真正发生了什么。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4947107

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档