我正在运行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:
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
发布于 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
。
发布于 2013-01-23 16:52:53
你的上传会在最后死掉吗?崩溃前的99%?客户端主体和缓冲区是关键,因为nginx必须缓冲传入的数据。正文配置(请求正文的数据)指定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;
发布于 2011-02-10 01:21:31
有必要记住,浏览器不知道如何正确显示此错误。
我怀疑这就是正在发生的事情,如果你使用Firebug或Live HTTP Headers (都是Firefox扩展)之类的工具来回检查HTTP,你就能看到真正发生了什么。
https://stackoverflow.com/questions/4947107
复制相似问题