【问题标题】:How to keep node app running?如何保持节点应用程序运行?
【发布时间】:2013-05-06 01:03:39
【问题描述】:

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

我在这个问题上做了很多搜索,似乎创建一个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,当我关闭腻子会话时,服务器仍然运行。都很好。

但是,我今天早上来了,发现 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)

今天我在谷歌上搜索得更多,发现如果 NodeJS 应用程序意外退出,Forever 实际上会重新启动它。我尝试使用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

我应该采取什么步骤来解决这个问题?我完全没有想法。我一直在谷歌上搜索各种技术细节,但我一无所获。

非常感谢任何帮助:)

【问题讨论】:

  • 您运行的是旧版本的节点似乎很简单。您可以尝试升级,看看是否有任何不同。要查看您运行的版本,您可以运行 process.version;在节点控制台中。我相信您还想使用全局标志运行安装。 npm install -g 永远
  • jjmpsp@alex:~$ node > process.version 'v0.10.5'
  • 我也尝试过运行“sudo npm install -g forever”:/ hmm
  • 奇怪的是错误日志还是显示'npm ERR! node -v v0.5.11-pre' 当我知道我正在运行 v0.10.5

标签: node.js ubuntu upstart forever


【解决方案1】:
  1. 首先,您应该关注正在杀死您的节点服务器的原因。 Forever 不会“解决”问题。每次节点退出/重新启动时,它导致问题,并且您的用户可能会丢失数据。 upstartforever 只是创可贴。 (事实上​​,Upstart 会重启你的服务器,但如果你的服务器不继续运行它就会放弃。)

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

  2. start on startupwill not work

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

【讨论】:

  • 如您所知,我对所有这些都是新手:p 我已经尝试过“sudo npm install -g forever”,但在永久安装时仍然遇到与以前相同的错误。奇怪的是错误日志仍然显示'npm ERR! node -v v0.5.11-pre' 当我知道我正在运行 v0.10.5 时。至于查找错误的来源,我已经编写了代码,因此它也可以有效地处理错误,但我在错误日志中跟踪的错误似乎是由内置的 Node 模块之一引起的。你对为什么永远没有安装有什么建议吗?谢谢你:)
【解决方案2】:

在痛苦的几个小时重新配置一切之后,我想我终于解决了我的问题!看起来我可能有 2 个版本的节点之类的!供将来参考:如果您是 Node 新手,请务必安装 nvm 以便更轻松地管理节点版本,您不会遇到此问题 :)

【讨论】:

    【解决方案3】:

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

    http://pm2.keymetrics.io/

    【讨论】:

      【解决方案4】:

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

      wait_timeout 设置链接:

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

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

      // 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 代码结束

      您还可以使用 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
      

      【讨论】:

        【解决方案5】:

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            【解决方案7】:

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

            https://keymetrics.io

            【讨论】:

              猜你喜欢
              • 2017-04-29
              • 1970-01-01
              • 1970-01-01
              • 2016-01-04
              • 1970-01-01
              • 2014-06-10
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多