2013-05-11 6 views
6

मैंने आखिरकार अपनी परियोजनाओं में से एक को नोड.जेएस का उपयोग करने के लिए परिवर्तित कर दिया है, लेकिन अब मुझे सर्वर पर अपना ऐप चलाने में समस्याएं आ रही हैं:/समस्या यह है कि अगर मैं अपना पट्टी सत्र बंद करता हूं तो नोड बस बंद हो जाता है।नोड ऐप कैसे चलाना है?

मैंने इस समस्या पर बहुत सी खोज की है, और ऐसा लगता है कि upstart स्क्रिप्ट बनाना और Forever मॉड्यूल का उपयोग करने का तरीका है।

मैं googling शुरू कर दिया है और इस नवोदय स्क्रिप्ट बनाया:

#!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) 

आज मैं और भी अधिक googling किया गया है और पता चला कि हमेशा के लिए वास्तव में एक 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

लगता लाइट आप नोड के एक पुराने संस्करण चला रहे हैं। क्या आप कोशिश कर सकते हैं और अपग्रेड कर सकते हैं और देख सकते हैं कि इससे कोई फर्क पड़ता है या नहीं। यह देखने के लिए कि आप कौन सा संस्करण चलाते हैं, आप process.version चला सकते हैं; एक नोड कंसोल में। मेरा मानना ​​है कि आप भी वैश्विक ध्वज के साथ स्थापित करना चाहते हैं। npm install -g हमेशा के लिए –

+0

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

+0

मैंने 'sudo npm install -g हमेशा के लिए' चलाने की कोशिश की है:/hmm –

उत्तर

5

सब कुछ ठीक करने के दर्दनाक कुछ घंटों के बाद, मुझे लगता है कि मैंने अंततः मेरी समस्या हल कर ली है! ऐसा लगता है कि मेरे पास नोड या कुछ के 2 संस्करण हो सकते हैं!भविष्य में संदर्भ के लिए: यदि आप नोड के लिए नए हैं, नोड संस्करणों के प्रबंधन आसान बनाने के लिए nvm स्थापित करने के लिए सुनिश्चित हो और आप इस समस्या :)

6
  1. सबसे पहले, आप अपने नोड सर्वर मार रहा है पर ध्यान देना चाहिए। हमेशा के लिए समस्या को ठीक करने के लिए नहीं जा रहा है। हर बार नोड बाहर निकलता है/इसे पुनरारंभ करता है समस्याएं पैदा कर सकता है और आपके उपयोगकर्ता डेटा खो सकते हैं। upstart या forever केवल बैंड-एड्स हैं। (वास्तव में, अपस्टार्ट आपके सर्वर को पुनरारंभ करेगा, लेकिन अगर आपका सर्वर चल रहा नहीं है तो यह छूट देगा।)

    त्रुटियों के प्रत्येक स्रोत को खोजने/ठीक करने और एक रिग्रेशन टेस्ट सूट लिखने का एकमात्र दीर्घकालिक समाधान सत्यापित करें कि प्रत्येक पिछली समस्या ठीक हो गई है।

  2. start on startupwill not work

  3. आपका forever क्योंकि अनुमतियों के तोड़ दिया स्थापित करें। sudo npm install -g forever उन्नत: आपका संपूर्ण सर्वर सेटअप स्क्रिप्ट किया जाना चाहिए। इस तरह आप एक परीक्षण/स्टेजिंग सर्वर स्थापित कर सकते हैं जो उत्पादन को प्रतिबिंबित करता है। ऐसा करने का एक आसान तरीका Vagrant है। आप उसी सर्वर पर "स्थानीय रूप से" विकसित कर सकते हैं जो आपके सर्वर पर है। और आप रीबूट करते समय "node" जैसी चीजों का परीक्षण कर सकते हैं? या "अगर सर्वर मिटा दिया जाता है, तो क्या मैं बेस ओएस से अपना सर्वर फिर से बना सकता हूं?"

+0

जैसा कि आप बता सकते हैं, मैं इन सबके लिए नया हूं: पी मैंने हमेशा 'sudo npm install -g' की कोशिश की है, लेकिन मुझे हमेशा के लिए इंस्टॉल करते समय पहले की तरह ही त्रुटि मिलती है। यह अजीब बात है कि त्रुटि लॉग अभी भी 'एनपीएम ईआरआर दिखाता है! node -v v0.5.11-pre 'जब मुझे पता है कि मैं v0.10.5 चला रहा हूं। त्रुटियों के स्रोत को खोजने के लिए, मैंने अपना कोड लिखा है, इसलिए यह त्रुटियों को कुशलता से भी संभालता है, लेकिन ऐसा लगता है कि त्रुटि लॉग में जो त्रुटि आई है वह अंतर्निहित नोड मॉड्यूल में से एक के कारण हुई थी। क्या आपके पास कोई सुझाव है कि हमेशा के लिए क्यों इंस्टॉल नहीं हो रहा है? धन्यवाद :) –

0

लॉग से जो वास्तव में आपके मामले में समस्या है, वह आपके mysql कनेक्शन है। जब भी mysql सर्वर कनेक्शन बंद कर देता है तो नोड सर्वर मर जाएगा। आप एक केइलीव का उपयोग कर सकते हैं या कनेक्शन पूलिंग का उपयोग कर सकते हैं।

1

मुझे लगता है कि हमेशा के लिए आपके नोडजेस ऐप अप्रत्याशित रूप से बाहर नहीं निकलता है, यह mysql 'wait_timeout' पैरामीटर के कारण हो सकता है जो डिफ़ॉल्ट रूप से 28800 सेकेंड (यानी 8 घंटे) पर सेट होता है। यदि नोडजेस ऐप 8 घंटे के लिए mysql डेटाबेस से इंटरैक्ट नहीं करता है, तो कनेक्शन बंद हो जाता है। आपको प्रतीक्षा_टाउटआउट मान को 'MAX मान' (यानी 365 दिन) या किसी अन्य मान को सेट करना होगा जैसा कि आपको mysql db सेटिंग्स में आवश्यक है। wait_timeout सेटिंग्स के लिए

लिंक:

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

या

अपने कोड में निम्न कोड जोड़ें। यह कोड एक घंटे में एक बार mysql डीबी पिंग करेगा और आपका कनेक्शन नहीं टूट जाएगा।

// 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 (Keymetrics का हिस्सा है, Karlos द्वारा अनुशंसित) अब तक का सबसे अच्छा समाधान द्वारा किया जाना है। आप इसे यहाँ पा सकते हैं:

http://pm2.keymetrics.io/

संबंधित मुद्दे