客户端在向客户端发送数据时意外关闭连接,在nginx中。

34

我在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错误响应代码。我该如何解决?

谢谢。


你能找到解决这个问题的方法吗? - jithujose
也许这可以帮助:所有的答案对我都没有用。我换了另一台电脑,尝试访问HTTPS地址,它成功了。问题可能是客户端的问题或者服务器上缓存了某些东西。 - arsenik
我发现这个错误非常具有误导性。我安装了Apache HTTPd来排除问题,果然,在apache中我收到了类似的错误。但是,apache的错误更加明确,如“[Sun Apr 29 10:44:20.575666 2018] [mpm_event:debug] [pid 11342:tid 139630102398720] event.c(1123): (32)Broken pipe: [client 192.168.1.1:60708] AH00470: network write failure in core output filter”,这指引我检查我的路由器,结果发现它是问题所在。我捕获了日志并在我的博客上记录了这个问题:https://swazzy.com/2018/04/29/evasive-errors/ - alex
6个回答

22

2
这对我起作用了。 - WuTheFWasThat
1
这对我也有效。点赞。记得将其设置在/etc/nginx/nginx.conf下的http块内。如果将其放在server块下,无法使其工作。 - Danny Teo
12
有人能解释一下为什么这样做会解决问题吗? - cdmckay
是的,对我也起作用了。同时也感谢Danny Teo提供正确的放置方式! - J. Martin
从文档中:确定当客户端关闭连接而不等待响应时,是否应关闭与代理服务器的连接。https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_ignore_client_abort - eberbis

18

今天我花了很长时间自己解决了这个问题并找到了解决方法:
请注意此修复只影响在使用负载均衡器时的情况

检查您的负载平衡器空闲超时时间。我将 ELB 空闲超时时间设置为 60 秒(默认值),由于请求挂起,它在给定时间后关闭了连接。但是由于 ELB 在 nginx 之前,因此 nginx 记录“客户端”(在此情况下为 ELB)正在关闭连接。

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

还要记住,您可能仍然需要更改代理超时等参数。


同时,如果您有 EC2 -> 目标组 -> 选择正确的目标组 -> 向下滚动 -> 健康检查 -> 更改超时属性,请检查目标配置。 - TikTik

7
我发现关闭代理缓存能够帮助解决问题。
http {
   proxy_buffering off;
...
}

可能缓冲区太小或不足。 更改缓冲区大小后,它可以很好地工作。

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

6
我遇到了相同的问题并进行了研究。在我的情况下,这只会在Webkit(Chrome)浏览器中发生。如果您仅加载单个资源,则它们会乐观地打开连接多于所需的连接。在这种情况下,多余的连接会被不优雅地关闭,或者至少没有发送任何HTTP动词。这会导致nginx中提到的错误。
关于#1答案: 提出的所有解决方案都没有帮助,这是合理的,因为这与代理无关。
关于#2答案: proxy_ignore_client_abort on; 在我的测试中没有帮助。
不幸的是,我找不到其他解决方案,只能使用
error_log off;

2

我曾遇到同样的问题,后来发现是由于 nginx 的 send_timeout 设置关闭了连接。我将其增大后问题得到解决。

http
{
send_timeout 20;
...
}

8
默认值实际上是60秒:http://nginx.org/en/docs/http/ngx_http_core_module.html#send_timeout。 - Kzqai

-3

fastcgi_ignore_client_abort on 绝对可以解决这个问题。


3
请简要解释您的答案,说明OP需要在哪里设置等,以便对他人有所帮助。 - Ravimallya
1
是的,解释会很有帮助。 - fraxture

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接