2013-05-11 14 views
6

私は最終的に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) 

今日、私はもっとグーグルでてきたし、それが予期せず終了した場合に永遠に実際にNodeJSアプリを再起動することを発見した:最終的にこの例外が発生したまではアプリが細かい走っているようです。私はnpm install foreverでモジュールをインストールしようとしたが、私は、エラーのこの膨大なリストを取得する:

私はこの問題を解決するために取るべき手順
[email protected]:~$ npm install forever 
npm ERR! error installing [email protected] Error: No compatible version found: [email protected]'>=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: [email protected]'>=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 

を?私は完全にアイデアがありません。私はあらゆる種類の技術的な詳細をグーグルで探していて、どこにもいないだけです。

すべてのヘルプは大歓迎です:)

+0

を使用すると、ノードの古いバージョンを実行しているliteのようです。試してアップグレードして、それが何か変わるかどうか確認できますか?実行しているバージョンを確認するには、process.versionを実行します。ノードコンソールで実行します。 私はあなたもグローバルフラグでインストールを実行すると思います。 npm install -g forever –

+0

jjmpsp @ alex:〜$ node > process.version 'v0.10.5' –

+0

私は「sudo npm install -g forever」も実行しようとしました:/hmm –

答えて

5

すべての設定を苦痛な数時間後、私は最終的に私の問題を解決したと思います!私はノードや何かの2つのバージョンを持っているかもしれないように見えます!今後の参考のために:あなたはノードを初めて使用する場合は、ノードのバージョンを管理しやすくするためにnvmをインストールしてください、あなたはこの問題:)

6
  1. まず、あなたのノードサーバを殺して何に焦点を当てるべきです。永遠に問題を「修正」するつもりはありません。ノードが終了/再起動するたびにになります。は問題を引き起こし、ユーザーはデータを失う可能性があります。 upstartまたはforeverはただのバンドエイドです。 (実際には、Upstartはサーバーを再起動しますが、サーバーが稼働していない場合は放棄します)

    エラーの各ソースを見つけて修正し、回帰テストスイートを作成する唯一の長期的なソリューション以前の各問題が修正されていることを確認してください。

  2. start on startupwill not work

  3. あなたforeverための権限を破ってインストールします。試してみてくださいsudo npm install -g forever 詳細: あなたのサーバー全体の設定をスクリプト化する必要があります。このようにして、本番環境を反映するテスト/ステージングサーバーを設定できます。これを行う簡単な方法の1つはVagrantです。あなたは、あなたのサーバ上にある同じOS上に「ローカルに」開発することができます。そして、 "再起動するとnodeが来る?"または「サーバが一掃された場合、ベースOSからサーバを再作成することはできますか?」

+0

あなたが知ることができるように、私はこのすべてを初めて知っています:私は 'sudo npm install -g forever'を試みましたが、永遠にインストールするときには以前と同じエラーが表示されます。エラーログに「npm ERR!」と表示されるのは奇妙です。 node -v v0.5.11-pre '私がv0.10.5を実行していることを知ったとき。エラーの原因を見つけるために、コードを書いてエラーを効率的に処理するようにしましたが、エラーログでトレースされたエラーは、組み込みのノードモジュールによって発生しているようです。永遠にまだインストールしていない理由について何か提案がありますか?ありがとうございました :) –

0

ログから、あなたのケースで実際に問題と思われるものは、あなたのmysql接続です。 mysqlサーバが接続を閉じると、ノードサーバは死ぬでしょう。あなたは嫌がらせや接続プールを使うことができます。

1

nodejsアプリが予期せず終了するとは思われません。mysqlのwait_timeoutパラメータがデフォルトで28800秒(つまり8時間)に設定されている可能性があります。 nodejsアプリケーションがmysqlデータベースと8時間対話しない場合、接続は閉じられます。 wait_timeoutの値を 'MAX値'(つまり365日)に設定するか、mysql db設定で必要な値を設定する必要があります。 WAIT_TIMEOUT設定の

リンク:

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

または

あなたのコードに次のコードを追加します。 このコードは1時間に1回mysql dbに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); 

// MYSQLピングコードが

を終了します。またhandledisconnect()コードを使用することができ、実施例で与えられるコードで特定の接続エラーを処理起動以下。いずれかの問題が発生した場合

///コードが

関数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 
0

使用keymetrics.ioを開始し、それが自動的にノード・アプリケーションを再起動します。研究と悪いソリューションの多くの後

https://keymetrics.io

2

、私はこれまでで最高のソリューションであることがPM2(Karlosが推奨するKeymetricsの一部を、)を発見しました。あなたはここでそれを見つけることができます:

http://pm2.keymetrics.io/