Nginx 上传客户端_max_body_size 问题

我正在运行 nginx/ruby-on-ails,我有一个简单的多部分表单来上传文件。 Everything works fine until I decide to restrict the maximum size of files I want uploaded. 为此,我将 nginx client_max_body_size设置为 1米(1MB) ,并期望在该规则违反时响应 HTTP 413(Request Entity Too Large)状态。

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

I've tried just about every option there is that nginx offers, nothing seems to work. Does anyone have any ideas about this?

Here's my 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

216084 次浏览

来自 文件:

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

我怀疑这就是正在发生的事情,如果您使用诸如 纵火犯实时 HTTP 头(两个 Firefox 扩展)之类的工具来回检查 HTTP,您将能够看到真正发生了什么。

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

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

如果您的 HTTP 客户端支持它,那么处理这个问题的最佳方法是发送一个 Expect: 100-Continue头文件。Nginx 在1.2.7时正确地支持这一点,如果 Content-Length超过最大主体大小,它将使用 413 Request Entity Too Large响应而不是 100 Continue来响应。

你的上传会在最后死掉吗?99% ?客户机主体和缓冲区是关键,因为 nginx 必须缓冲传入的数据。Body configs (请求主体的数据)指定 nginx 如何处理从多部分表单客户机到应用程序逻辑的大量二进制数据流。

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

body_in_file_only设置为 clean并调整 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;