客户端在发送到客户端时,在nginx中关闭过早连接

时间:2011-01-26 12:58:57

标签: nginx

我在nginx error.log中有错误:

2010/12/05 17:11:49 [info] 7736#0: *1108 client closed prematurely connection while sending to client, 
client: 188.72.80.201, server:***.biz, request: "GET /forum/ HTTP/1.1", 
upstream:"http://***:3000/forum/", host: "***.biz"

我每次都有500个响应代码。我该如何解决这个问题?

谢谢。

7 个答案:

答案 0 :(得分:16)

设置proxy_ignore_client_abort on;可能会对您有所帮助。

答案 1 :(得分:11)

我今天长时间自己解决了这个问题并找到了解决方案:
请注意,此修复程序仅在使用负载均衡器时影响您

检查您的负载均衡器空闲超时。我将ELB空闲超时设置为60秒(默认),并且当请求挂起时,它在给定时间后关闭连接。但由于ELB在nginx之前,nginx正在记录“客户端”(在本例中为ELB),正在关闭连接。

因此,如果您使用的是ELB,请转到:
EC2 - >负载均衡器 - >选择正确的 - >如果您正在使用其他负载平衡器,请在说明中向下滚动并更改空闲超时,检查其配置和超时。

另请注意,您可能仍需要更改代理超时等。

答案 2 :(得分:7)

我发现如果关闭代理缓冲区帮助

http {
   proxy_buffering off;
...
}

缓冲区可能太小或太少。 更改缓冲区大小后,它很好用

proxy_buffering on;
proxy_buffer_size 8k;
proxy_buffers 2048 8k;

答案 3 :(得分:2)

我遇到了同样的问题,并对此进行了研究。在我的情况下,这只发生在Webkit(Chrome)浏览器上。如果只加载单个资源,它们会以更快的方式打开连接。在这种情况下,多余的连接不合适地关闭或至少不通过它发送任何HTTP动词。这导致nginx中提到的错误。

关于#1答案: 非提议的解决方案有助于合理,因为这与代理无关。

关于#2答案: proxy_ignore_client_abort on; 在我的测试中有帮助。

不幸的是,除了使用

之外,我找不到其他解决方案

error_log off;

答案 4 :(得分:1)

我有同样的问题,发现nginx因send_timeout设置而关闭了连接。我增加了它并且它是固定的。

http
{
send_timeout 20;
...
}

答案 5 :(得分:-3)

fastcgi_ignore_client_abort on肯定会解决问题。

答案 6 :(得分:-19)

error_log更改为warn时,我已开始看到此消息。还原解决了这个问题。