使用egg.js时,老是发生errno:"ECONNRESET"的错误,请问各位有建议吗?
2019-10-21 10:35:53,528 ERROR 14496 nodejs.ECONNRESETError: read ECONNRESET (uncaughtException throw 1 times on pid:14496) at TCP.onStreamRead (internal/stream_base_commons.js:167:27) errno: "ECONNRESET" code: "ECONNRESET" syscall: "read" name: "ECONNRESETError" pid: 14496 hostname: solomon001
我上网找到的信息指出: https://blog.csdn.net/weixin_33834910/article/details/85830742 问题原因 出现该问题的原因是:Node.js提供的HttpServer默认设置了超时时间为2分钟,当一个请求的处理时间超过2分钟,HttpServer会自动将该请求的socket关闭掉,于是客户端便收到了 ECONNRESET 的错误信息了。可以参考Node.js的源码。
因此我在egg.js的config\config.default.js里加入一个配置 config.serverTimeout = 0;
然後持续观察,看看网友们有没有啥经验可以给我建议,谢谢
/////////////////////////////改完後,又發生了!///////////////////////////////// [Mon Oct 21 2019 13:38:05 GMT+0800 (GMT+08:00)] [graceful:worker:15220:uncaughtException] throw error 2 times { ECONNRESETError: read ECONNRESET (uncaughtException throw 2 times on pid:15220) at TCP.onStreamRead (internal/stream_base_commons.js:167:27) errno: ‘ECONNRESET’, code: ‘ECONNRESET’, syscall: ‘read’, name: ‘ECONNRESETError’ } ECONNRESETError: read ECONNRESET (uncaughtException throw 2 times on pid:15220) at TCP.onStreamRead (internal/stream_base_commons.js:167:27) ECONNRESETError: read ECONNRESET (uncaughtException throw 2 times on pid:15220) at TCP.onStreamRead (internal/stream_base_commons.js:167:27) Node NOT Exiting… [2019-10-21 13:38:05.154] [cfork:master:12608] worker:15220 disconnect (exitedAfterDisconnect: true, state: disconnected, isDead: false, worker.disableRefork: false) [2019-10-21 13:38:05.154] [cfork:master:12608] don’t fork new work (refork: false) 2019-10-21 13:38:05,154 INFO 12608 [master] app_worker#2:15220 disconnect, suicide: true, state: disconnected, current workers: [“2”] [Mon Oct 21 2019 13:38:35 GMT+0800 (GMT+08:00)] [graceful:worker:15220] kill timeout, exit now. 2019-10-21 13:38:35,404 ERROR 15220 [app_worker] exit with code:1 2019-10-21 13:38:35,427 WARN 18436 [ClusterClient:Connection] socket is closed by other side while there were still unhandled data in the socket buffer [2019-10-21 13:38:35.436] [cfork:master:12608] worker:15220 exit (code: 1, exitedAfterDisconnect: true, state: dead, isDead: true, isExpected: true, worker.disableRefork: false) 2019-10-21 13:38:35,437 ERROR 12608 nodejs.AppWorkerDiedError: [master] app_worker#2:15220 died (code: 1, signal: null, suicide: true, state: dead), current workers: [] at Master.onAppExit (D:\Webapp\node_modules\egg-cluster\lib\master.js:510:21) at Master.emit (events.js:197:13) at Messenger.sendToMaster (D:\Webapp\node_modules\egg-cluster\lib\utils\messenger.js:137:17) at Messenger.send (D:\Webapp\node_modules\egg-cluster\lib\utils\messenger.js:102:12) at EventEmitter.cluster.on (D:\Webapp\node_modules\egg-cluster\lib\master.js:353:22) at EventEmitter.emit (events.js:202:15) at ChildProcess.worker.process.once (internal/cluster/master.js:186:13) at Object.onceWrapper (events.js:285:20) at ChildProcess.emit (events.js:197:13) at Process.ChildProcess._handle.onexit (internal/child_process.js:254:12) name: "AppWorkerDiedError" pid: 12608 hostname: solomon001 /////////////////////////////////////////////////////////////////////
@atian25
大大,不晓得您有啥好建议,感谢
难道不是应该思考下设计的合理性么?为啥一个 HTTP 接口会耗时超过 2 分钟么?
超过15秒的后台处理流程就应该是丢队列了,不应该让客户端一直处于等待状态。
但是网路上搜索,这方面的问题,许多网友也遇到,而且也不好解决, 应该不是:纯「HTTP 接口会耗时超过 2 分钟」的问题!
看样子是node.js的error,可能跟egg.js比较没有直接的关系~~~ 我在解解看,如果解不出来,就麻烦了
graceful:worker:15220:uncaughtException
这句看来你是有一个未捕获的异常导致进程挂掉,但 egg 都是有兜底的,怀疑是你业务代码的异步逻辑处理有问题,如在 callback 里面做了一些事,跳出了 Koa 的 Promise 链。
[2019-10-21 13:38:05.154] [cfork:master:12608] don’t fork new work (refork: false)
从这句来看,你线上应用难道是用 egg-bin dev
启动 而不是 egg-scripts
?。。。。
应该不是:纯「HTTP 接口会耗时超过 2 分钟」的问题!
没有稳定的复现方式,谁也帮不了你。
目前状况回报: 既然是TCP的问题,我list出我egg.js会有对内、对外TCP的存取与协议的 服务
mysql(sequelize) ldap 前後端分离架构,前端使用nginx handle、後端egg handle
看来就没有了, ●我先把前後端分离,切换成全部 都由egg handle ●检测mysql的连线都是通过sequelize ,使用pool管理 最後看了ldap这个模块,看来很有可能是这个模块发生问题, 每次成功登入或失败,没有ldap.close(),观察这个部份,对 系统造成的影响。 比对加入ldap.close後, "ECONNRESET"的错误,持续一个晚上没有发生,之前大概2~3小时发生一次, 虽然还不是很确定,先回报目前状况。
在HTTP中通常情况使用keep-alive 来保持 TCP 长连接,ECONNRESET产生原因是由于服务端TCP连接关掉了的,但是客户端依然往原有通道发送数据导致的。建议参考这篇文章能给到你最完美的答案如何解决ECONNRESET