2013-10-14 9 views
5

Ich betreibe eine Web-App auf einem Node.js-Server und ich brauche sie, um die ganze Zeit online zu sein, also benutze ich für immer. Aber hier ist, was ich nach einer Zeit bekommen:Node.js - Server hat die Verbindung geschlossen?

Error: Connection lost: The server closed the connection. 
    at Protocol.end (/home/me/private/app/node_modules/mysql/lib/protocol/Protocol.js:73:13) 
    at Socket.onend (stream.js:79:10) 
    at Socket.EventEmitter.emit (events.js:117:20) 
    at _stream_readable.js:910:16 
    at process._tickCallback (node.js:415:13) 
error: Forever detected script exited with code: 8 
error: Forever restarting script for 3 time 

Ich habe zwei weitere Server, die gerade für etwa 10 Tage ausgeführt wurden. Ich habe eine "Keepalive" -Schleife auf allen Servern, die alle 5 Minuten eine mysql-Abfrage "select 1" macht, aber es scheint, dass es keinen Unterschied macht.

Irgendwelche Ideen?

EDIT 1

Meine anderen Server wurden einen ähnlichen Fehler geben, ich denke, es "Connection Timeout" war, so habe ich diese Funktion:

function keepalive() { 
    db.query('select 1', [], function(err, result) { 
     if(err) return console.log(err);  
     console.log('Successful keepalive.'); 
    }); 
} 

Und es repariert meine beiden anderen Server . Aber auf meinem Hauptserver bekomme ich immer noch den Fehler oben.

Hier ist, wie ich meine Haupt-Server starten:

var https = require('https'); 
https.createServer(options, onRequest).listen(8000, 'mydomain.com'); 

Ich bin nicht sicher, welcher Code sind Sie daran interessiert zu sehen. Grundsätzlich ist der Server eine REST-API und muss ständig geöffnet bleiben. Es geht um 2-5, vielleicht 10 Anfragen pro Minute.

+0

Es ist wie Ihre Anwendung Skript sieht hat einige Fehler .. Der Versuch läuft 'Knoten app.js' statt immer den Fehler zu sehen. – Sriharsha

+0

Im Protokoll sind keine Fehler sichtbar, ich habe versucht, es mit Node-Dev auszuführen. Dies ist die einzige Fehlermeldung, die ich sehe. –

+0

Lassen Sie uns mehr über Ihre App wissen, damit wir verstehen können, was vor sich geht. Sie verlassen einen Socket gegen mysql offen? Warum? Ist es eine entfernte Datenbank? – TheBronx

Antwort

13

Der Fehler bezieht sich nicht auf Ihre HTTPS-Instanz, sondern auf Ihre MySQL-Verbindung.

Die Verbindung zur Datenbank wird unerwartet beendet und wird nicht verarbeitet. Um dies zu beheben, können Sie eine manuelle Reconnect-Lösung verwenden oder Sie können das Verbindungspooling verwenden, das die Wiederverbindung automatisch behandelt.

Hier ist das Beispiel für die manuelle Verbindung aus der Dokumentation node-mysql.

var db_config = { 
    host: 'localhost', 
    user: 'root', 
    password: '', 
    database: 'example' 
}; 

var connection; 

function handleDisconnect() { 
    connection = mysql.createConnection(db_config); // Recreate the connection, since 
                // the old one cannot be reused. 

    connection.connect(function(err) {    // The server is either down 
    if(err) {          // or restarting (takes a while sometimes). 
     console.log('error when connecting to db:', err); 
     setTimeout(handleDisconnect, 2000); // We introduce a delay before attempting to reconnect, 
    }          // to avoid a hot loop, and to allow our node script to 
    });          // process asynchronous requests in the meantime. 
              // If you're also serving http, display a 503 error. 
    connection.on('error', function(err) { 
    console.log('db error', err); 
    if(err.code === 'PROTOCOL_CONNECTION_LOST') { // Connection to the MySQL server is usually 
     handleDisconnect();       // lost due to either server restart, or a 
    } else {          // connnection idle timeout (the wait_timeout 
     throw err;         // server variable configures this) 
    } 
    }); 
} 

handleDisconnect(); 
+0

Entschuldigung für die verspätete Antwort. Ich habe gerade meinen Code durch Ihre Antwort ersetzt und ich starte den Server. Wir sollten bis morgen wissen, ob es funktioniert :) Prost –

+0

Hat es funktioniert? auch, @hexacyanide, irgendwelche Gedanken darüber, warum das überhaupt nötig wäre? Warum geht die MySql-Verbindung sporadisch verloren? –

+2

Ich bin gerade zum ersten Mal auf diesen Fehler gestoßen. Nach monatelanger Verfügbarkeit war die MySQL-Verbindung plötzlich nicht mehr verfügbar. Es stellte sich heraus, dass ich ein Paket namens "unattended-upgrades" installiert hatte, und dass ein MySQL-Sicherheitsupdate automatisch angewendet wurde, was zu einem Neustart des MySQL-Servers führte. –

Verwandte Themen