2013-10-14 2 views
5

Я запускаю веб-приложение на сервере Node.js, и мне нужно, чтобы он был онлайн все время, поэтому я использую навсегда. Но вот что я получаю после определенного периода времени:Node.js - сервер закрыл соединение?

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 

У меня есть еще два сервера, которые были запущенными в течение 10 дней подряд. У меня есть «keepalive» loop на всех серверах, делая запрос «select 1» mysql каждые 5 минут или около того, но похоже, что это не имеет никакого значения.

Любые идеи?

EDIT 1

Мои другие серверы давали подобную ошибку, я думаю, что это было «соединение тайм-аут», поэтому я ставлю эту функцию:

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

И фиксированной мои другие два сервера , Но на моем основном сервере я все еще получаю ошибку выше.

Вот как я начинаю мой главный сервер:

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

Я не уверен, какой код вы заинтересованы в том, чтобы. В основном сервер является REST API, и он должен постоянно оставаться в стороне. Он получает около 2-5, может быть, 10 запросов в минуту.

+0

Похоже, ваш сценарий приложения имеет некоторые ошибки. Попробуйте запустить 'node app.js' вместо того, чтобы навсегда увидеть ошибку. – Sriharsha

+0

В журнале нет ошибок, я попытался запустить его с помощью node-dev. Это единственное сообщение об ошибке, которое я вижу. –

+0

Сообщите нам больше о своем приложении, чтобы мы могли понять, что происходит. Вы оставляете сокет открытым против mysql? Зачем? Это удаленная база данных? – TheBronx

ответ

13

Ошибка не связана с вашим экземпляром HTTPS, это связано с вашим подключением к MySQL.

Соединение с базой данных неожиданно завершается и не обрабатывается. Чтобы исправить это, вы можете использовать решение для повторного подключения вручную, или вы можете использовать пул соединений, который автоматически обрабатывает повторные подключения.

Здесь приведен пример повторного подключения вручную, взятый из документации 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

Извините за поздний ответ. Я просто заменил свой код на свой ответ, и я запускаю сервер. Мы должны знать завтра, если это сработает :) Cheers –

+0

Это сработало? также, @hexacyanide, любые мысли о том, почему это даже понадобится? почему соединение MySql продолжает теряться спорадически? –

+2

Я впервые наткнулся на эту ошибку. После нескольких месяцев бесперебойной работы соединение MySQL неожиданно оказалось недоступным. Оказалось, что у меня установлен пакет с установленными «автоматическими обновлениями», и он автоматически применил обновление безопасности для MySQL, в результате чего перезагрузился сервер MySQL. –

Смежные вопросы