2013-05-11 59 views
6

我終於完成了我的轉化項目中使用Node.js的之一,但現在我有問題,保持我的應用程序在服務器上運行:/的問題是,如果我關閉我的膩子會議節點,只需停止。如何讓節點應用程序運行?

我已經做了大量的搜索這個問題,似乎創建一個upstart腳本和使用Forever模塊是要走的路。

我開始使用Google並創造了這個暴發戶腳本:

#!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昨晚和服務器運行呆當我關閉膩子會議。都好。

不過,我來到這個早上,發現該節點的應用程序已經停止,所以我檢查了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 

我應該採取什麼措施來解決這一問題?我完全沒有想法。我一直在google搜索各種技術細節,而且我什麼都沒有找到。

任何幫助是極大的讚賞:)

+0

似乎建興您運行的是舊版本的節點。你可以嘗試升級,看看它是否有任何改變。要查看運行的版本,可以運行process.version;在節點控制檯中。 我相信你也想運行帶有全局標誌安裝。 npm install -g永久 – 2013-05-11 13:36:56

+0

jjmpsp @ alex:〜$ node > process.version 'v0.10.5' – 2013-05-11 14:16:08

+0

我試過運行'sudo npm install -g forever':/ hmm – 2013-05-11 14:16:59

回答

5

經過幾個小時的重新配置後,我想我終於解決了我的問題!看起來我可能有2個版本的節點或其他東西!對於未來的參考:如果你是新的節點,一定要安裝nvm使管理節點的版本更容易,就不會遇到這個問題:)

6
  1. 首先,你應該專注於什麼殺死你的節點服務器。永遠不會「解決」問題。每當節點退出/重新啓動它導致問題和您的用戶可以鬆散的數據。 upstartforever只是創可貼。 (事實上​​,Upstart會重啓你的服務器,但是如果你的服務器不能繼續運行,它將放棄。)

    找到/修復每個錯誤來源的唯一的長期解決方案,並寫回歸測試套件驗證每個以前的問題已被修復。

  2. start on startupwill not work

  3. forever安裝,因爲權限的破產。嘗試sudo npm install -g forever 高級: 整個服務器的設置應該照本宣科。這樣你就可以建立一個反映生產的測試/臨時服務器。一個簡單的方法是Vagrant。您可以在服務器上的相同操作系統上進行「本地」開發。你可以測試的東西,如「不node來了,當我重新啓動嗎?」或者「如果服務器被清除了,我可以從基本操作系統重新創建我的服務器嗎?」

+0

正如你所看到的,我是所有這些新手:p我已經嘗試過'sudo npm install -g forever',但是我仍然會像以前一樣得到和以前一樣的錯誤,永遠安裝。很奇怪,錯誤日誌仍然顯示'npm ERR!節點-v v0.5.11-pre'當我知道我正在運行v0.10.5。至於找到錯誤的來源,我編寫了我的代碼,以便它能夠有效地處理錯誤,但似乎我在錯誤日誌中描述的錯誤是由一個內置的Node模塊引起的。你有什麼建議,爲什麼永遠仍然沒有安裝?謝謝 :) – 2013-05-11 14:44:31

0

從日誌什麼似乎是你的情況下,問題是你的MySQL連接。每當mysql服務器關閉連接時,節點服務器就會死亡。您可以使用基本信息或使用連接池。

1

我覺得永遠不會意外退出你的應用程序的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 db,並且你的連接不會中斷。

// 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 
2

了大量的研究和壞的解決方案之後,我發現PM2(Keymetrics的一部分,由卡洛斯推薦)是迄今爲止最好的解決方案。你可以在這裏找到它:

http://pm2.keymetrics.io/

相關問題