nginx上传client_max_body_size问题

我正在运行nginx / ruby​​-on-rails,我有一个简单的多部分forms来上传文件。 一切工作正常,直到我决定限制我想上传的文件的最大大小。 为此,我将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响应并closures连接来通知它将发送一个大于client_max_body_size的主体时,nginx“快速失败”。

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

如果您的HTTP客户端支持,最好的方法是发送一个Expect: 100-Continue标题。 Nginx从1.2.7开始正确支持这个function,如果Content-Length超过了最大主体大小,Nginx会回复一个413 Request Entity Too Large响应而不是100 Continue

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

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

设置body_in_file_only clean并调整client_max_body_size缓冲区。 原问题的configuration已经有了sendfile,也增加了超时。 我使用下面的设置来解决这个问题,在你的本地configuration,服务器和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来回,你将能够看到真正发生的事情。