Node JS ECONNRESET

Uruchamiam aplikację Express js z socket.io na pogawędkę webapp i dostaję następujący błąd losowo około 5 razy podczas 24h. proces węzła jest zawinięty na zawsze i uruchamia się ponownie natychmiast.

Problem polega na tym, że restart express wyrzuca moich użytkowników z pokoi i nikt tego nie chce.

Serwer WWW jest proxy przez HAProxy. Nie ma problemów ze stabilnością gniazd, wystarczy użyć transportów websockets i flashsockets. Nie mogę tego odtworzyć. celowo.

To jest błąd z 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

Edytuj (2013-07-22)

Dodał oba socket.io Client error handler i uncaught exception handler. Wygląda na to, że ten wyłapuje błąd:

process.on('uncaughtException', function (err) {
  console.error(err.stack);
  console.log("Node NOT Exiting...");
});

Więc podejrzewam, że to nie socket.io problem, ale żądanie http do innego serwera, który robię lub połączenie mysql / redis. Problem polega na tym, że stos błędów nie pomaga mi zidentyfikować mojego problemu z kodem. Oto wyjście dziennika:

Error: read ECONNRESET
    at errnoException (net.js:900:11)
    at TCP.onread (net.js:555:19)

Jak wiesz, co jest tego przyczyną? Jak uzyskać więcej z błędu?

Ok, nie bardzo gadatliwe, ale tutaj jest stacktrace z "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] ] } }

Tutaj podaję plik polityki gniazda flash:

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)
Czy to może być przyczyna?
Author: Samson, 2013-06-22

11 answers

Możesz się już domyślić: to błąd połączenia.

"ECONNRESET" oznacza, że druga strona rozmowy TCP nagle zamknęła swój koniec połączenia. Jest to najprawdopodobniej spowodowane jednym lub kilkoma błędami protokołu aplikacji. Możesz spojrzeć na dzienniki serwera API, aby zobaczyć, czy na coś narzeka.

Ale ponieważ szukasz również sposobu, aby sprawdzić błąd i potencjalnie debugować problem, powinieneś spojrzeć na "Jak debugować błąd zawieszenia gniazda w NodeJS?" który został opublikowany w stackoverflow w związku z podobnym pytaniem.

Szybkie i brudne rozwiązanie dla rozwoju :

Użyj longjohn , otrzymasz długie ślady stosu, które będą zawierały operacje asynchroniczne.

Czysty i prawidłowy roztwór : Technicznie, w node, gdy emitujesz Zdarzenie 'error' i nikt go nie słucha, wyrzuci . Aby nie rzucać, umieść słuchacza zajmij się tym sam. W ten sposób możesz zarejestrować błąd, podając więcej informacji.

Aby mieć jeden słuchacz dla grupy połączeń, możesz użyć domen , a także wychwycić inne błędy w uruchomieniu. Upewnij się, że każda operacja asynchroniczna związana z http (serwer / klient)jest w innym kontekście domena w porównaniu z innymi częściami kodu, domena automatycznie nasłuchuje zdarzeń error i propaguje je do własnej procedury obsługi. Więc słuchasz tylko tego opiekuna i uzyskać dane o błędach. otrzymujesz również więcej informacji za darmo.

Edytuj (2013-07-22)

Jak pisałem wyżej:

"ECONNRESET" oznacza, że druga strona rozmowy TCP nagle zamknęła swój koniec połączenia. Jest to najprawdopodobniej spowodowane jednym lub kilkoma błędami protokołu aplikacji. Możesz spojrzeć na dzienniki serwera API, aby zobaczyć, czy na coś narzeka.

Co może być również w przypadku: w przypadkowych czasach, druga strona jest przeciążona i po prostu zabija połączenie w wyniku. Jeśli tak, to zależy od tego, z czym dokładnie się łączysz ...

Ale jedno jest pewne: rzeczywiście masz błąd odczytu w połączeniu TCP, który powoduje wyjątek. Możesz to zobaczyć, patrząc na kod błędu, który opublikowałeś w edycji, który to potwierdza.

 187
Author: e-sushi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:54:44

Prosty serwer tcp, który miałem do serwowania pliku polityki Flasha, powodował to. Teraz mogę wyłapać błąd używając obsługi:

# serving the flash policy file
net = require("net")

net.createServer((socket) =>
  //just added
  socket.on("error", (err) =>
    console.log("Caught flash policy server socket error: ")
    console.log(err.stack)
  )

  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)
 29
Author: Samson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-23 08:38:09

Miałem podobny problem, gdzie aplikacje zaczęły erroring out Po aktualizacji węzła. Wydaje mi się, że można to prześledzić do wydania Node v0.9. 10 tego elementu:

  • net: nie tłumić ECONNRESET (Ben Noordhuis)

Poprzednie wersje nie powodowałyby błędów podczas przerw ze strony klienta. Przerwa w połączeniu z klientem powoduje błąd ECONNRESET w węźle. Uważam, że jest to zamierzona funkcjonalność dla węzła, więc poprawka (przynajmniej dla mnie) polegała na obsłudze błędu, co, jak sądzę, robiliście bez wyjątków. Chociaż radzę sobie z tym w sieci.obsługa gniazda.

Możesz to zademonstrować:

Stwórz prosty serwer socket i pobierz Node v0.9.9 i v0. 9. 10.

require('net')
    .createServer( function(socket) 
    {
           // no nothing
    })
    .listen(21, function()
     {
           console.log('Socket ON')
    })

