如何让节点应用程序运行?

时间:2013-05-11 13:28:34

标签: node.js ubuntu upstart forever

我终于完成了将我的一个项目转换为使用Node.JS,但现在我遇到了让我的应用程序在服务器上运行的问题:/问题是如果我关闭我的putty会话Node就停止了。 / p>

我已经对此问题进行了大量搜索,似乎创建upstart脚本并使用Forever模块是可行的。

我开始谷歌搜索并创建了这个新贵脚本:

#!upstart
description "Loner NodeJS app launcher"
author      "me@me.com"

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,当我关闭putty会话时服务器仍在运行。一切都好。

但是,我今天早上来了,发现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 forever@0.9.2 Error: No compatible version found: node-fork@'>=0.4.0- <0.5.0-'
npm ERR! error installing forever@0.9.2 No valid targets found.
npm ERR! error installing forever@0.9.2 Perhaps not compatible with your version of node?
npm ERR! error installing forever@0.9.2     at installTargetsError (/usr/local/lib/node_modules/npm/lib/cache.js:424:10)
npm ERR! error installing forever@0.9.2     at /usr/local/lib/node_modules/npm/lib/cache.js:406:17
npm ERR! error installing forever@0.9.2     at saved (/usr/local/lib/node_modules/npm/lib/utils/npm-registry-client/get.js:136:7)
npm ERR! error installing forever@0.9.2     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!     <npm-@googlegroups.com>
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!     <npm-@googlegroups.com>
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

我应该采取哪些措施来解决这个问题?我完全没有想法。我一直在谷歌搜索各种技术细节,我只是没有到达任何地方。

非常感谢任何帮助:)

7 个答案:

答案 0 :(得分:6)

  1. 首先,您应该关注杀死节点服务器的内容。永远不会“解决”问题。每次节点退出/重新启动时,导致问题,您的用户可能会丢失数据。 upstartforever只是助推器。 (实际上,Upstart会重新启动你的服务器,但如果你的服务器没有继续运行,它会放弃。)

    找到/修复每个错误源的唯一长期解决方案,并编写回归测试套件以验证每个先前的问题是否已得到修复。

  2. start on startup will not work

  3. 您的forever安装因权限而中断。试试sudo npm install -g forever 高级: 您的整个服务器设置应该编写脚本。这样您就可以设置一个镜像生产的测试/临时服务器。一个简单的方法是Vagrant。您可以在服务器上的同一操作系统上“本地”开发。你可以测试一下“重新启动时会出现node吗?”或“如果服务器被清除,我可以从基础操作系统重新创建我的服务器吗?”

答案 1 :(得分:5)

经过几个小时的重新配置后,我想我终于解决了我的问题!看起来我可能有2个版本的节点或东西!供将来参考:如果您不熟悉Node,请确保安装nvm以简化管理节点版本,并且您不会遇到此问题:)

答案 2 :(得分:2)

经过大量的研究和不好的解决方案后,我发现pm2(Keymetrics的一部分,由Karlos推荐)是迄今为止最好的解决方案。你可以在这里找到它:

http://pm2.keymetrics.io/

答案 3 :(得分:1)

我认为永远不会意外地退出你的nodejs应用程序,这可能是因为mysql&#39; wait_timeout&#39;参数默认设置为28800秒(即8小时)。 如果nodejs应用程序不与mysql数据库交互8小时,则连接将关闭。 您必须将wait_timeout值设置为&#39; MAX值&#39;(即365天)或mysql数据库设置中所需的任何其他值。

wait_timeout设置的链接:

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

在代码中添加以下代码。 此代码将在一小时内对mysql数据库执行一次ping操作,并且您的连接不会中断。

// MYSQL ping代码启动

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);

// MYSQL ping代码结束

您还可以使用processedisconnect()代码并处理代码中的特定连接错误,如下例所示。

///代码启动

function processedisconnect(){

  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

答案 4 :(得分:0)

答案 5 :(得分:0)

从日志中看,实际上你的问题实际上是你的mysql连接问题。每当mysql服务器关闭连接时,节点服务器就会死掉。您可以使用keealive或使用连接池。

答案 6 :(得分:0)

使用keymetrics.io,如果出现任何问题,它将自动重启您的节点应用程序。

https://keymetrics.io