Node js ECONNRESET
Je m exécute un Express js application avec la prise.io pour un chat
webapp et j'obtiens l'erreur suivante au hasard autour de 5 fois au cours de
24h. Le nœud processus est enveloppé dans éternellement et il redémarre
lui-même immédiatement.
Problème est que le redémarrage de l'express de coups de pied à mes utilisateurs de leurs chambres
et personne n'en veut.
Le serveur web est représenté par HAProxy. Il n'y a pas de socket problèmes de stabilité, tout en utilisant les websockets et flashsockets transports. Je ne peux pas reproduire cela sur le but.
C'est l'erreur avec le noeud 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
MODIFIER (2013-07-22)
Ajouté deux socket.io client gestionnaire d'erreur et de l'exception non interceptée. Semble que celui-ci attrape l'erreur:
process.on('uncaughtException', function (err) {
console.error(err.stack);
console.log("Node NOT Exiting...");
});
Donc je suppose que c'est un socket.io question, mais d'une requête http vers un autre serveur que je fais ou mysql/redis connexion. Le problème, c'est que la pile d'erreur ne m'aide pas à identifier mon problème. Voici le journal de sortie:
Error: read ECONNRESET
at errnoException (net.js:900:11)
at TCP.onread (net.js:555:19)
Comment puis-je savoir quelles sont les causes? Comment puis-je obtenir plus de l'erreur?
Ok, pas très bavard mais ici s la stacktrace avec "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] ] } }
Ici je sers le flash fichier de régulation de socket:
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)
Cela peut-il être la cause?
- peut-être que cela peut vous aider (parlé à quelqu'un qui travaille au sein de node js) gist.github.com/samsonradu/1b0c6feb438f5a53e30e. Je ll déployer le support.gestionnaire d'erreurs aujourd'hui et vous le fait savoir.
- le socket.erreur poignées ne de t aider, mais le processus.sur('uncaughtException') intercepte l'erreur. Voici la console.journal de l'erreur: { [Erreur: lire ECONNRESET] code: 'ECONNRESET', errno: 'ECONNRESET', syscall: "lire"}
- ECONNRESET pourrait être de problème de réseau. Comme vous le savez, il est impossible d'attraper toutes les exceptions lors de l'essai. Certains vont apparaître sur votre serveur de production. Vous devrez faire votre serveur robuste. Vous pouvez manipuler la session de la suppression par l'utilisation de Redis comme espace de stockage. Il rend vos séances de persister même après votre nœud de serveur tombe en panne.
- Pourquoi est-ce lié à la session de suppression? Ils sont gérés par le Redis quand même.
- Cette coutures pour moi que vous êtes l'obtention d'un socket délai d'expiration de l'un de vos clients connectés. Essayez d'ajouter une "erreur" auditeur à toutes vos connexions, et non pas le processus lui-même.
- net.js fait beaucoup de debuglog-ing quand ça va émettre une erreur, vous pourriez obtenir quelques kilométrage de réglage env.NODE_DEBUG="net" et puis correspondant de la sortie contre les sites de la source.
- définir des clients connectés. Le nœud du serveur n'écoute que de websocket connexions et ils ont un gestionnaire d'erreur ajouté.
- Vous avez au moins une socket TCP écoute qui n'a pas de gestionnaire d'ensemble. Alors maintenant, il est temps de vérifier où que l'on est 😀
- juste comme remarque: dans mon cas, cela se produit avec un childprocesses stdio et pas un socket tcp ou quoi que ce soit d'autre. brute stdio. vont essayer de uncaughtException cas maintenant. merci.
- Pouvez-vous montrer le code correspondant à votre serveur d'où l'erreur se produit. Ou au moins un minimum de code pour reproduire l'erreur. Il est difficile sans regarder le code.
- voici quelques éléments pertinents (si vous re fine avec Coffeescript) gist.github.com/samsonradu/5585b0f4a101fee3cab4
- github.com/joyent/node/releases/tag/v0.10.12 voir un correctif à douille écrit. sera de mise à niveau
- Simplement en ajoutant
process.on('uncaughtException', function (err) { ... })
triés cela pour moi. Il ne va pas à la racine du problème, mais l'erreur est assez rare pour moi que cette rapide et sale solution est parfaite pour mon cas d'utilisation. - Liés: si quelqu'un voit ce qui se passe sur quelques nuages/les offres PaaS, il pourrait être parce que les instances sont de limitation vers le bas (pendant les heures creuses).
Vous devez vous connecter pour publier un commentaire.
Vous l'avez deviné déjà: c'est une erreur de connexion.
"ECONNRESET" moyens de l'autre côté de la TCP conversation brusquement fermé la fin de la connexion. Ceci est probablement dû à une ou plusieurs application les erreurs de protocole. Vous pouvez consulter l'API de serveur de logs pour voir si elle se plaint de quelque chose.
Mais puisque vous êtes également à la recherche d'un moyen pour vérifier l'erreur et potentiellement déboguer le problème, vous devriez jeter un oeil à "Comment déboguer une prise de raccrocher erreur dans NodeJS?" qui a été affiché sur stackoverflow par rapport à un comme question.
MODIFIER (2013-07-22)
Comme je l'ai écrit ci-dessus:
Ce pourrait aussi être le cas: à des moments aléatoires, l'autre côté est surchargé et simplement tue la connexion en tant que résultat. Si c'est le cas, dépend de ce que vous êtes connecté à exactement...
Mais une chose est sûre: vous avez en effet une erreur de lecture sur votre connexion TCP qui provoque l'exception. Vous pouvez le voir en regardant le code d'erreur vous avez publié dans votre édition, qui le confirme.
Un simple serveur tcp, j'ai eu pour servir le flash de la politique de fichier a été à l'origine de ce. Je peux maintenant capture de l'erreur à l'aide d'un gestionnaire de:
socket.destroy()
dans le gestionnaire d'erreur pour s'en assurer. Malheureusement je ne peux pas trouver de la documentation si elle est nécessaire, mais il n'émet pas une erreur de le faire.J'ai eu un problème similaire où les applications ont commencé erroring arrière après une mise à niveau du Nœud. Je crois que ce qui peut être retracée à Nœud version v0.9.10 ce point:
Les versions précédentes ne serait pas d'erreur sur les interruptions de la part du client. Une pause dans la connexion entre le client génère l'erreur ECONNRESET dans le Nœud. Je crois que c'est fonctionnalité prévue pour le Nœud, de sorte que le fix (au moins pour moi) a été de gérer l'erreur, qui, je crois vous l'avez fait dans ce type d'exception. Bien que je la poignée dans le filet.prise de gestionnaire.
Vous pouvez le démontrer:
Faire une simple prise de serveur et obtenir Nœud v0.9.9 et v0.9.10.
De le démarrer à l'aide de v0.9.9, puis à tenter de FTP pour ce serveur. Je suis à l'aide de FTP et le port 21 est uniquement parce que je suis sur Windows et que vous avez un client FTP, mais pas de client telnet à portée de main.
Puis à partir du côté client, juste de rompre la connexion. (Je suis juste en faisant Ctrl-C)
Vous ne devriez PAS voir d'ERREUR lors de l'utilisation de Nœud v0.9.9, et d'ERREUR lors de l'utilisation de Nœud v. 0.9.10.
Dans la production, j'utilise de la v. 0.10. quelque chose et il donne toujours l'erreur. Encore une fois, je pense que c'est prévu et la solution est de gérer l'erreur dans votre code.
Eu le même problème aujourd'hui.
Après quelques recherches j'ai trouvé un très utile
--abort-sur-uncaught exception
node.js option. Non seulement il fournit beaucoup plus détaillé et utile d'erreur trace de la pile, mais aussi d'économiser fichier de base sur le crash de l'application permet de déboguer.J'ai été confrontée au même problème mais j'ai atténué par la mise en place:
avant
server.listen
.server
est un serveur HTTP ici. Le délai d'attente par défaut est de 2 minutes, comme par le La documentation de l'API.Un autre cas possible (mais rare) pourrait être si vous avez le serveur de communications de serveur et que vous avez défini
server.maxConnections
à une valeur très faible.Du noeud de base lib net.js il va appeler
clientHandle.close()
qui sera également la cause de l'erreur ECONNRESET:maxConnections
valeur par défaut estInfinity
. Ce serait le cas (comme vous l'avez dit) si vous avez explicitement dépassé cette valeur.Oui, votre portion de la politique de fichier peut certainement causer le crash.
Répéter, il suffit d'ajouter un délai à votre code:
...et l'utilisation de
telnet
de se connecter au port. Si vous vous déconnectez telnet avant le délai a expiré, vous obtiendrez un crash (exception non interceptée) lors de la prise.écrire déclenche une erreur.Afin d'éviter l'accident voici, il suffit d'ajouter un gestionnaire d'erreur avant la lecture/écriture de la douille:
Lorsque vous essayez de le au-dessus de vous déconnecter, vous obtenez un message de log au lieu d'un crash.
Et lorsque vous avez terminé, n'oubliez pas de supprimer le délai.
Je reçois aussi des ECONNRESET erreur lors de mon développement, la façon dont je le résoudre est par pas à l'aide de nodemon pour démarrer mon serveur, il suffit d'utiliser
"node server.js"
pour démarrer mon serveur fixe mon problème.C'est bizarre, mais cela a fonctionné pour moi, maintenant, je ne vois jamais de ECONNRESET erreur à nouveau.
J'ai eu cette Erreur de trop et a été en mesure de le résoudre après des jours de débogage et analyse:
ma solution
Pour moi VirtualBox (pour le menu fixe) a été le Problème. J'ai eu la Redirection de Port configuré sur ma VM et l'erreur ne s'est produite sur le port transféré.
conclusions générales
Les observations suivantes peuvent vous épargner des jours de travail, j'ai dû investir:
-> déterminer si quelque chose est de déconner avec votre réseau (paramètres), comme VMs, pare-feu etc., c'est probablement la cause du problème.
J'ai résolu le problème simplement en connecter à un autre réseau. C'est l'un des problèmes possibles.
Comme discuté ci-dessus, ECONNRESET signifie que le TCP conversation brusquement fermé la fin de la connexion.
Votre connexion internet bloque peut-être vous connecter à certains serveurs. Dans mon cas, j'ai essayé de vous connecter à mLab ( cloud service de base de données qui héberge les bases de données MongoDB). Et mon fournisseur d'accès internet est bloque.
J'avais résolu ce problème en faisant:
npm update
dans le terminal de mise à jour de mnp.Après que j'ai essayé la même mnp commande et la bonne chose a travaillé sur ce sujet. Je n'étais pas sûr que c'est aussi simple que cela.
J'utilise CENTOS 7
Essayez d'ajouter ces options de socket.io:
J'espère que cela va vous aider !