मैं अपनी प्रक्रिया के रूप में Node.js एप्लिकेशन को कैसे चलाऊँ?


195

Node.js को तैनात करने का सबसे अच्छा तरीका क्या है?

मेरे पास एक ड्रीमहोस्ट वीपीएस है (जिसे वे VM कहते हैं ), और मैं Node.js स्थापित करने और एक प्रॉक्सी स्थापित करने में सक्षम रहा हूं। यह तब तक बढ़िया काम करता है जब तक मैं SSH कनेक्शन रखता हूँ कि मैंने नोड को खुले में शुरू किया था।


6
हम्म, यह मुझे अजीब लगता है कि आप फॉरएवर का उपयोग करके "नोड.जेएस की तैनाती" कहते हैं। क्या यह सिर्फ एक प्रक्रिया की निगरानी / पर्यवेक्षण उपकरण नहीं है? आमतौर पर वेब परिनियोजन का अर्थ होता है (कम से कम मुझे लेखों में क्या मिलता है) कई अंतर्संबंधित गतिविधियाँ जो वेब ऐप को उपलब्ध कराती हैं (यह प्रक्रिया उपकरण इसका एक हिस्सा है)। वैसे भी, यह अभी भी StackOverflow में एक महान पोस्ट है जैसा कि मैंने सभी के उत्तरों से सीखा है।
मिकॉन्ग

यह सिर्फ Dreamhost पर नोड.जेएस की सबसे सरल तैनाती है। लक्ष्य केवल नोड को मज़बूती से चलाने के लिए प्रारंभिक बिंदु के रूप में बनाना था।
सम्मान 16:15

पोर्ट नोड पर डोमेन को आगे बढ़ाने के लिए आपने कैसे संभाला है?
15

2
@grm मैं HTTP- प्रॉक्सी github.com/nodejitsu/node-http-proxy
respectTheCode

हम अभी इलास्टिक बीनस्टॉक का उपयोग कर रहे हैं और यह काफी अच्छी तरह से काम कर रहा है।
सम्मानTheCode

जवाबों:


107

2016 का उत्तर : लगभग हर लिनक्स वितरण सिस्टमड के साथ आता है, जिसका अर्थ है हमेशा के लिए, मोनिट, पीएम 2, आदि अब आवश्यक नहीं हैं - आपका ओएस इन कार्यों को संभालता है

एक myapp.serviceफ़ाइल बनाएं (अपने ऐप के नाम के साथ 'myapp' की जगह, जाहिर है):

[Unit]
Description=My app

[Service]
ExecStart=/var/www/myapp/app.js
Restart=always
User=nobody
# Note Debian/Ubuntu uses 'nogroup', RHEL/Fedora uses 'nobody'
Group=nobody
Environment=PATH=/usr/bin:/usr/local/bin
Environment=NODE_ENV=production
WorkingDirectory=/var/www/myapp

[Install]
WantedBy=multi-user.target

ध्यान दें कि यदि आप यूनिक्स के लिए नए हैं: पहली पंक्ति में /var/www/myapp/app.jsहोना चाहिए #!/usr/bin/env node

अपनी सेवा फ़ाइल को /etc/systemd/systemफ़ोल्डर में कॉपी करें ।

नई सेवा के बारे में systemd को बताएं systemctl daemon-reload

इसके साथ शुरू करो systemctl start myapp

इसे बूट पर चलाने के लिए सक्षम करें systemctl enable myapp

के साथ लॉग देखें journalctl -u myapp

यह कैसे हम लिनक्स, 2018 संस्करण पर नोड ऐप्स को तैनात करते हैं , जिसमें लिनक्स / नोड सर्वर ( .serviceफ़ाइल सहित ) बनाने के लिए AWS / DigitalOcean / Azure CloudConfig बनाने के लिए कमांड भी शामिल हैं ।


1
कैसे से निपटने के लिए पर कोई विचार Failed to issue method call: Unit name ... is not valid.?
जूलियन जेनस्टोक्स

