Как поддерживать работу приложения узла?

Я наконец-то закончил преобразование одного из своих проектов для использования Node.JS, но теперь у меня проблемы с поддержанием работы моего приложения на сервере: / Проблема в том, что если я закрою сеанс шпатлевки, узел просто остановится.

Я провел много поисков по этой проблеме, и кажется, что создание сценария upstart и использование модуля Forever — это правильный путь.

Я начал гуглить и создал этот выскочка скрипт:

#!upstart
description "Loner NodeJS app launcher"
author      "[email protected]"

start on startup
stop on shutdown

script
    export HOME="/root"
    exec sudo node /home/jjmpsp/server.js >> /home/jjmpsp/server.sys.log 2>&1
end script

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

Однако сегодня утром я обнаружил, что приложение Node остановилось, поэтому я проверил файл server.sys.log, чтобы узнать, что происходит. Кажется, что приложение работало нормально, пока в конце концов не столкнулось с этим исключением:

debug: client authorized
info: handshake authorized fziLHZA3Vo9i55eubvOq

events.js:48
        throw arguments[1]; // Unhandled 'error' event
                       ^
Error: Connection lost: The server closed the connection.
    at Protocol.end (/home/jjmpsp/node_modules/mysql/lib/protocol/Protocol.js:73:13)
    at Socket.onend (stream.js:80:10)
    at Socket.emit (events.js:88:20)
    at TCP.onread (net.js:348:51)

Сегодня я еще больше погуглил и обнаружил, что Forever фактически перезапустит приложение NodeJS, если оно неожиданно завершится. Я попытался установить модуль с помощью npm install forever, но получил огромный список ошибок:

jjmpsp@alex:~$ npm install forever
npm ERR! error installing [email protected] Error: No compatible version found: node-fork@'>=0.4.0- <0.5.0-'
npm ERR! error installing [email protected] No valid targets found.
npm ERR! error installing [email protected] Perhaps not compatible with your version of node?
npm ERR! error installing [email protected]     at installTargetsError (/usr/local/lib/node_modules/npm/lib/cache.js:424:10)
npm ERR! error installing [email protected]     at /usr/local/lib/node_modules/npm/lib/cache.js:406:17
npm ERR! error installing [email protected]     at saved (/usr/local/lib/node_modules/npm/lib/utils/npm-registry-client/get.js:136:7)
npm ERR! error installing [email protected]     at Object.cb [as oncomplete] (/usr/local/lib/node_modules/npm/node_modules/graceful-fs/graceful-fs.js:36:9)
npm ERR! Error: No compatible version found: node-fork@'>=0.4.0- <0.5.0-'
npm ERR! No valid targets found.
npm ERR! Perhaps not compatible with your version of node?
npm ERR!     at installTargetsError (/usr/local/lib/node_modules/npm/lib/cache.js:424:10)
npm ERR!     at /usr/local/lib/node_modules/npm/lib/cache.js:406:17
npm ERR!     at saved (/usr/local/lib/node_modules/npm/lib/utils/npm-registry-client/get.js:136:7)
npm ERR!     at Object.cb [as oncomplete] (/usr/local/lib/node_modules/npm/node_modules/graceful-fs/graceful-fs.js:36:9)
npm ERR! Report this *entire* log at:
npm ERR!     <http://github.com/isaacs/npm/issues>
npm ERR! or email it to:
npm ERR!     <[email protected]>
npm ERR!
npm ERR! System Linux 3.8.4-x86_64-linode31
npm ERR! command "node" "/usr/local/bin/npm" "install" "forever"
npm ERR! cwd /home/jjmpsp
npm ERR! node -v v0.5.11-pre
npm ERR! npm -v 1.0.106
npm ERR! Error: EACCESS, Permission denied 'npm-debug.log'
npm ERR! Report this *entire* log at:
npm ERR!     <http://github.com/isaacs/npm/issues>
npm ERR! or email it to:
npm ERR!     <[email protected]>
npm ERR!
npm ERR! System Linux 3.8.4-x86_64-linode31
npm ERR! command "node" "/usr/local/bin/npm" "install" "forever"
npm ERR! cwd /home/jjmpsp
npm ERR! node -v v0.5.11-pre
npm ERR! npm -v 1.0.106
npm ERR! path npm-debug.log
npm ERR! code EACCESS
npm ERR!
npm ERR! Additional logging details can be found in:
npm ERR!     /home/jjmpsp/npm-debug.log
npm not ok

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

Любая помощь приветствуется :)


person Joel Murphy    schedule 11.05.2013    source источник
comment
Кажется легким, вы используете старую версию узла. Можете ли вы попробовать обновить и посмотреть, есть ли разница. Чтобы узнать, какую версию вы используете, вы можете запустить process.version; в консоли узла. Я полагаю, вы также хотите запустить установку с глобальным флагом. npm установить -g навсегда   -  person Marcus Granström    schedule 11.05.2013
comment
jjmpsp@alex:~$ узел › process.version 'v0.10.5'   -  person Joel Murphy    schedule 11.05.2013
comment
Я тоже пытался запустить «sudo npm install -g навсегда»: / хм   -  person Joel Murphy    schedule 11.05.2013
comment
Странно, что журнал ошибок по-прежнему показывает «npm ERR! node -v v0.5.11-pre', когда я знаю, что запускаю v0.10.5   -  person Joel Murphy    schedule 11.05.2013


