nginx上传客户端

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

问题是,当我上传一个1.2 MB文件而不是显示HTTP 413错误页面时,浏览器挂起一点,然后随着“连接在页面加载时被重置”消息而死亡。

我已经尝试过nginx提供的每个选项,似乎没有任何工作。 有没有人对此有任何想法?

这是我的nginx.conf:

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


当客户端通过发送一个413响应并关闭连接来通知它将发送一个大于client_max_body_size的主体时,nginx“快速失败”。

大多数客户端在发送整个请求主体之前不会读取响应。 由于nginx关闭连接,客户端将数据发送到关闭的套接字,导致TCP RST。

如果您的HTTP客户端支持它,处理此问题的最佳方法是发送Expect: 100-Continue标题。 Nginx自1.2.7开始正确支持此功能,并且将以413 Request Entity Too Large响应回复,而不是100 Continue如果Content-Length超过最大主体大小,则继续。


你的上传死在最后? 碰撞前99%? 客户端主体和缓冲区是关键,因为nginx必须缓冲传入的数据。 主体配置(请求主体的数据)指定nginx如何处理来自多部分形式客户端的二进制数据批量流到您的应用逻辑。

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

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

client_body_in_file_only clean;
client_body_buffer_size 32K;

client_max_body_size 300M;

sendfile on;
send_timeout 300s;

从文档:

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

我怀疑这是怎么回事,如果你使用诸如Firebug或Live HTTP Headers(这两个Firefox扩展)的工具来检查HTTP往复,你将能够看到真正发生的事情。

链接地址: http://www.djcxy.com/p/22183.html

上一篇: nginx upload client

下一篇: Android post data along with file using multipart data