1
@JulienGenestoux 'यूनिट' नाम आपकी सेवा के समान है। ऐसा लगता है कि वहाँ एक विसंगति है। आपके द्वारा फ़ाइल को कॉपी करने के बाद आपको /etc/systemd/systemचलाने की आवश्यकता हो सकती है systemctl daemon-reload(सिस्टमड सामान्य रूप से आपको बताएगा कि क्या इसकी आवश्यकता है)। टीबीएच यह सबसे अच्छा एक अलग प्रश्न के रूप में पूछा जाता है।
मिकमेकाना 19

3
अपनी सेवा फ़ाइल को कॉपी करने के बजाय /etc/systemd/system, आप बस उपयोग कर सकते हैं systemctl enable /full/path/to/myapp.service, जो /etc/systemd/systemआपके लिए एक सिमिलिंक बनाता है ।
आरएन

1
यह pm2 के साथ तुलना कैसे करता है? क्या यह pm2 की जगह ले सकता है या pm2 अधिक आवश्यक सुविधाएँ प्रदान करता है?
सर्गेई बशारोव

1
@VinodSrivastav nodeको /var/www/myapp/app.jsही कहा जाता है। यूनिक्स में, यदि आप किसी फ़ाइल को निष्पादन योग्य बनाते हैं, और पहली पंक्ति #!/some/fileफ़ाइल से शुरू होती है, तो उस बाइनरी के साथ व्याख्या की जाएगी। अधिक जानने के लिए Google 'दुभाषिया यूनिक्स'।
मिकमेकाना

101

फॉरएवर का उपयोग करें । यह अलग-अलग प्रक्रियाओं में Node.js प्रोग्राम चलाता है और यदि कोई मर जाता है तो उन्हें पुनः आरंभ करता है।

उपयोग:

  • forever start example.js एक प्रक्रिया शुरू करने के लिए।
  • forever list सभी प्रक्रियाओं की सूची हमेशा के लिए शुरू करना
  • forever stop example.jsप्रक्रिया को रोकने के लिए, या forever stop 0इंडेक्स 0 के साथ प्रक्रिया को रोकने के लिए (जैसा कि दिखाया गया है forever list)।

यह करीब है। यह ठीक है, लेकिन मुझे कुछ भी नहीं रोकना शुरू होता है। मैं लॉग आउट करने और वापस करने और फिर नोड प्रक्रिया को मारने में सक्षम था। हमेशा के लिए इसे पुनः आरंभ नहीं किया। इसलिए मैं कुछ सोच रहा हूं कि यह कैसे काम करता है डीएच के साथ संगत नहीं है।
सम्मान .कोड

@ केविन, आप नोड प्रक्रिया को नहीं मार सकते क्योंकि हमेशा के लिए नोड पर चलता है! मैंने अपने उत्तर में कुछ उपयोग निर्देश जोड़े हैं, जिसमें एक प्रक्रिया को रोकना भी शामिल है। मैं अपने VPS पर इसका उपयोग कर रहा हूं और यह एक आकर्षण की तरह काम कर रहा है।
डेविड टैंग

forever stop 0एक त्रुटि थी और चीजें वहां से अलग हो गईं। मैं अपने स्वयं के उपयोगकर्ता पर रूट के बिना ऐसा करने की कोशिश कर रहा हूं ताकि मैं सही समाधान खोजने के बाद आसानी से साफ कर सकूं। यह मेरी समस्या हो सकती है। मैं इस पर कुछ और गौर करूंगा।
सम्मानTheCode

मैं npm के साथ कुछ गलत था जो समस्या पैदा कर रहा था। एनपीएम और नोड के साथ सही ढंग से स्थापित हमेशा के लिए महान काम करता है। मैंने जो किया, उसे हमेशा के लिए शुरू करने के लिए एक क्रोनजॉब सेट पर कमांड को फिर से शुरू करने के लिए जोड़ रहा था। अब मैं एक छोटे नोड ऐप पर काम कर रहा हूं, जो मुझे हमेशा के लिए प्रॉपर शुरू और बंद करने देगा।
सम्मानTheCode

हमेशा के लिए एक विकल्प है जो नोड के मूल क्लस्टर API का उपयोग करता है: github.com/superjoe30/naught
andrewrk

41

मैंने अपनी तैनाती विधि के बारे में यहां लिखा है: नोड्स.जैस एप्स की तैनाती

