ฉันจะรันแอปพลิเคชัน Node.js เป็นกระบวนการของตัวเองได้อย่างไร


195

วิธีที่ดีที่สุดในการปรับใช้ Node.js คืออะไร

ฉันมี Dreamhost VPS (นั่นคือสิ่งที่พวกเขาเรียกว่าVM ) และฉันสามารถติดตั้ง Node.js และตั้งค่าพร็อกซีได้ มันใช้งานได้ดีตราบใดที่ฉันรักษาการเชื่อมต่อ SSH ที่ฉันเริ่มโหนดด้วยการเปิด


6
อืมฉันรู้สึกแปลก ๆ ที่คุณโทรหาโดยใช้ Forever เป็น "การปรับใช้ node.js" มันไม่ใช่แค่เครื่องมือตรวจสอบ / กำกับดูแลกระบวนการใช่หรือไม่ โดยปกติแล้วการปรับใช้เว็บหมายถึง (อย่างน้อยสิ่งที่ฉันพบในบทความ) กิจกรรมที่เกี่ยวข้องกันหลายอย่างที่ทำให้แอปพลิเคชันเว็บพร้อมใช้งาน (เครื่องมือกระบวนการนี้เป็นส่วนหนึ่งของมัน) อย่างไรก็ตามนี่ยังคงเป็นโพสต์ที่ยอดเยี่ยมที่นี่ใน StackOverflow ตามที่ฉันได้เรียนรู้จากคำตอบของทุกคน
mikong

นี่เป็นเพียงการปรับใช้ node.js ที่ง่ายที่สุดบน Dreamhost เป้าหมายคือเพื่อให้โหนดทำงานได้อย่างน่าเชื่อถือว่าเป็นจุดเริ่มต้นในการสร้างจาก
respectTheCode

คุณมีวิธีจัดการการส่งต่อโดเมนไปยังโหนดพอร์ตที่กำลังทำงานอยู่ได้อย่างไร
ค่ากรัม

2
@grm ฉันใช้ HTTP-Proxy github.com/nodejitsu/node-http-proxy
respectTheCode

ตอนนี้เรากำลังใช้ Elastic Beanstalk และมันใช้งานได้ดีมาก
respectTheCode

คำตอบ:


107

คำตอบในปี 2559 : การกระจาย Linux เกือบทุกเครื่องมาพร้อมกับ systemd ซึ่งหมายความว่าไม่จำกัด Monit, PM2 และอื่น ๆ อีกต่อไป - ระบบปฏิบัติการของคุณจัดการกับงานเหล่านี้ได้แล้ว

ทำ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

หมายเหตุหากคุณยังใหม่กับ Unix: /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

สิ่งนี้นำมาจากวิธีที่เราปรับใช้แอปโหนดบน Linux รุ่น 2018ซึ่งรวมถึงคำสั่งเพื่อสร้าง AWS / DigitalOcean / Azure CloudConfig เพื่อสร้างเซิร์ฟเวอร์ Linux / โหนด (รวมถึง.serviceไฟล์)


1
ความคิดเกี่ยวกับวิธีการจัดการกับFailed to issue method call: Unit name ... is not valid.?
Julien Genestoux

1
@JulienGenestoux ชื่อ 'unit' นั้นเหมือนกับบริการของคุณ ดูเหมือนว่ามีความคลาดเคลื่อนอยู่ตรงนั้น หลังจากคุณคัดลอกไฟล์ไปยัง/etc/systemd/systemคุณอาจต้องเรียกใช้systemctl daemon-reload(โดยปกติ systemd จะแจ้งให้คุณทราบหากจำเป็น) TBH นี่เป็นคำถามที่ดีที่สุดในการแยกคำถาม
mikemaccana

3
แทนที่จะคัดลอกไฟล์บริการของคุณลงใน/etc/systemd/systemคุณสามารถใช้systemctl enable /full/path/to/myapp.serviceซึ่งสร้าง symlink ไว้/etc/systemd/systemสำหรับคุณ
Arne