Uruchom go za pomocą wersji 0.9.9, a następnie spróbuj FTP do tego serwera. Używam FTP i portu 21 tylko dlatego, że jestem na Windows i mam klienta FTP, ale nie Telnet klient poręczny.

Następnie od strony klienta, po prostu przerwać połączenie. (Robię tylko Ctrl-C)

Nie powinieneś widzieć żadnego błędu podczas korzystania z Node v0.9. 9 i błędu podczas korzystania z Node V.0. 9. 10 i nowszych.

W produkcji używam V.0. 10. coś i nadal daje błąd. Ponownie, myślę, że jest to zamierzone i rozwiązaniem jest poradzenie sobie z błędem w kodzie.

 23
Author: John Williams,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-21 14:13:51

Miałem do czynienia z tym samym problemem, ale złagodziłem go umieszczając:

server.timeout = 0;

Przed server.listen. server jest tutaj serwer HTTP. Domyślny limit czasu wynosi 2 minuty zgodnie z dokumentacją API .

 12
Author: Ashish Kaila,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-11 09:58:03

Miałem ten sam problem dzisiaj. Po kilku badaniach znalazłem bardzo przydatne --abort-on-uncaught-exception węzeł.opcja js . Nie tylko zapewnia znacznie więcej szczegółowego i użytecznego śledzenia stosu błędów, ale także zapisuje plik core w przypadku awarii aplikacji, umożliwiając dalsze debugowanie.

 12
Author: Suzana_K,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-19 12:38:50

Tak, Twój plik polisy może spowodować katastrofę.

Aby powtórzyć, wystarczy dodać opóźnienie do kodu:

net.createServer( function(socket) 
{
  for(i=0; i<1000000000; i++);
  socket.write("<?xml version=\"1.0\"?>\n")
…

... i użyj telnet, aby połączyć się z portem. Jeśli odłączysz telnet przed upływem opóźnienia, otrzymasz awarię (wyjątek nieobciążony)podczas gniazdka.write wyrzuca błąd.

Aby uniknąć awarii tutaj, po prostu dodaj obsługę błędów przed odczytaniem / zapisem gniazda:

net.createServer( function(socket) 
{
  for(i=0; i<1000000000; i++);
  socket.on('error', function() { console.log("error"); });
  socket.write("<?xml version=\"1.0\"?>\n")

Gdy spróbujesz powyższego rozłączenia, otrzymasz wiadomość dziennika zamiast wypadku.

A kiedy skończysz, pamiętaj, aby usunąć opóźnienie.
 6
Author: Joachim Isaksson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-21 14:15:36

Innym możliwym przypadkiem (ale rzadkim) może być, jeśli masz komunikację z serwerem i ustawiłeś server.maxConnections na bardzo niską wartość.

In node ' s core lib net.js wywoła {[2] } co również spowoduje błąd ECONNRESET:

if (self.maxConnections && self._connections >= self.maxConnections) {
  clientHandle.close(); // causes ECONNRESET on the other end
  return;
}
 5
Author: happy_marmoset,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-12 12:03:06

Problem rozwiązałem po prostu podłączając się do innej sieci. Jest to jeden z możliwych problemów.

Jak wspomniano powyżej, ECONNRESET oznacza, że rozmowa TCP nagle zakończyła swój koniec połączenia.

Twoje połączenie internetowe może blokować połączenie z niektórymi serwerami. W moim przypadku próbowałem połączyć się z mlab (cloud database service, która obsługuje bazy danych MongoDB). I mój ISP to blokuje.

 1
Author: Yousef,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-10 11:27:35

Dostaję również błąd ECONNRESET podczas mojego rozwoju, sposób, w jaki go rozwiązuję, polega na nie używaniu nodemona do uruchamiania serwera, po prostu użyj "node server.js", aby uruchomić serwer Naprawiono mój problem.

To dziwne, ale u mnie działało, teraz już nigdy nie widzę błędu ECONNRESET.

 1
Author: Andrew Lam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-26 16:18:15

Też miałem ten błąd i udało mi się go rozwiązać po kilku dniach debugowania i analizy:

Moje rozwiązanie

Dla mnie problemem był VirtualBox (dla Dockera). Miałem skonfigurowane przekierowanie portów na mojej maszynie wirtualnej, a błąd wystąpił tylko na przekierowanym porcie.

Wnioski ogólne

Poniższe obserwacje mogą zaoszczędzić Ci dni pracy, które musiałem zainwestować:

  • dla mnie problem wystąpił tylko przy połączeniach z localhost do localhost na jednym porcie. - >sprawdź zmiana którejkolwiek z tych stałych rozwiązuje problem.
  • u mnie problem wystąpił tylko na mojej maszynie - > niech ktoś inny spróbuje.
  • dla mnie problem pojawił się dopiero po chwili i nie można go wiarygodnie odtworzyć
  • mój Problem nie mógł być sprawdzony za pomocą żadnego z węzłów lub narzędzi expresses (debug -). - >nie trać czasu na to[12]}

-> dowiedz się, czy coś namiesza w Twojej sieci (- settings), np. maszyny wirtualne, zapory sieciowe itp., to jest prawdopodobnie przyczyna problemu.

 1
Author: Waog,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-04 16:02:07

Spróbuj dodać te opcje do socket.io:

const options = { transports: ['websocket'], pingTimeout: 3000, pingInterval: 5000 };
Mam nadzieję, że to wam pomoże !
 0
Author: sol-ibit,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-19 17:40:31