วิธีทำให้แอปพลิเคชัน node.js ทำงานอย่างถาวร


259

บนเซิร์ฟเวอร์ Debian ฉันติดตั้ง Node.js ฉันเข้าใจวิธีเปิดแอพจากผงสำหรับอุดรูด้วยบรรทัดคำสั่งนี้:

node /srv/www/MyUserAccount/server/server.js

และไปที่ที่อยู่50.51.52.53:8080(IP และพอร์ต)

แต่ทันทีที่ฉันปิด putty แล้วฉันไม่สามารถเข้าถึงที่อยู่50.51.52.53:8080อีกต่อไป

วิธีทำให้แอปพลิเคชัน Node.js ทำงานอย่างถาวร

อย่างที่คุณสามารถคาดเดาได้ฉันเป็นผู้เริ่มต้นกับ Linux และ Node.js


7
โปรดทราบว่าpm2เป็นทางเลือกที่ดีสำหรับForeverหากคุณไม่ต้องการใช้ Forever ด้วยเหตุผลใดก็ตาม
Kevin B

ขอบคุณ @KevinB github.com/Unitech/pm2เป็นจริงทางเลือกที่ดี
ชิน Chavan

คำตอบ:


220

แม้ว่าคำตอบอื่น ๆ จะช่วยแก้ปัญหาของ OP แต่พวกเขาก็มีทักษะมากเกินไปและไม่ได้อธิบายว่าทำไมเขาหรือเธอประสบปัญหานี้

ที่สำคัญคือบรรทัดนี้ "ฉันปิด putty แล้วฉันไม่สามารถเข้าถึงที่อยู่"

เมื่อคุณล็อกอินเข้าสู่รีโมตโฮสต์ของคุณบน Putty คุณได้เริ่มต้นกระบวนการ SSH linux และคำสั่งทั้งหมดที่พิมพ์จากเซสชัน SSH นั้นจะถูกดำเนินการในฐานะลูกของกระบวนการดังกล่าว

ปัญหาของคุณคือเมื่อคุณปิด Putty คุณกำลังออกจากเซสชัน SSH ซึ่งฆ่ากระบวนการนั้นและกระบวนการลูกที่ใช้งานอยู่ เมื่อคุณปิดฉาบคุณโดยไม่ได้ตั้งใจฆ่าเซิร์ฟเวอร์ของคุณเพราะคุณวิ่งในเบื้องหน้า หากต้องการหลีกเลี่ยงปัญหานี้ให้เรียกใช้เซิร์ฟเวอร์ในเบื้องหลังโดยต่อท้าย & กับคำสั่งของคุณ:

node /srv/www/MyUserAccount/server/server.js &

ปัญหานี่คือการขาดความรู้ลินุกซ์และไม่ใช่คำถามเกี่ยวกับโหนด สำหรับข้อมูลเพิ่มเติมลองดู: http://linuxconfig.org/understanding-foreground-and-background-linux-processes

UPDATE:

ดังที่คนอื่น ๆ ได้กล่าวถึงเซิร์ฟเวอร์โหนดอาจยังตายเมื่อออกจากเทอร์มินัล gotcha ทั่วไปที่ฉันเจอคือแม้ว่ากระบวนการของโหนดจะทำงานเป็น bg แต่ stdout และ stderr ยังคงชี้ไปที่เทอร์มินัล ซึ่งหมายความว่าหากเซิร์ฟเวอร์โหนดเขียนถึง console.log หรือ console.error มันจะได้รับข้อผิดพลาดไปป์ที่เสียหายและล้มเหลว สิ่งนี้สามารถหลีกเลี่ยงได้โดยการไพพ์เอาท์พุทของกระบวนการของคุณ:

node /srv/www/MyUserAccount/server/server.js > stdout.txt 2> stderr.txt &

หากปัญหายังคงมีอยู่คุณควรพิจารณาสิ่งต่างๆเช่นtmuxหรือnohupซึ่งยังคงมีประสิทธิภาพมากกว่าโซลูชันเฉพาะของโหนดเนื่องจากสามารถใช้เพื่อเรียกใช้กระบวนการทุกประเภท (ฐานข้อมูลบริการบันทึกภาษาอื่น ๆ )

ข้อผิดพลาดทั่วไปที่อาจทำให้เซิร์ฟเวอร์ออกจากนั้นคือหลังจากที่nohup node your_path/server.js &คุณเรียกใช้คุณเพียงแค่ปิดเทอร์มินัลโป๊วด้วยการคลิกง่ายๆ คุณควรใช้exitคำสั่งแทนจากนั้นโหนดเซิร์ฟเวอร์ของคุณจะเริ่มทำงาน