1
เปรียบเทียบกับ pm2 อย่างไร สามารถแทนที่ PM2 หรือ PM2 มีคุณสมบัติที่จำเป็นมากกว่านี้ได้หรือไม่?
Sergei Basharov

1
@VinodSrivastav nodeถูกเรียกโดย/var/www/myapp/app.jsตัวมันเอง ใน Unix หากคุณสร้างไฟล์ที่ปฏิบัติการได้และบรรทัดแรกเริ่มต้นด้วย#!/some/fileไฟล์จะถูกตีความด้วยไบนารีนั้น Google 'Unix ล่าม' เพื่อทราบข้อมูลเพิ่มเติม
mikemaccana

101

ใช้ตลอดไป มันรันโปรแกรม Node.js ในกระบวนการที่แยกต่างหากและเริ่มต้นใหม่หากมีการตาย

การใช้งาน:

  • forever start example.js เพื่อเริ่มกระบวนการ
  • forever list เพื่อดูรายการกระบวนการทั้งหมดที่เริ่มโดยตลอดไป
  • forever stop example.jsเพื่อหยุดกระบวนการหรือforever stop 0หยุดกระบวนการด้วยดัชนี 0 (ดังที่แสดงโดยforever list)

ใกล้นี้ มันเริ่มต้นได้ดี แต่ฉันไม่ยอมหยุดอะไรเลย ฉันสามารถออกจากระบบและย้อนกลับแล้วฆ่ากระบวนการโหนด ไม่ได้รีสตาร์ทตลอดกาล ดังนั้นฉันจึงคิดบางอย่างเกี่ยวกับวิธีการทำงานที่ไม่เข้ากันกับ DH
respectTheCode

@Kevin คุณไม่สามารถฆ่ากระบวนการของโหนดได้เพราะ Forever จะทำงานบนโหนด! ฉันได้เพิ่มคำแนะนำการใช้งานลงในคำตอบของฉันรวมถึงวิธีการหยุดกระบวนการ ฉันเคยใช้สิ่งนี้ใน VPS ของฉันและทำงานได้อย่างมีเสน่ห์
David Tang

forever stop 0มีข้อผิดพลาดและสิ่งต่าง ๆ เพียงแค่ตกไปจากที่นั่น ฉันพยายามทำสิ่งนี้โดยไม่ต้องรูทผู้ใช้ของตัวเองเพื่อที่ฉันจะได้ทำความสะอาดได้ง่ายขึ้นเมื่อฉันพบทางออกที่ถูกต้อง นั่นอาจเป็นปัญหาของฉัน ฉันจะดูมันอีกบางส่วน
respectTheCode

ฉันมีสิ่งผิดปกติกับ npm ที่ทำให้เกิดปัญหา ด้วย npm และโหนดที่ติดตั้งอย่างถูกต้องจะใช้งานได้ดีตลอดไป สิ่งที่ฉันทำคือการเพิ่มคำสั่งเริ่มต้นตลอดกาลไปยังชุด cronjob ที่จะทำงานในการรีสตาร์ท ตอนนี้ฉันกำลังทำงานกับแอปโหนดเล็ก ๆ ที่จะให้ฉันเริ่มต้นและหยุด procs ตลอดไป
respectTheCode

มีทางเลือกอื่นสำหรับ Forever ซึ่งใช้ API เนทิฟคลัสเตอร์ของโหนด: github.com/superjoe30/naught
andrewrk

41

ฉันเขียนเกี่ยวกับวิธีการปรับใช้ของฉันที่นี่: การปรับใช้แอป node.js

ในระยะสั้น:

  • ใช้เบ็ดหลังการรับ git
  • เจคสำหรับเครื่องมือสร้าง
  • พุ่งพรวดเป็นบริการห่อหุ้มสำหรับโหนด
  • ติดตามการตรวจสอบและรีสตาร์ทแอปพลิเคชัน
  • nginxเพื่อกำหนดเส้นทางการร้องขอไปยังแอปพลิเคชันต่าง ๆ บนเซิร์ฟเวอร์เดียวกัน