Ответы (7)


  1. Во-первых, вы должны сосредоточиться на том, что убивает ваш сервер узла. Навсегда проблему не решить. Каждый раз, когда узел выходит или перезапускается, он будет вызывать проблемы, и ваши пользователи могут потерять данные. upstart или forever - это просто лейкопластырь. (На самом деле Upstart перезапустит ваш сервер, но сдастся, если ваш сервер перестанет работать.)

    Единственное долгосрочное решение для поиска/исправления каждого источника ошибок и написания набора регрессионных тестов для проверки того, что все предыдущие проблемы были устранены.

  2. start on startup не будет работать

  3. Ваша forever установка прервалась из-за разрешений. Попробуйте sudo npm install -g forever Дополнительно: вся настройка вашего сервера должна быть написана по сценарию. Таким образом, вы можете настроить тестовый/промежуточный сервер, отражающий производственный. один простой способ сделать это — Vagrant. Вы можете разрабатывать локально на той же ОС, что и на вашем сервере. И вы можете проверить, например, появляется ли node при перезагрузке? или если сервер будет уничтожен, могу ли я воссоздать свой сервер из базовой ОС?

person BraveNewCurrency    schedule 11.05.2013
comment
Как вы можете сказать, я новичок во всем этом: p Я пробовал «sudo npm install -g forever», но все равно получаю ту же ошибку, что и раньше, при установке навсегда. Странно, что журнал ошибок по-прежнему показывает «npm ERR! node -v v0.5.11-pre', когда я знаю, что использую v0.10.5. Что касается поиска источника ошибок, я написал свой код так, чтобы он также эффективно обрабатывал ошибки, но кажется, что ошибка, которую я отследил в журнале ошибок, была вызвана одним из встроенных модулей Node. Есть ли у вас какие-либо предложения о том, почему навсегда не устанавливается? Спасибо :) - person Joel Murphy; 11.05.2013

После нескольких мучительных часов перенастройки всего, я думаю, что наконец решил свою проблему! Похоже, у меня могло быть 2 версии узла или что-то в этом роде! Для справки в будущем: если вы новичок в Node, обязательно установите nvm, чтобы упростить управление версиями узла, и у вас не возникнет этой проблемы :)

person Joel Murphy    schedule 11.05.2013

После долгих исследований и неудачных решений я обнаружил, что pm2 (часть Keymetrics, рекомендованная Карлосом) на сегодняшний день является лучшим решением. Вы можете найти это здесь:

http://pm2.keymetrics.io/

person Nukey    schedule 26.01.2016

Я думаю, что навсегда не выходит из вашего приложения nodejs неожиданно, это может быть из-за параметра mysql 'wait_timeout', который по умолчанию установлен на 28800 секунд (т.е. 8 часов). Если приложение nodejs не взаимодействует с базой данных mysql в течение 8 часов, соединение закрывается. Вы должны установить значение wait_timeout на «МАКСИМАЛЬНОЕ значение» (т.е. 365 дней) или любое другое значение, которое вам требуется в настройках базы данных mysql.

Ссылка на настройки wait_timeout:

http://dev.mysql.com/doc/refman/5.0/en/server-system-variables.html#sysvar_wait_timeout

or

Добавьте следующий код в свой код. Этот код будет пинговать базу данных mysql раз в час, и ваше соединение не разорвется.

// Запускается ping-код MYSQL

function keepalive() 
{
     conn.query('select 1', [], function(err, result) 
     {
         if(err) 
         return console.log(err);
         // Successul keepalive
         console.log("keepalive: "+ result);
     });
}

setInterval(keepalive, 1000*60*60);

// ping-код MYSQL заканчивается

Вы также можете использовать код handledisconnect() и обрабатывать конкретную ошибку соединения в коде, как показано в примере ниже.

///Код начинается

функция обработчика отключения () {

  log.info("handledisconnect()");
    // Reading config.json file for database connection
    var db_config = JSON.parse(fs.readFileSync(appRoot + "/conf.json"));

    conn = mysql.createConnection(db_config);

    conn.connect(function(err) {

        if (err) {

            log.error('error when connecting to db : ',err);
            // We introduce a delay before attempting to reconnect
            setTimeout(handledisconnect, 200);
        } else {
            log.info("database connected");
        }
    });

    conn.on('error', function(err) {

        log.error('db error : ',err);

        // handling the reconnection for 'PROTOCOL_CONNECTION_LOST' error
        if (err.code === 'PROTOCOL_CONNECTION_LOST') {

            log.error(err);
            setTimeout(handledisconnect, 200);
            handledisconnect();

        } else {
            log.error(err);
        }
        // handling the reconnection for 'EADDRINUSE' error
        if (err.code === 'EADDRINUSE') {

            setTimeout(handledisconnect, 200);
            handledisconnect();

        } else {

            log.error(err);
        }
        // handling the reconnection for 'ECONNREFUSED' error
        if (err.code === 'ECONNREFUSED') {

            log.error(err);
            setTimeout(handledisconnect, 200);
            handledisconnect();

        } else {
            log.error(err);
        }

    });

///**** ADD YOUR CODE HERE****////

}
handledisconnect();
/// Code ends
person Karlos    schedule 09.01.2015

https://unix.stackexchange.com/questions/479/keep-ssh-sessions-running-after-disconnection

сделай это:

screen // затем нажмите Enter node server.js

person BRogers    schedule 22.11.2013

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

person Vickrant    schedule 03.03.2014

Используйте keymetrics.io, он автоматически перезапустит ваше приложение node, если возникнет какая-либо проблема.

https://keymetrics.io

person Karlos    schedule 30.07.2015