7
หากคุณยังคงปิดเซสชัน Putty ในขณะที่ทำการ&ให้บริการยังคงปิดอยู่ (เพิ่งทดสอบกับ Debian Jesse)
NiCk Newman

1
@NiCkNewman กล่าวว่าคำตอบนี้ไม่สมบูรณ์! ดูคำตอบของ Rick Royสำหรับการแก้ปัญหาที่ถูกต้อง
thejonwithnoh

19
"&" ทำให้กระบวนการทำงานในพื้นหลัง แต่จริง ๆ แล้วคุณจะต้องเพิ่ม "nohup" ไปยังจุดเริ่มต้นของคำสั่งนี้เพื่อแยกออกจากหน้าต่างคอนโซลเพื่อให้แอปพลิเคชันไม่หยุดเมื่อหน้าต่างเข้าสู่โหมดสลีปหลังจากไม่กี่วินาที ชั่วโมงแก้ไขคำสั่งที่กล่าวถึงไปก่อนหน้านี้เป็น:nohup node /srv/www/MyUserAccount/server/server.js &
SirRodge

2
AIX powersystem nohup node myApp.js &รันแอพใน bg แต่จะตายเมื่อคำถูกปิด ไม่แน่ใจว่าทำไม
AnBisw

4
@Annawn คุณต้องใช้exitคำสั่งเพื่อออกจากเทอร์มินัล
Ionut Necula

342

คุณสามารถติดตั้งได้ตลอดเวลาโดยใช้ NPM ดังนี้:

sudo npm install -g forever

จากนั้นเริ่มแอปพลิเคชันของคุณด้วย:

forever server.js

หรือเป็นบริการ:

forever start server.js

รีสตาร์ทแอปของคุณตลอดไปเมื่อเกิดปัญหาหรือหยุดด้วยเหตุผลบางประการ ในการ จำกัด การเริ่มใหม่ถึง 5 คุณสามารถใช้:

forever -m5 server.js

ในการแสดงรายการกระบวนการที่กำลังทำงานอยู่ทั้งหมด:

forever list

บันทึกจำนวนเต็มในวงเล็บและใช้ดังต่อไปนี้เพื่อหยุดกระบวนการ:

forever stop 0

การรีสตาร์ทกระบวนการที่กำลังทำงานอยู่:

forever restart 0

หากคุณกำลังทำงานกับไฟล์แอปพลิเคชันของคุณคุณสามารถใช้-wพารามิเตอร์เพื่อรีสตาร์ทโดยอัตโนมัติเมื่อใดก็ตามที่server.jsไฟล์ของคุณเปลี่ยนแปลง:

forever -w server.js

11
@MarthaJames หากการปิดเมื่อเซสชัน / หน้าต่างของคุณปิดลงคุณอาจลืมที่จะรวม "เริ่มต้น" ในforever start <file>
Kristian

8
ความแตกต่างระหว่างการใช้งานforever server.jsและforever start server.jsคืออะไร ฉันรู้ว่ามันบอกว่า "เป็นบริการ" แต่นั่นหมายความว่าอย่างไร
Marquizzo

5
เมื่อฉันพิมพ์forever server.jsมันจะเริ่มเซิร์ฟเวอร์ ถ้าฉันกดCtrl+ Cมันจะหยุดให้บริการ ถ้าฉันพิมพ์forever start server.jsมันก็จะเริ่มบริการและแม้ว่าฉันกดCtrl+ Cมันยังคงเปิดอยู่ จากนั้นคุณสามารถทำคำสั่งอ้างอิงอื่น ๆ ข้างต้นเพื่อหยุด / ดูรายการ นั่นคือสิ่งที่ฉันมีประสบการณ์อย่างน้อย
Termato

6
สิ่งนี้เริ่มสคริปต์หลังจากเซิร์ฟเวอร์รีสตาร์ทหรือไม่
Beingalex

1
foreverโมดูล (v0.15.3) เป็นความเสี่ยงที่จะนิพจน์ปกติปฏิเสธการโจมตีบริการและไม่ควรใช้: github.com/foreverjs/forever/issues/960
เบนนี่ Neugebauer

82

คุณสามารถใช้PM2ซึ่งเป็นผู้จัดการกระบวนการผลิตสำหรับแอปพลิเคชัน Node.js ที่มี load balancer ในตัว

ติดตั้ง PM2

$ npm install pm2 -g

เริ่มแอปพลิเคชัน

$ pm2 start app.js

หากคุณใช้ express คุณสามารถเริ่มแอพได้