2
ถ้าฉันจะมีเว็บไซต์โหนดเดียวบนเซิร์ฟเวอร์ของฉันฉันจะทิ้ง Nginx ได้อย่างปลอดภัยหรือไม่
Dor

3
ดูเหมือนว่าลิงก์จะเสีย
verybadalloc

@ หรือฉันรู้ว่านี่เป็นคำตอบที่ล่าช้า แต่ฉันไม่ต้องการ นอกเหนือจากสิ่งต่าง ๆ เช่นการยกเลิก SSL และการแคชแล้วพร็อกซีย้อนกลับ nginx ด้านหน้าโฮสต์ยังช่วยให้คุณมีความยืดหยุ่นด้านโครงสร้างพื้นฐานที่ดีกว่าการรันโหนดโดยตรงบนพอร์ต 80 นอกจากนี้ยังหมายความว่าคุณไม่จำเป็นต้องเรียกใช้โหนดเป็นรูท อาร์กิวเมนต์หนักสวยในความโปรดปรานของการตั้งค่า nginx
Chris Browne

16

pm2ทำเทคนิค

คุณสมบัติคือ: การตรวจสอบ, การโหลดรหัสร้อน, ตัวปรับสมดุลโหลดในตัว, สคริปต์เริ่มต้นอัตโนมัติ, และกระบวนการคืนชีพ / การถ่ายโอนข้อมูล


มันเข้ากันได้กับบริการเช่น Heroku?
FRD

@FRD ฉันไม่คิดว่ามันทำงานกับ heroku ตรวจสอบบทความนี้
nickleefly

9

คุณสามารถใช้monit, forever, upstartหรือsystemdเพื่อเริ่มต้นเซิร์ฟเวอร์ของคุณ

คุณสามารถใช้ Varnish หรือ HAProxy แทน Nginx (Nginx เป็นที่รู้จักกันว่าจะไม่ทำงานกับ websockets)

ในฐานะที่เป็นวิธีที่รวดเร็วและสกปรกที่คุณสามารถใช้nohup node your_app.js &เพื่อป้องกันไม่ให้ยุติแอปของคุณกับเซิร์ฟเวอร์ของคุณ แต่forever, monitและโซลูชั่นที่นำเสนออื่น ๆ จะดีกว่า


2
ผู้ใช้ "Sergey Yarotskiy" พยายามแก้ไขคุณโพสต์โดยบอกว่าตอนนี้ Nginx รองรับ WebSockets (ตั้งแต่เวอร์ชัน 1.3) ฉันปฏิเสธการแก้ไขเนื่องจากฉันคิดว่าควรโพสต์เป็นความคิดเห็นแทน (ไม่เช่นนั้นคุณจะมีสองประโยคที่ขัดแย้งกันในข้อความเดียวกันซึ่งทำให้เกิดความสับสน)
Backlin

7

ฉันสร้างสคริปต์ Upstart ในปัจจุบันสำหรับแอปของฉัน:

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

ขอบคุณสิ่งที่ฉันต้องการ
Nilson Morais

6

ฉันได้เขียนคำแนะนำที่ครอบคลุมเกี่ยวกับการปรับใช้ Node.js ด้วยไฟล์ตัวอย่าง:

บทช่วยสอน: วิธีปรับใช้แอปพลิเคชัน Node.js ด้วยตัวอย่าง

มันครอบคลุมสิ่งที่ต้องการ http-พร็อกซี่, SSLและSocket.IO


มันดูดีมาก ฉันใช้ heroku เพื่อการพัฒนาและการเปิดตัวครั้งแรก แต่ในที่สุดจะต้องปรับขนาด heroku ที่ผ่านมาและปรับใช้กับ EC2 โดยตรง ฉันจะเล่นกับสิ่งนี้เมื่อฉันมีเวลา
respectTheCode

