채팅 웹 응용 프로그램에 Socket.io를 사용하여 Express.js 응용 프로그램을 실행 중이며 24 시간 동안 5 번 정도 무작위로 다음 오류가 발생합니다. 노드 프로세스는 영원히 랩핑되고 즉시 다시 시작됩니다.
문제는 Express를 다시 시작하면 내 사용자가 회의실에서 빠져 나오고 아무도 그것을 원하지 않는다는 것입니다.
웹 서버는 HAProxy에 의해 프록시됩니다. 웹 소켓 및 플래시 소켓 전송 만 사용하면 소켓 안정성 문제가 없습니다. 고의로 이것을 재현 할 수 없습니다.
이것은 Node의 오류입니다 v0.10.11
.
events.js:72
throw er; // Unhandled 'error' event
^
Error: read ECONNRESET //alternatively it s a 'write'
at errnoException (net.js:900:11)
at TCP.onread (net.js:555:19)
error: Forever detected script exited with code: 8
error: Forever restarting script for 2 time
편집 (2013-07-22)
socket.io 클라이언트 오류 처리기와 포착되지 않은 예외 처리기가 모두 추가되었습니다. 이 오류가 발생하는 것으로 보입니다.
process.on('uncaughtException', function (err) {
console.error(err.stack);
console.log("Node NOT Exiting...");
});
따라서 Socket.io 문제가 아니라 다른 서버에 대한 HTTP 요청 또는 MySQL / Redis 연결이라고 생각합니다. 문제는 오류 스택이 내 코드 문제를 식별하는 데 도움이되지 않는다는 것입니다. 다음은 로그 출력입니다.
Error: read ECONNRESET
at errnoException (net.js:900:11)
at TCP.onread (net.js:555:19)
이 원인을 어떻게 알 수 있습니까? 오류를 더 잘 극복하려면 어떻게해야합니까?
자, 매우 장황하지는 않지만 Longjohn의 스택 추적은 다음과 같습니다.
Exception caught: Error ECONNRESET
{ [Error: read ECONNRESET]
code: 'ECONNRESET',
errno: 'ECONNRESET',
syscall: 'read',
__cached_trace__:
[ { receiver: [Object],
fun: [Function: errnoException],
pos: 22930 },
{ receiver: [Object], fun: [Function: onread], pos: 14545 },
{},
{ receiver: [Object],
fun: [Function: fireErrorCallbacks],
pos: 11672 },
{ receiver: [Object], fun: [Function], pos: 12329 },
{ receiver: [Object], fun: [Function: onread], pos: 14536 } ],
__previous__:
{ [Error]
id: 1061835,
location: 'fireErrorCallbacks (net.js:439)',
__location__: 'process.nextTick',
__previous__: null,
__trace_count__: 1,
__cached_trace__: [ [Object], [Object], [Object] ] } }
플래시 소켓 정책 파일을 제공합니다.
net = require("net")
net.createServer( (socket) =>
socket.write("<?xml version=\"1.0\"?>\n")
socket.write("<!DOCTYPE cross-domain-policy SYSTEM \"http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd\">\n")
socket.write("<cross-domain-policy>\n")
socket.write("<allow-access-from domain=\"*\" to-ports=\"*\"/>\n")
socket.write("</cross-domain-policy>\n")
socket.end()
).listen(843)
이것이 원인이 될 수 있습니까?