pm2 start ./bin/www --name="app"

การแสดงรายการกระบวนการทำงานทั้งหมด:

$ pm2 list

มันจะแสดงรายการกระบวนการทั้งหมด จากนั้นคุณสามารถหยุด / เริ่มบริการของคุณใหม่โดยใช้ ID หรือชื่อของแอพด้วยคำสั่งต่อไปนี้

$ pm2 stop all                  
$ pm2 stop 0                    
$ pm2 restart all               

เพื่อแสดงบันทึก

$ pm2 logs ['all'|app_name|app_id]

1
ขอให้พระเจ้าคุ้มครอง! มันได้ผล!! Forever และ Nohup ไม่ทำงานบนเว็บเซิร์ฟเวอร์ amazon bitnami nodejs ( docs.bitnami.com/aws/infrastructure/nodejs ) ของamazon PM2 ใช้งานได้ดี!
polras

ดูเหมือนว่าไลบรารีนี้จะมีจำนวนการเริ่มต้นสูงสุดใน Github
DragonFire

41

ฉันขอแนะนำให้ค้นหาบางสิ่งบางอย่างเช่นForeverเพื่อเริ่ม Node ใหม่ในกรณีที่เกิดความผิดพลาดและจัดการจัดการสิ่งนี้ให้คุณ


ฉันต้องการจะชี้ให้เห็นว่าไม่มีnohupโหนดจะออกเมื่อคุณออกจากเซสชัน ssh หากคุณใช้วิธีนี้ (ยกเว้นว่าคุณกำลังใช้หน้าจอเพื่อ tmux)
Haozhun

1
@ Haozhun น่าสนใจ แต่นั่นไม่ใช่วิธีการทำงานสำหรับฉันบนเครื่องของฉัน เมื่อฉัน ssh และเริ่มสิ่งที่ใช้คำสั่งนี้มันทำงานตลอดไปในพื้นหลังแม้หลังจากปิดเซสชัน SSH
แบรด

@Brad โปรดดูคำตอบที่ 2 stackoverflow.com/questions/4018154/... แต่ดูเหมือนว่ามันค่อนข้างบางคนเห็นด้วยกับความคิดเห็นที่ 1 nohupของคำถามที่ซึ่งจะอธิบาย มันจะดีถ้าเราสามารถแก้ไขความสับสนนี้ แต่ฉันไม่รู้ว่าจะเริ่มจากตรงไหน
Haozhun

4
สำหรับ unixen ส่วนใหญ่ (รวมถึง distros ส่วนใหญ่ของ Linux) การรันสิ่งต่าง ๆ ในพื้นหลังจะยังคงฆ่ากระบวนการถ้าคุณปิดหน้าต่างเทอร์มินัล nohupเพื่อป้องกันไม่ให้ทำงานนี้ด้วย ตัวอย่าง:nohup node app.js &
slebetman

1
ฉันใช้ Forever กับ Production Linux env ฉันมักจะใช้คำสั่งตลอดไปเริ่มต้น --minUptime 10000 -o /logs/myapp.log nodeApp.js
mbokil

36

หากคุณต้องการรันแอปโหนดของคุณในเทอร์มินัลเสมอเพียงใช้หน้าจอ

ติดตั้งบน Ubuntu / debian:

sudo apt-get install screen

การใช้งาน:

$ screen
$ node /path/to/app.js

ctrl + a แล้ว ctrl + dจะยกเลิก

ที่จะได้รับกลับมา:

หน้าจอเดียว: screen -r

หากมีมากกว่าหนึ่งคุณสามารถแสดงรายการหน้าจอทั้งหมดด้วย: screen -ls

แล้ว: screen -r pid_number


1
นี่เป็นตัวเลือกที่ดีเพราะมันยังช่วยให้ฉันสามารถเปลี่ยนกระบวนการให้ทำงานเบื้องหน้าได้ตลอดเวลา
aexl

26

คุณสามารถใช้สิ่งนี้

nohup node /srv/www/MyUserAccount/server/server.js &

วิธีนี้จะทำให้แอปพลิเคชันทำงานต่อไปและเพื่อปิดคุณจะต้องฆ่ามัน

สำหรับสิ่งที่คุณสามารถติดตั้งhtopแล้วค้นหาโหนดและฆ่ามัน


18
โปรดทราบว่าในกรณีนี้ผู้ใช้จะต้องออกจากเซสชัน PuTTY อย่างถูกต้อง (เช่นผ่านexitคำสั่ง) หากผู้ใช้ปิดหน้าต่างเพียงแค่นี้อาจใช้สัญญาณอื่นที่ไม่ใช่SIGHUPเพื่อสิ้นสุดกระบวนการและดังนั้นโหนดจะปิดระบบต่อไป
thejonwithnoh