5

นี่คือบทความอีกต่อไปในการแก้ปัญหานี้ด้วย systemd: http://savanne.be/articles/deploying-node-js-with-systemd/

สิ่งที่ควรทราบ:

  • ใครจะเป็นผู้เริ่มการตรวจสอบกระบวนการของคุณ Forever เป็นเครื่องมือที่ยอดเยี่ยม แต่ต้องการเครื่องมือตรวจสอบเพื่อให้ตัวเองทำงานต่อไป มันค่อนข้างงี่เง่าทำไมไม่ใช้ระบบเริ่มต้นของคุณล่ะ?
  • คุณสามารถตรวจสอบกระบวนการของคุณได้อย่างเพียงพอหรือไม่?
  • คุณใช้แบ็กเอนด์หลาย ๆ ถ้าเป็นเช่นนั้นคุณมีข้อกำหนดเพื่อป้องกันไม่ให้มีการลดการใช้ทรัพยากรอื่น ๆ ลงหรือไม่?
  • บริการจะต้องตลอดเวลา? ถ้าไม่ให้พิจารณาการเปิดใช้งานซ็อกเก็ต (ดูบทความ)

ทุกสิ่งเหล่านี้สามารถทำได้อย่างง่ายดายด้วย systemd


5

หากคุณมีสิทธิ์เข้าถึงรูทคุณควรตั้งค่าดีมอนเพื่อให้ทำงานได้อย่างปลอดภัยและมีเสียงในพื้นหลัง คุณสามารถอ่านวิธีการทำเพียงแค่ว่าสำหรับDebianและUbuntuในบล็อกโพสต์เรียก Node.js เป็นบริการบน Ubuntu


ฉันไม่คิดว่าฉันรูท แต่ดูเหมือนว่าฉันต้องเปิดใช้งานในแผงเว็บ ฉันจะให้นัดนี้
respectTheCode

3

ตลอดกาลจะทำเคล็ดลับ

@ เควิน: คุณควรจะสามารถฆ่ากระบวนการได้ดี ฉันจะตรวจสอบเอกสารอีกเล็กน้อย หากคุณสามารถทำให้เกิดข้อผิดพลาดได้จะเป็นการดีถ้าคุณโพสต์เป็นปัญหาใน GitHub


เควินคือใคร OP
Peter Mortensen


2

ดังที่ Box9 กล่าวว่าForeverเป็นตัวเลือกที่ดีสำหรับรหัสการผลิต แต่ก็เป็นไปได้ที่กระบวนการจะดำเนินต่อไปแม้ว่าการเชื่อมต่อSSHจะถูกปิดจากไคลเอนต์

ในขณะที่ไม่จำเป็นต้องเป็นความคิดที่ดีสำหรับการผลิตสิ่งนี้มีประโยชน์มากเมื่ออยู่ในช่วงกลางของการดีบักที่ยาวนานหรือเพื่อติดตามเอาต์พุตคอนโซลของกระบวนการที่มีความยาวหรือเมื่อใดก็ตามที่มีประโยชน์ในการตัดการเชื่อมต่อ SSH ของคุณ เพื่อเชื่อมต่อใหม่ในภายหลัง (เช่นเริ่มแอปพลิเคชัน Node.js ที่บ้านและเชื่อมต่อกับคอนโซลอีกครั้งในที่ทำงานเพื่อตรวจสอบว่าเกิดอะไรขึ้น)

สมมติว่าเซิร์ฟเวอร์ของคุณเป็นกล่อง * ระวังคุณสามารถใช้คำสั่งหน้าจอจากเชลล์เพื่อให้กระบวนการทำงานต่อไปแม้ว่าไคลเอ็นต์ SSH จะปิด คุณสามารถดาวน์โหลด / ติดตั้งหน้าจอจากเว็บหากยังไม่ได้ติดตั้ง (มองหาแพ็คเกจสำหรับการแจกจ่ายของคุณหาก Linux หรือใช้MacPortsถ้า OS X)