संक्षेप में:

  • गिट पोस्ट-प्राप्त हुक का उपयोग करें
  • निर्माण उपकरण के लिए जेक
  • नोड के लिए एक सेवा आवरण के रूप में आगे बढ़ें
  • मॉनिटर और इसे फिर से शुरू करने वाले अनुप्रयोगों को फिर से शुरू करने के लिए
  • एक ही सर्वर पर विभिन्न अनुप्रयोगों के लिए मार्ग का अनुरोध करने के लिए nginx

2
अगर मैं अपने सर्वर पर हमेशा एक ही नोड साइट रखूंगा, तो क्या मैं निगनेक्स को सुरक्षित रूप से खोद सकता हूं?
डोर

3
लिंक टूटा हुआ लगता है
verybadalloc

@ मुझे पता है कि यह देर से उत्तर है, लेकिन मैं नहीं करूंगा। एसएसएल समाप्ति और कैशिंग जैसी चीजों के अलावा, मेजबान के सामने एक nginx रिवर्स प्रॉक्सी आपको पोर्ट 80 पर सीधे नोड चलाने की तुलना में अधिक बुनियादी सुविधा देता है। इसका मतलब यह भी है कि आपको नोड को रूट के रूप में चलाने की ज़रूरत नहीं है, जो मुझे लगता है कि है नेगनेक्स सेटअप के पक्ष में एक बहुत भारी तर्क।
क्रिस ब्राउन

16

pm2 चालें करता है।

विशेषताएं हैं: निगरानी, ​​हॉट कोड पुनः लोड, बिल्ट-इन लोड बैलेंसर, स्वचालित स्टार्टअप स्क्रिप्ट और पुनरुत्थान / डंप प्रक्रिया।


क्या यह हेरोकू जैसी सेवाओं के साथ संगत है?
FRD

@ आरएफडी मुझे नहीं लगता कि यह हर्को के साथ काम करता है, इस लेख की
'19

9

आप उपयोग कर सकते हैं monit, forever, upstartयाsystemd अपने सर्वर शुरू करने के लिए।

आप Nginx के बजाय वार्निश या HAProxy का उपयोग कर सकते हैं (Nginx websockets के साथ काम नहीं करने के लिए जाना जाता है)।

एक त्वरित और गंदे समाधान के रूप में आप nohup node your_app.js &अपने ऐप को अपने सर्वर से समाप्त करने से रोकने के लिए उपयोग कर सकते हैं , लेकिन forever, monitऔर अन्य प्रस्तावित समाधान बेहतर हैं।


2
एक उपयोगकर्ता "सर्गेई यारत्सकी" ने आपको यह कहते हुए पोस्ट संपादित करने की कोशिश की कि नग्नेक्स अब वेबस्केट्स का समर्थन करता है (संस्करण 1.3 से)। मैंने संपादन को अस्वीकार कर दिया क्योंकि मुझे लगता है कि इसे टिप्पणी के रूप में पोस्ट किया जाना चाहिए। (अन्यथा आप एक ही पोस्ट में दो विरोधाभासी वाक्य हैं, जो भ्रामक है।)
बैकलिन

7

मैंने अपने ऐप्स के लिए वर्तमान में उपस्टार्ट स्क्रिप्ट बनाई है:

description "YOUR APP NAME"
author "Capy - http://ecapy.com"

env LOG_FILE=/var/log/node/miapp.log
env APP_DIR=/var/node/miapp
env APP=app.js
env PID_NAME=miapp.pid
env USER=www-data
env GROUP=www-data
env POST_START_MESSAGE_TO_LOG="miapp HAS BEEN STARTED."
env NODE_BIN=/usr/local/bin/node
env PID_PATH=/var/opt/node/run
env SERVER_ENV="production"

######################################################

start on runlevel [2345]
stop on runlevel [016]

respawn
respawn limit 99 5

pre-start script
    mkdir -p $PID_PATH
    mkdir -p /var/log/node
end script

script
    export NODE_ENV=$SERVER_ENV
    exec start-stop-daemon --start --chuid $USER:$GROUP --make-pidfile --pidfile $PID_PATH/$PID_NAME --chdir $APP_DIR --exec $NODE_BIN -- $APP >> $LOG_FILE 2>&1
end script

post-start script
    echo $POST_START_MESSAGE_TO_LOG >> $LOG_FILE