1
+1 สำหรับการเป็นโซลูชัน Linux ที่ใช้งานง่ายทุกปัญหา นี้จะดีกว่าคำตอบ DogNibbler ของ
thejonwithnoh

@thejonwithnoh หลังจากอ่านความคิดเห็นของคุณฉันได้ลองปิด putty อย่างฉับพลัน แต่เซิร์ฟเวอร์ยังคงทำงานอยู่อาจจะต้องทำอย่างไรกับวิธีการกำหนดค่า env แต่ฉันคิดว่า OP ต้องการให้สิ่งนี้เป็นวิธีที่ง่ายที่สุดในการทำให้สำเร็จ
Rick Roy

ฉันชอบวิธีการง่ายๆนี้มันเป็นวิธีที่ฉันใช้สำหรับการฆ่าวิธีที่ง่ายที่สุดคือเพียงแค่killall nodeซึ่งจะฆ่ากระบวนการของโหนดทั้งหมดในกรณีของฉันเพียงหนึ่งเดียว
เนลสัน

@ เนลสันที่จะฆ่าโหนดทั้งหมดจะเกิดอะไรขึ้นถ้าคุณมีสคริปต์หลายตัวที่กำลังทำงานอยู่และต้องการที่จะยุติหนึ่งเฉพาะฉันขอแนะนำให้คุณหากระบวนการแล้วยุติมันโดยเฉพาะอย่างยิ่งในกรณีที่คุณมีกระบวนการหลายโหนดทำงานในเซิร์ฟเวอร์การผลิต และไม่ต้องการที่จะรู้สึกเหมือนฝันร้าย: D
Rick Roy

12

Foreverเป็นโมดูล NodeJs ที่ดีมากในการทำเช่นนั้น

ติดตั้งforeverโดยพิมพ์ในบรรทัดคำสั่ง

$ npm install forever -g

จากนั้นใช้คำสั่งต่อไปนี้เพื่อรันสคริปต์ node.js

$ forever start /path/to/script.js

คุณดีไปแล้ว นอกจากนี้คุณสามารถเรียกใช้

$ forever list

เพื่อดูสคริปต์ที่ทำงานอยู่ทั้งหมด คุณสามารถยกเลิกสคริปต์เฉพาะใด ๆ ได้โดยพิมพ์

$ forever stop [pid]

ที่[pid]อยู่ในกระบวนการ ID ของสคริปต์คุณจะได้รับจากlistคำสั่ง หากต้องการหยุดสคริปต์ทั้งหมดคุณสามารถพิมพ์

$ forever stopall

10

ไม่ทำงานฉันตรวจสอบแล้วในAWS Ubunto vm ถูกต้องsyntax

ubuntu@ip-172-00-00-00:~/ms$ nohup node server.js &

จากนั้นกด Enter คุณจะเห็นบรรทัดนี้

ubuntu@ip-172-00-00-00:~/ms$ nohup: ignoring input and appending output to nohup.out

จากนั้นพิมพ์สิ่งนี้

rm nohup.out

ป้อนคำอธิบายรูปภาพที่นี่


3
ผมชอบวิธีการที่คุณคอมพ์ออกชื่อโฮสต์ในทุบตีขนาดเล็กพร้อมท์ แต่ทิ้งมันไว้ในชื่อเรื่องใหญ่ของหน้าต่าง😂
Conny

10

การติดตั้ง

$ [sudo] npm install forever -g

คุณสามารถใช้ตลอดไปเพื่อเรียกใช้สคริปต์อย่างต่อเนื่อง

forever start server.js

forever list

สำหรับบริการหยุด

forever stop server.js

9

นี่คือโซลูชันพุ่งพรวดที่ฉันใช้สำหรับโครงการส่วนตัวของฉัน:

วางไว้ใน/etc/init/node_app_daemon.conf:

description "Node.js Daemon"
author      "Adam Eberlin"

stop on shutdown

respawn
respawn limit 3 15

script
  export APP_HOME="/srv/www/MyUserAccount/server"
  cd $APP_HOME
  exec sudo -u user /usr/bin/node server.js
end script

วิธีนี้จะจัดการการเรียกคืนแอปพลิเคชันของคุณในกรณีที่เกิดปัญหา มันจะให้ความพยายามในการ respawn ใบสมัครของคุณหากเกิดปัญหา 3 ครั้งขึ้นไปในเวลาน้อยกว่า 15 วินาที


9