มันทำงานได้ดังต่อไปนี้:

  1. เมื่อคุณเปิดการเชื่อมต่อ SSH ครั้งแรกให้พิมพ์ 'หน้าจอ' ซึ่งจะเป็นการเริ่มเซสชันหน้าจอของคุณ
  2. เริ่มทำงานตามปกติ (เช่นเริ่มแอปพลิเคชัน Node.js ของคุณ)
  3. เมื่อเสร็จแล้วให้ปิดเทอร์มินัลของคุณ กระบวนการเซิร์ฟเวอร์ของคุณจะทำงานต่อไป
  4. ในการเชื่อมต่อกับคอนโซลของคุณให้กลับไปที่เซิร์ฟเวอร์ล็อกอินและป้อน 'screen -r' เพื่อเชื่อมต่อใหม่ บริบทคอนโซลเก่าของคุณจะกลับมาพร้อมให้คุณใช้งานต่อ
  5. หากต้องการออกจากหน้าจอในขณะที่เชื่อมต่อกับเซิร์ฟเวอร์ให้พิมพ์ 'exit' บนหน้าจอพร้อมท์ของคอนโซลซึ่งจะนำคุณไปสู่เชลล์ปกติ

คุณสามารถมีเซสชันหลายหน้าจอที่ทำงานพร้อมกันเช่นนี้หากคุณต้องการและคุณสามารถเชื่อมต่อกับมันจากลูกค้าใด ๆ อ่านเอกสารออนไลน์สำหรับตัวเลือกทั้งหมด


ข้อมูลที่ดีที่จะมี ฉันยอมรับว่ามันใช้งานไม่ได้กับการผลิต แต่อาจมีประโยชน์มากเมื่อทำการดีบักบนเซิร์ฟเวอร์ระยะไกล
respectTheCode

ทำไมไม่ใช้เพียงโหนด nohup myapp.js & 2> /var/log/myapp.log 1> / dev / null
markus_p

ฉันพบสิ่งนี้โดยใช้ประโยชน์youtube.com/watch?v=P4mT5Tbx_KEอธิบายnohupและforever
Vinod Srivastav

1

Forever เป็นตัวเลือกที่ดีในการทำให้แอปทำงานอยู่ (และสามารถติดตั้งเป็นโมดูลซึ่งดีมาก)

แต่สำหรับการ 'ปรับใช้' ที่จริงจังกว่า - สิ่งต่าง ๆ เช่นการจัดการระยะไกลของการปรับใช้การรีสตาร์ทการเรียกใช้คำสั่งและอื่น ๆ - ฉันจะใช้ capistrano กับส่วนขยายโหนด

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


1

https://paastor.comเป็นบริการใหม่ที่ปรับใช้กับคุณไปยัง VPS หรือเซิร์ฟเวอร์อื่น ๆ มี CLI ที่จะผลักดันรหัส Paastor มีเทียร์ฟรีอย่างน้อยก็ทำตอนโพสต์นี้


1

ในกรณีของคุณคุณสามารถใช้daemon พุ่งพรวด สำหรับการแก้ปัญหาการใช้งานที่สมบูรณ์ผมอาจแนะนำCapistrano สองคำแนะนำที่มีประโยชน์มีวิธีการติดตั้ง Node.js envและวิธีการปรับใช้ผ่าน Capistrano + พุ่งพรวด


ลิงก์ที่ตายแล้วสำหรับสองคนสุดท้าย
Pat

1

ลองโหนดปรับใช้เซิร์ฟเวอร์ มันเป็นชุดเครื่องมือที่ซับซ้อนสำหรับการปรับใช้แอปพลิเคชันไปยังเซิร์ฟเวอร์ส่วนตัวของคุณ มันเขียนใน Node.js และใช้ npm สำหรับการติดตั้ง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.