end script

######## से पहले सभी को अनुकूलित करें, /etc/init/your-service.conf में एक फ़ाइल बनाएं और वहां पेस्ट करें।

तब आप कर सकते हो:

start your-service
stop your-service
restart your-service
status your-service

धन्यवाद, बस मुझे जो चाहिए था।
निल्सन मोरिस

6

मैंने Node.js को तैनात करने के लिए एक बहुत व्यापक मार्गदर्शिका लिखी है, उदाहरण फ़ाइलों के साथ:

ट्यूटोरियल: Node.js अनुप्रयोगों को कैसे लागू करें, उदाहरणों के साथ

इसमें http- प्रॉक्सी, एसएसएल और सॉकेट.आईओ जैसी चीजें शामिल हैं ।


यह बहुत अच्छा लग रहा है। मैं विकास और आरंभिक प्रक्षेपण के लिए हरोकू का उपयोग कर रहा हूं, लेकिन अंततः अतीत के हेरोकू को स्केल करने और सीधे EC2 पर तैनात करने की आवश्यकता होगी। जब मेरे पास समय होगा मैं इसके साथ खेलूंगा।
सम्मानTheCode

5

यहाँ इस समस्या को systemd के साथ हल करने पर एक लंबा लेख दिया गया है: http://savanne.be/articles/deploying-node-js-with-systemd/

ध्यान रखने योग्य कुछ बातें:

  • आपकी प्रक्रिया की निगरानी कौन शुरू करेगा? फॉरएवर एक महान उपकरण है, लेकिन इसे खुद को चालू रखने के लिए एक निगरानी उपकरण की आवश्यकता होती है। यह थोड़ा मूर्खतापूर्ण है, क्यों न सिर्फ अपने init प्रणाली का उपयोग करें?
  • क्या आप अपनी प्रक्रियाओं की पर्याप्त निगरानी कर सकते हैं?
  • क्या आप कई बैकएंड चला रहे हैं? यदि हां, तो क्या आपके पास संसाधन उपयोग के संदर्भ में उनमें से किसी को भी नीचे लाने से रोकने के लिए प्रावधान हैं?
  • क्या हर समय सेवा की जरूरत होगी? यदि नहीं, तो सॉकेट सक्रियण पर विचार करें (लेख देखें)।

ये सभी चीजें सिस्टमैड के साथ आसानी से हो जाती हैं।


5

यदि आपके पास रूट एक्सेस है तो आप बेहतर डेमॉन स्थापित करेंगे ताकि यह बैकग्राउंड में सुरक्षित और साउंड चलाए। आप यह पढ़ सकते हैं कि ब्लॉग पोस्ट में सिर्फ डेबियन और उबंटू के लिए यह कैसे करें Node.js को Ubuntu पर एक सेवा के रूप में चलाएं


मुझे नहीं लगा कि मेरे पास जड़ है लेकिन ऐसा लगता है कि मुझे इसे वेब पैनल में सक्षम करना है। मैं इसे एक शॉट दूंगा।
सम्मान .कोड

3

हमेशा के लिए कर देगा चाल।

@ केविन: आपको प्रक्रियाओं को ठीक से मारने में सक्षम होना चाहिए। मैं डॉक्यूमेंट को थोड़ा जाँचूँगा। यदि आप त्रुटि को पुन: उत्पन्न कर सकते हैं तो इसे GitHub पर एक मुद्दे के रूप में पोस्ट करना बहुत अच्छा होगा।


केविन कौन है? ओपी?
पीटर मोर्टेंसन


2

जैसा कि Box9 ने कहा, फॉरएवर उत्पादन कोड के लिए एक अच्छा विकल्प है। लेकिन यह भी संभव है कि अगर एसएसएच एक प्रक्रिया को जारी रखे कि ग्राहक से कनेक्शन बंद ।

आवश्यक रूप से उत्पादन के लिए एक अच्छा विचार नहीं है, यह बहुत आसान है जब लंबे डिबग सत्रों के बीच में, या लंबी प्रक्रियाओं के कंसोल आउटपुट का पालन करने के लिए, या जब भी आपके एसएसएच कनेक्शन को डिस्कनेक्ट करने के लिए उपयोगी होता है, लेकिन सर्वर में टर्मिनल को जीवित रखें बाद में पुन: कनेक्ट करने के लिए (जैसे कि घर पर Node.js एप्लिकेशन को शुरू करना और बाद में कंसोल पर फिर से कनेक्ट करना यह जांचने के लिए कि चीजें कैसे चल रही हैं)।

