ฉันใช้โมดูลตลอดไปของโหนดเพื่อให้เซิร์ฟเวอร์โหนดทำงานอยู่ อย่างไรก็ตามจะสิ้นสุดตลอดกาลเมื่อมีการรีสตาร์ทระบบ มีวิธีใดบ้างที่ฉันจะสามารถเริ่มเซิร์ฟเวอร์โหนดโดยอัตโนมัติ (ตลอดไป) เมื่อระบบรีสตาร์ท?
ฉันใช้โมดูลตลอดไปของโหนดเพื่อให้เซิร์ฟเวอร์โหนดทำงานอยู่ อย่างไรก็ตามจะสิ้นสุดตลอดกาลเมื่อมีการรีสตาร์ทระบบ มีวิธีใดบ้างที่ฉันจะสามารถเริ่มเซิร์ฟเวอร์โหนดโดยอัตโนมัติ (ตลอดไป) เมื่อระบบรีสตาร์ท?
คำตอบ:
ฉันอยากจะแนะนำให้ใช้ crontab มันใช้งานง่าย
ในการเริ่มแก้ไขให้รันสิ่งต่อไปนี้แทน "testuser" ด้วยผู้ใช้รันไทม์ที่คุณต้องการสำหรับกระบวนการโหนด หากคุณเลือกผู้ใช้อื่นนอกเหนือจากตัวคุณเองคุณจะต้องเรียกใช้งานด้วย sudo
$ crontab -u testuser -e
หากคุณไม่เคยทำสิ่งนี้มาก่อนมันจะถามคุณว่าคุณต้องการแก้ไขด้วยตัวแก้ไขใด ฉันชอบเสียงเรียกเข้า แต่จะแนะนำนาโนให้ใช้งานง่าย
เมื่ออยู่ในเครื่องมือแก้ไขให้เพิ่มบรรทัดต่อไปนี้:
@reboot /usr/local/bin/forever start /your/path/to/your/app.js
บันทึกไฟล์ คุณควรได้รับคำติชมว่ามีการติดตั้ง cron แล้ว
สำหรับการยืนยันการติดตั้ง cron เพิ่มเติมให้ดำเนินการดังต่อไปนี้ (แทนที่ "testuser" ด้วยชื่อผู้ใช้เป้าหมายของคุณอีกครั้ง) เพื่อแสดงรายการ crons ที่ติดตั้งอยู่ในปัจจุบัน:
$ crontab -u testuser -l
โปรดทราบว่าในความคิดของฉันคุณควรใช้เส้นทางแบบเต็มทุกครั้งเมื่อรันไบนารีใน cron นอกจากนี้หากเส้นทางสู่สคริปต์ถาวรของคุณไม่ถูกต้องให้เรียกใช้which forever
เพื่อรับเส้นทางแบบเต็ม
เมื่อรับforever
สายnode
คุณอาจต้องระบุเส้นทางแบบเต็มเพื่อnode
:
@reboot /usr/local/bin/forever start -c /usr/local/bin/node /your/path/to/your/app.js
@reboot
การเริ่มต้น cron บน cron deamon เริ่มต้นขึ้น เพื่อเพิ่มฉันไม่เคยเจอสถานการณ์ที่จะแนะนำให้ cron ของฉันที่ตั้งไว้ที่@reboot
ไม่ทำงานในการบูตระบบ วิธีที่คุณปิดระบบไม่เกี่ยวข้องกับสิ่งนี้
/home
/home
@reboot varname=value ...
คุณสามารถใช้บริการตลอดไปสำหรับการทำสิ่งนี้
npm install -g forever-service
forever-service install test
สิ่งนี้จะจัดเตรียม app.js ในไดเรกทอรีปัจจุบันเป็นบริการผ่านตลอดไป บริการจะรีสตาร์ทโดยอัตโนมัติทุกครั้งที่มีการรีสตาร์ทระบบ นอกจากนี้เมื่อหยุดมันจะพยายามหยุดอย่างสง่างาม สคริปต์นี้ใช้สคริปต์ logrotate เช่นกัน
URL GitHub: https://github.com/zapty/forever-service
หมายเหตุ: ฉันเป็นผู้แต่งบริการตลอดกาล
forever-service install test
, test
จะเป็นชื่อของบริการแต่ไม่ได้ชื่อของไฟล์ที่เกิดขึ้นจริงโปรแกรม / โหนด .js การวิ่ง โดยค่าเริ่มต้นจะอนุมานว่าชื่อของโปรแกรมที่เป็นapp.js
แต่คุณสามารถแทนที่ด้วยธงชาติดังต่อไปนี้:--script
forever-service install test --script main.js
(ยังไม่ได้ทดสอบดังนั้นโปรดแก้ไขให้ฉันถ้ามีรายละเอียดของไวยากรณ์ที่ไม่ถูกต้อง)
ติดตั้ง PM2 ทั่วโลกโดยใช้ NPM
npm install pm2 -g
เริ่มต้นสคริปต์ของคุณด้วย pm2
pm2 start app.js
สร้างสคริปต์เริ่มต้นที่ใช้งานอยู่
pm2 startup
หมายเหตุ: การเริ่มต้น pm2 สำหรับการเริ่ม PM2 เมื่อระบบรีบูต PM2 เริ่มทำงานครั้งหนึ่งแล้วรีสตาร์ทกระบวนการทั้งหมดที่เคยจัดการก่อนที่ระบบจะหยุดทำงาน
ในกรณีที่คุณต้องการปิดการใช้งานการเริ่มต้นอัตโนมัติเพียงแค่ใช้ pm2 unstartup
หากคุณต้องการให้สคริปต์เริ่มต้นทำงานภายใต้ผู้ใช้รายอื่นเพียงใช้-u <username>
ตัวเลือกและ--hp <user_home>:
กรณีนี้ใช้ได้สำหรับ Debian
เพิ่มรายการต่อไปนี้เพื่อ /etc/rc.local
/usr/bin/sudo -u {{user}} /usr/local/bin/forever start {{app path}}
{{user}}
แทนที่ชื่อผู้ใช้ของคุณ {{app path}}
แทนที่เส้นทางแอปของคุณ ตัวอย่างเช่น,/var/www/test/app.js
/etc/rc.local
ไม่ใช่/etc/init.d/rc.local
app.js
เพื่อให้แน่ใจว่าไฟล์ที่เกี่ยวข้องจะถูกโหลดอย่างถูกต้อง - process.chdir('/your/path/to/your/app');
เอกสารอ้างอิง Node.js ที่นี่
/etc/rc.local
ได้เคล็ดลับสำหรับฉัน:( cd /path/to/project && /usr/bin/sudo -u {{user}} env PORT={{port number}} PATH=$PATH:/usr/local/bin sh -c "forever start app.js" )
วิธี crontab ทางเลือกที่แรงบันดาลใจจากนี้คำตอบและนี้โพสต์บล็อก
1. สร้างไฟล์สคริปต์ทุบตี (เปลี่ยนบ๊อบเป็นผู้ใช้ที่ต้องการ)
vi /home/bob/node_server_init.sh
2. คัดลอกและวางสิ่งนี้ลงในไฟล์ที่คุณเพิ่งสร้างขึ้น
#!/bin/sh
export NODE_ENV=production
export PATH=/usr/local/bin:$PATH
forever start /node/server/path/server.js > /dev/null
ตรวจสอบให้แน่ใจว่าได้แก้ไขเส้นทางด้านบนตามค่ากำหนดของคุณ!
3. ตรวจสอบให้แน่ใจว่าสคริปต์ bash สามารถทำงานได้
chmod 700 /home/bob/node_server_init.sh
4. ทดสอบสคริปต์ทุบตี
sh /home/bob/node_server_init.sh
5. แทนที่ "bob" ด้วยผู้ใช้รันไทม์สำหรับโหนด
crontab -u bob -e
6. คัดลอกและวาง (เปลี่ยนบ๊อบเป็นผู้ใช้ที่ต้องการ)
@reboot /bin/sh /home/bob/node_server_init.sh
บันทึก crontab
คุณทำไปจนจบรางวัลของคุณคือรีบูต (เพื่อทดสอบ) :)
คำตอบที่คัดลอกมาจากที่แนบมาคำถาม
คุณสามารถใช้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]
$pm2 startup
หลังจากนั้นคุณจะเห็น pm2 ที่ขอให้เรียกใช้คำสั่งด้วยตนเองคัดลอกและเรียกใช้ จากนั้น$pm2 save
ตอนนี้ app.js ของคุณจะอยู่รอดได้ในการรีบูตระบบ
คุณต้องสร้างเชลล์สคริปต์ในโฟลเดอร์ /etc/init.d มันซับซ้อนหากคุณไม่เคยทำมันมาก่อน แต่มีข้อมูลมากมายบนเว็บในสคริปต์ init.d
นี่เป็นตัวอย่างสคริปต์ที่ฉันสร้างขึ้นเพื่อเรียกใช้ไซต์ CoffeeScript อย่างถาวร:
#!/bin/bash
#
# initd-example Node init.d
#
# chkconfig: 345
# description: Script to start a coffee script application through forever
# processname: forever/coffeescript/node
# pidfile: /var/run/forever-initd-hectorcorrea.pid
# logfile: /var/run/forever-initd-hectorcorrea.log
#
# Based on a script posted by https://gist.github.com/jinze at https://gist.github.com/3748766
#
# Source function library.
. /lib/lsb/init-functions
pidFile=/var/run/forever-initd-hectorcorrea.pid
logFile=/var/run/forever-initd-hectorcorrea.log
sourceDir=/home/hectorlinux/website
coffeeFile=app.coffee
scriptId=$sourceDir/$coffeeFile
start() {
echo "Starting $scriptId"
# This is found in the library referenced at the top of the script
start_daemon
# Start our CoffeeScript app through forever
# Notice that we change the PATH because on reboot
# the PATH does not include the path to node.
# Launching forever or coffee with a full path
# does not work unless we set the PATH.
cd $sourceDir
PATH=/usr/local/bin:$PATH
NODE_ENV=production PORT=80 forever start --pidFile $pidFile -l $logFile -a -d --sourceDir $sourceDir/ -c coffee $coffeeFile
RETVAL=$?
}
restart() {
echo -n "Restarting $scriptId"
/usr/local/bin/forever restart $scriptId
RETVAL=$?
}
stop() {
echo -n "Shutting down $scriptId"
/usr/local/bin/forever stop $scriptId
RETVAL=$?
}
status() {
echo -n "Status $scriptId"
/usr/local/bin/forever list
RETVAL=$?
}
case "$1" in
start)
start
;;
stop)
stop
;;
status)
status
;;
restart)
restart
;;
*)
echo "Usage: {start|stop|status|restart}"
exit 1
;;
esac
exit $RETVAL
ฉันต้องตรวจสอบให้แน่ใจว่าโฟลเดอร์และเส้นทางถูกตั้งค่าอย่างชัดเจนหรือพร้อมใช้งานสำหรับผู้ใช้รูทตั้งแต่สคริปต์ init.d รันเป็นรูท
ใช้PM2
ซึ่งเป็นตัวเลือกที่ดีที่สุดในการรันเซิร์ฟเวอร์ที่ใช้งานจริง
ข้อดีของการใช้แอปพลิเคชันของคุณในลักษณะนี้คืออะไร?
PM2 จะรีสตาร์ทแอปพลิเคชันของคุณโดยอัตโนมัติหากเกิดข้อผิดพลาด
PM2 จะเก็บบันทึกข้อยกเว้นที่ไม่ได้จัดการของคุณ - ในกรณีนี้ในไฟล์ที่ /home/safeuser/.pm2/logs/app-err.log
ด้วยคำสั่งเดียว PM2 สามารถมั่นใจได้ว่าแอปพลิเคชันใด ๆ ที่จัดการรีสตาร์ทเมื่อเซิร์ฟเวอร์รีบูต โดยทั่วไปแอ็พพลิเคชันโหนดของคุณจะเริ่มต้นเป็นเซอร์วิส
Forever ไม่ได้ถูกสร้างขึ้นเพื่อให้แอปพลิเคชันโหนดทำงานเป็นบริการ แนวทางที่ถูกต้องคือสร้างรายการ / etc / inittab (ระบบ linux เก่า) หรือ upstart (ระบบ linux ที่ใหม่กว่า)
นี่คือเอกสารบางส่วนเกี่ยวกับวิธีตั้งค่านี้เป็นแบบพุ่งพรวด: https://github.com/cvee/node-upstart
crontab
ใช้งานไม่ได้กับฉันบน CentOS x86 6.5 @reboot ดูเหมือนว่าจะไม่ทำงาน
ในที่สุดฉันก็ได้วิธีนี้มา:
แก้ไข: /etc/rc.local
sudo vi /etc/rc.local
เพิ่มบรรทัดนี้ในตอนท้ายของไฟล์ เปลี่ยนUSER_NAME
และPATH_TO_PROJECT
เป็นของคุณเอง NODE_ENV=production
หมายถึงแอปทำงานในโหมดการผลิต คุณสามารถเพิ่มบรรทัดเพิ่มเติมได้หากคุณต้องการรันมากกว่าหนึ่งแอป node.js
su - USER_NAME -c "NODE_ENV=production /usr/local/bin/forever start /PATH_TO_PROJECT/app.js"
ไม่ได้ตั้งอยู่ในแนวเส้นที่แยกจากกันของแอปจะทำงานยังคงอยู่ในโหมดการพัฒนาเพราะตลอดไปไม่ได้NODE_ENV
NODE_ENV
# WRONG!
su - USER_NAME -c "export NODE_ENV=production"
บันทึกและออกจาก vi (กดESC : w q return
) คุณสามารถลองรีบูตเซิร์ฟเวอร์ของคุณ หลังจากเซิร์ฟเวอร์ของคุณรีบูตแอป node.js ของคุณควรรันโดยอัตโนมัติแม้ว่าคุณจะไม่ได้ลงชื่อเข้าใช้บัญชีใด ๆ จากระยะไกลผ่าน ssh
คุณควรตั้งค่าNODE_ENV
สภาพแวดล้อมในเชลล์ของคุณ NODE_ENV
จะถูกตั้งค่าโดยอัตโนมัติเมื่อบัญชีของคุณUSER_NAME
เข้าสู่ระบบ
echo export NODE_ENV=production >> ~/.bash_profile
ดังนั้นคุณสามารถเรียกใช้คำสั่งเช่นหยุด / เริ่มต้น/PATH_TO_PROJECT/app.js
ผ่าน ssh โดยไม่ต้องตั้งค่าNODE_ENV
อีกครั้ง
ฉันเขียนสคริปต์ที่ทำสิ่งนี้:
https://github.com/chovy/node-startup
ฉันไม่ได้ลองตลอดไป แต่คุณสามารถปรับแต่งคำสั่งที่มันทำงานดังนั้นมันควรจะตรงไปข้างหน้า:
/etc/init.d/node-app start
/etc/init.d/node-app restart
/etc/init.d/node-app stop
ปัญหาของ rc.local คือการเข้าถึงคำสั่งในฐานะ root ซึ่งแตกต่างจากการเข้าสู่ระบบในฐานะผู้ใช้และการใช้ sudo
ฉันแก้ไขปัญหานี้ด้วยการเพิ่มสคริปต์. sh ด้วยคำสั่งเริ่มต้นที่ฉันต้องการ / etc / profile.d ไฟล์. sh ใด ๆ ใน profile.d จะโหลดโดยอัตโนมัติและคำสั่งใด ๆ จะถูกปฏิบัติเสมือนว่าคุณใช้ sudo ปกติ
ข้อเสียเพียงอย่างเดียวคือผู้ใช้ที่ระบุต้องเข้าสู่ระบบเพื่อให้สิ่งต่าง ๆ เริ่มต้นซึ่งในสถานการณ์ของฉันมักเป็นกรณี
ฉันลองคำตอบข้างต้นมากมาย ไม่มีใครทำงานให้ฉันได้ แอพของฉันได้รับการติดตั้งใน/home
ฐานะผู้ใช้ไม่ใช่ในฐานะรูท นี่อาจหมายความว่าเมื่อสคริปต์เริ่มต้นที่กล่าวถึงทำงาน/home
ยังไม่ได้เชื่อมต่อดังนั้นแอปจึงไม่เริ่มทำงาน
จากนั้นฉันก็พบคำแนะนำเหล่านี้โดย Digital Ocean:
การใช้ PM2 ตามที่อธิบายนั้นง่ายมากและทำงานได้อย่างสมบูรณ์แบบ: เซิร์ฟเวอร์เสมือนของฉันมีปัญหาการขัดข้องสองครั้งเนื่องจากการหยุดทำงานใช้เวลาเพียงหนึ่งนาที
crontab ตัวอย่างสมบูรณ์ (อยู่ที่ / etc / crontab)
#!/bin/bash
# edit this file with .. crontab -u root -e
# view this file with .. crontab -u root -l
# put your path here if it differs
PATH=/root/bin:/root/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin
# * * * * * echo "executes once every minute" > /root/deleteme
@reboot cd /root/bible-api-dbt-server; npm run forever;
@reboot cd /root/database-api-server; npm run forever;
@reboot cd /root/mailer-api-server; npm run forever;
คุณสามารถใช้คำสั่งต่อไปนี้ในเปลือกของคุณเพื่อเริ่มโหนดของคุณตลอดไป:
forever app.js //my node script
คุณต้องจำไว้ว่าควรใช้เซิร์ฟเวอร์ที่แอพของคุณทำงานอยู่เสมอ