ในระหว่างการพัฒนาผมขอแนะนำให้ใช้nodemon มันจะรีสตาร์ทเซิร์ฟเวอร์ของคุณทุกครั้งที่มีการเปลี่ยนแปลงไฟล์ ดังที่คนอื่น ๆ ชี้ให้เห็นForeverเป็นตัวเลือก แต่ในการผลิตทุกอย่างขึ้นอยู่กับแพลตฟอร์มที่คุณใช้ โดยทั่วไปคุณจะต้องการใช้วิธีการที่แนะนำในการรักษาบริการ (เช่นhttp://www.freedesktop.org/wiki/Software/systemd/ )


สิ่งนี้ใช้ได้กับฉันในแอปพลิเคชัน MEAN.JS - nodemonรันคำสั่ง grunt ยกเว้นว่าคุณระบุไฟล์ JS ของเซิร์ฟเวอร์ดังนั้นฉันจึงใช้สิ่งนี้เพื่อเรียกใช้ mongo และโหนดตลอดไป / พร้อมกัน
J-Dizzle

8

ฉันพบว่าตลอดไปจะทำงานได้ดีอย่างสมบูรณ์

สมมติว่าคุณติดตั้ง npm แล้วหากไม่ใช่เพียงทำ

sudo apt-get install npm

จากนั้นติดตั้งตลอดไป

npm install forever --global

ตอนนี้คุณสามารถเรียกใช้เช่นนี้

forever start app.js

https://codingweb.io/run-nodejs-application-background/


npm rm -g ตลอดกาลสำหรับการนำออก
DragonFire


5

อีกวิธีหนึ่งคือการสร้างหน่วยระบบสำหรับแอปของคุณ สร้างไฟล์ "XXX.service" ในโฟลเดอร์ "/ etc / systemd / system" ซึ่งคล้ายกับสิ่งนี้:

[Unit]
Description=swagger
After=network.target

[Service]
ExecStart=/usr/bin/http-server /home/swagger/swagger-editor &
WorkingDirectory=/home/swagger
Restart=always
RestartSec=30

[Install]
WantedBy=multi-user.target

ประโยชน์คือแอปจะทำงานเป็นบริการมันจะรีสตาร์ทโดยอัตโนมัติหากเกิดข้อผิดพลาด

คุณยังสามารถใช้ sytemctl เพื่อจัดการ:

systemctl start XXXเพื่อเริ่มบริการsystemctl stop XXXหยุดและsystemctl enable XXXเปิดแอปโดยอัตโนมัติเมื่อบูทระบบ


4

ฉันหวังว่านี่จะช่วยคุณได้

ที่บรรทัดรับคำสั่งติดตั้งถาวร:

npm install forever -g

สร้างไฟล์ตัวอย่าง:

sudo nano server.js 

คุณสามารถแก้ไขไฟล์และรับผลลัพธ์โดยตรงในเบราว์เซอร์ของคุณ
คุณสามารถใช้ filezilla หรือเครื่องมือแก้ไขใด ๆ เพื่อแก้ไขไฟล์ เรียกใช้คำสั่งนี้เพื่อเรียกใช้ไฟล์:

forever start --minUptime 1 --spinSleepTime 1000 -w server.js

ป้อนคำอธิบายรูปภาพที่นี่


3

ไม่จำเป็นต้องติดตั้งแพ็คเกจอื่น ๆ

เรียกใช้คำสั่งนี้

node server.js > stdout.txt 2> stderr.txt &

server.jsเป็นไฟล์เซิร์ฟเวอร์ของคุณหรือเป็นapi.js

หลังจากนั้นกด " exit " เพื่อปิดสถานี

exit

2

ฉันแนะนำให้ใช้ PM2 ซึ่งเป็นตัวจัดการกระบวนการสำหรับแอปพลิเคชัน Node.js PM2 จัดเตรียมวิธีที่ง่ายในการจัดการและกำหนดให้แอปพลิเคชัน (เรียกใช้เป็นบริการ)

อ้างอิงลิงค์นี้ - https://www.digitalocean.com/community/tutorials/how-to-set-up-a-node-js-application-for-production-on-centos-7


1
มีคำตอบแนะนำ PM2 อยู่แล้ว stackoverflow.com/a/40254977/390718
hopia

0

ตลอดแพคเกจทำงานให้ฉันเพียงแค่สิ่งหนึ่งก็ขึ้นอยู่กับลึกเท่ากันดังนั้นหากคุณมีปัญหากับการติดตั้งมันเหมือน:

npm -g install forever

ลอง:

npm -g install forever deep-equal@1.1.1

แทน.

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