यह मानते हुए कि आपका सर्वर * निक्स बॉक्स है, आप क्लाइंट SSH के बंद होने की प्रक्रिया को चालू रखने के लिए शेल से स्क्रीन कमांड का उपयोग कर सकते हैं । आप वेब से स्क्रीन को डाउनलोड / इंस्टॉल कर सकते हैं यदि पहले से इंस्टॉल नहीं है (अपने वितरण के लिए पैकेज की तलाश करें यदि लिनक्स, या ओएसपी के लिए मैकपोर्ट का उपयोग करें )।

यह निम्नलिखित के रूप में काम करता है:

  1. जब आप पहली बार SSH कनेक्शन खोलते हैं, तो 'स्क्रीन' टाइप करें - यह आपका स्क्रीन सेशन शुरू करेगा।
  2. सामान्य के रूप में काम करना शुरू करें (यानी अपना Node.js आवेदन शुरू करें)
  3. जब आप कर लें, तो अपना टर्मिनल बंद कर दें। आपकी सर्वर प्रक्रिया (तों) चलती रहेगी।
  4. अपने कंसोल को पुन: कनेक्ट करने के लिए, सर्वर पर वापस जाएं, लॉगिन करें और फिर से कनेक्ट करने के लिए 'स्क्रीन -r' दर्ज करें। आपका पुराना कंसोल संदर्भ पॉप का उपयोग करने के लिए आपको फिर से तैयार करेगा।
  5. स्क्रीन से बाहर निकलने के लिए, सर्वर से कनेक्ट होने के दौरान, कंसोल प्रॉम्प्ट पर 'बाहर निकलें' टाइप करें - जो आपको नियमित शेल पर छोड़ देगा।

यदि आप की जरूरत है तो आप इस तरह से कई स्क्रीन सत्र चला सकते हैं, और आप किसी भी क्लाइंट से इसे कनेक्ट कर सकते हैं। सभी विकल्पों के लिए प्रलेखन ऑनलाइन पढ़ें।


अच्छी जानकारी है। मैं मानता हूं कि यह उत्पादन के लिए काम नहीं करेगा लेकिन रिमोट सर्वर पर डीबगिंग के समय यह बहुत उपयोगी हो सकता है।
सम्मान .कोड

न सिर्फ नोहप नोड myapp.js और 2> /var/log/myapp.log 1> / dev / null
markus_p

मुझे यह av उपयोगी मिल गया है youtube.com/watch?v=P4mT5Tbx_KE समझाने nohupऔरforever
विनोद श्रीवास्तव

1

ऐप को चालू रखने के लिए फॉरएवर एक अच्छा विकल्प है (और यह एक मॉड्यूल के रूप में npm इंस्टॉल करने योग्य है जो अच्छा है)।

लेकिन अधिक गंभीर 'तैनाती' के लिए - तैनाती के दूरस्थ प्रबंधन, पुनः आरंभ करने, कमांड चलाने आदि जैसी चीजें - मैं नोड विस्तार के साथ कैपिस्ट्रानो का उपयोग करूंगा।

https://github.com/loopj/capistrano-node-deploy


1

https://paastor.com एक अपेक्षाकृत नई सेवा है जो आपके लिए VPS या अन्य सर्वर पर तैनाती करती है। कोड पुश करने के लिए एक CLI है। पस्तोर में एक निशुल्क टियर है, कम से कम यह पोस्टिंग के समय किया था।


1

आपके मामले में आप अपस्टार्ट डेमॉन का उपयोग कर सकते हैं । एक पूर्ण परिनियोजन समाधान के लिए, मैं कैपिस्ट्रानो का सुझाव दे सकता हूं । दो उपयोगी मार्गदर्शिकाएँ हैं कि Node.js env को कैसे सेटअप करें और capistrano + upstart के माध्यम से कैसे परिनियोजित करें


अंतिम दो के लिए मृत लिंक
पैट

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.