nginx 日志中大量recv() failed (104: Connection reset by peer)错误

1,308 views
Skip to first unread message

ywsample

unread,
Dec 12, 2013, 1:40:21 AM12/12/13
to open...@googlegroups.com
hi, all

最近发现log中有大量的recv() failed (104: Connection reset by peer)错误,这条错误信息只会在ngx_recv函数中产生,但是从日志中发现nginx已经接受完请求头了,并且从日志中发现nginx已经成功执行到了content阶段,那么之后为什么还有recv的调用呢,请求是GET并且没有请求body

nginx 处理逻辑大概是这样的

content_by_lua '
    ...
    ngx.log( ... )
';
在日志中发现记录了 ngx.log中的内容,但是随后就出现了 recv() failed 错误

配置文件中lua_need_request_bodylua_check_client_abort 都是off,但是打开了proxy_ignore_client_abort; 长连接是关闭的

-- ywsample :)

ywsa...@gmail.com

unread,
Dec 12, 2013, 2:00:50 AM12/12/13
to open...@googlegroups.com
补充:这跟对端SO_LINGER选项会有关系吗

在 2013年12月12日星期四UTC+8下午2时40分21秒,ywsample写道:

Yichun Zhang (agentzh)

unread,
Dec 12, 2013, 3:12:25 PM12/12/13
to openresty
Hello!

2013/12/11 ywsample:
> 最近发现log中有大量的recv() failed (104: Connection reset by
> peer)错误,

你能提供完整的错误日志消息行么?

> 这条错误信息只会在ngx_recv函数中产生,但是从日志中发现nginx已经接受完请求头了,并且从日志中发现nginx已经成功执行到了content阶段,那么之后为什么还有recv的调用呢,请求是GET并且没有请求body
>

常见的一种情况是当前连接是 keepalive 模式,于是 nginx 在当前请求结束后使用 recv()
检查在当前连接上是否有新的请求。所以此时如果连接被重置是无害的,因为只是客户端主动断开了连接。

值得一提的是,你可以利用 systemtap 这样的动态追踪工具确认生产上这些 recv() 错误对应的 C 调用栈的组成,从而得到上下文信息。

Regards,
-agentzh

ywsample

unread,
Dec 12, 2013, 10:29:58 PM12/12/13
to open...@googlegroups.com
2013/12/13 00:10:02 [info] 16941#0: *151993681 [lua] click.lua:55: ......., client: 172.16.118.142, server: xxxxxx, request: "GET /click?type=3 HTTP/1.1"
2013/12/13 00:10:02 [info] 16941#0: *151993681 recv() failed (104: Connection reset by peer), client: 172.16.118.142, server: xxxxxx, request: "GET /click?type=3 HTTP/1.1"
这两个应该是同一请求,日志中省略了无关信息
nginx配置中已经把keepalive模式给关了



--
--
邮件来自列表“openresty”,专用于技术讨论!
订阅: 请发空白邮件到 openresty...@googlegroups.com
发言: 请发邮件到 open...@googlegroups.com
退订: 请发邮件至 openresty+...@googlegroups.com
归档: http://groups.google.com/group/openresty
官网: http://openresty.org/
仓库: https://github.com/agentzh/ngx_openresty
教程: http://openresty.org/download/agentzh-nginx-tutorials-zhcn.html



--
ywsample :)

Yichun Zhang (agentzh)

unread,
Dec 13, 2013, 12:20:01 AM12/13/13
to openresty
Hello!

2013/12/12 ywsample:
> 2013/12/13 00:10:02 [info] 16941#0: *151993681 recv() failed (104:
> Connection reset by peer), client: 172.16.118.142, server: xxxxxx, request:
> "GET /click?type=3 HTTP/1.1"
> 这两个应该是同一请求,日志中省略了无关信息

这个 info 的日志级别已经指示出这个错误本身是无害的。

> nginx配置中已经把keepalive模式给关了
>

即使你禁用了 http keepalive,nginx 仍然会尝试处理 HTTP 1.1 pipeline 的请求。你可以配置
lingering_close off 禁用此行为,但这不是推荐的做法,因为会违反 HTTP 协议。见

http://nginx.org/en/docs/http/ngx_http_core_module.html#lingering_close

Regards,
-agentzh
Reply all
Reply to author
Forward
0 new messages