Saya menggunakan modul selamanya node untuk menjaga server node saya berjalan. Namun selamanya berakhir ketika ada restart sistem. Apakah ada cara saya dapat secara otomatis memulai node server (dengan selamanya) ketika sistem restart?
Saya menggunakan modul selamanya node untuk menjaga server node saya berjalan. Namun selamanya berakhir ketika ada restart sistem. Apakah ada cara saya dapat secara otomatis memulai node server (dengan selamanya) ketika sistem restart?
Jawaban:
Saya sarankan menggunakan crontab. Mudah digunakan.
Untuk mulai mengedit, jalankan yang berikut menggantikan "testuser" dengan pengguna runtime yang Anda inginkan untuk proses simpul. Jika Anda memilih pengguna lain selain diri Anda sendiri, Anda harus menjalankan ini dengan sudo.
$ crontab -u testuser -e
Jika Anda belum pernah melakukan ini sebelumnya, ia akan menanyakan editor mana yang ingin Anda sunting. Saya suka vim, tetapi akan merekomendasikan nano untuk kemudahan penggunaan.
Setelah di editor tambahkan baris berikut:
@reboot /usr/local/bin/forever start /your/path/to/your/app.js
Simpan file. Anda harus mendapatkan umpan balik bahwa cron telah diinstal.
Untuk konfirmasi lebih lanjut tentang pemasangan cron, jalankan yang berikut (lagi-lagi ganti "testuser" dengan nama pengguna target Anda) untuk mendaftar crons yang saat ini diinstal:
$ crontab -u testuser -l
Perhatikan bahwa menurut pendapat saya, Anda harus selalu menggunakan path lengkap saat menjalankan binari di cron. Juga, jika jalur ke skrip selamanya Anda tidak benar, jalankan which forever
untuk mendapatkan path lengkap.
Mengingat forever
panggilan itu node
, Anda mungkin juga ingin memberikan jalur lengkap ke node
:
@reboot /usr/local/bin/forever start -c /usr/local/bin/node /your/path/to/your/app.js
@reboot
cron dijalankan pada cron deamon dimulai. Untuk menambahkan, saya belum pernah menemukan situasi yang menunjukkan bahwa cron saya yang diset pada @reboot
tidak berjalan pada boot sistem. Cara Anda mematikannya tidak relevan untuk ini.
/home
belum dipasang, jadi ini tidak akan berfungsi jika kode Anda tinggal /home
.
@reboot varname=value ...
Anda dapat menggunakan layanan selamanya untuk melakukan ini.
npm install -g forever-service
forever-service install test
Ini akan menyediakan app.js di direktori saat ini sebagai layanan melalui selamanya. Layanan akan secara otomatis restart setiap kali sistem dihidupkan ulang. Juga ketika berhenti itu akan mencoba berhenti anggun. Skrip ini juga menyediakan skrip logrotate.
Github url: https://github.com/zapty/forever-service
CATATAN: Saya adalah penulis layanan selamanya.
forever-service install test
, test
akan menjadi nama layanan , tetapi bukan nama program / node .js file yang sebenarnya untuk dijalankan. Secara default, mengasumsikan nama dari program ini adalah app.js
, tetapi Anda dapat menimpanya dengan --script
bendera, sebagai berikut: forever-service install test --script main.js
. (Belum diuji, jadi tolong perbaiki saya jika ada detail sintaks yang salah.)
Kasing ini berlaku untuk Debian.
Tambahkan yang berikut ke /etc/rc.local
/usr/bin/sudo -u {{user}} /usr/local/bin/forever start {{app path}}
{{user}}
mengganti nama pengguna Anda. {{app path}}
mengganti jalur aplikasi Anda. Sebagai contoh,/var/www/test/app.js
/etc/rc.local
, bukan/etc/init.d/rc.local
app.js
untuk memastikan file relatif dimuat dengan benar - process.chdir('/your/path/to/your/app');
Node.js ref docs di sini
/etc/rc.local
melakukan trik untuk saya:( cd /path/to/project && /usr/bin/sudo -u {{user}} env PORT={{port number}} PATH=$PATH:/usr/local/bin sh -c "forever start app.js" )
Instal PM2 secara global menggunakan NPM
npm install pm2 -g
Mulai skrip Anda dengan pm2
pm2 start app.js
buat skrip startup aktif
pm2 startup
CATATAN: startup pm2 adalah untuk memulai PM2 ketika sistem reboot. PM2 sekali dimulai, restart semua proses yang telah dikelola sebelum sistem turun.
Jika Anda ingin menonaktifkan startup otomatis, cukup gunakan pm2 unstartup
Jika Anda ingin skrip startup dijalankan di bawah pengguna lain, cukup gunakan -u <username>
opsi dan--hp <user_home>:
Sebuah metode crontab alternatif terinspirasi oleh ini jawaban dan ini posting blog.
1. Buat file skrip bash (ubah bob menjadi pengguna yang diinginkan).
vi /home/bob/node_server_init.sh
2. Salin dan tempel ini di dalam file yang baru saja Anda buat.
#!/bin/sh
export NODE_ENV=production
export PATH=/usr/local/bin:$PATH
forever start /node/server/path/server.js > /dev/null
Pastikan untuk mengedit jalur di atas sesuai dengan konfigurasi Anda!
3. Pastikan skrip bash dapat dieksekusi.
chmod 700 /home/bob/node_server_init.sh
4. Uji skrip bash.
sh /home/bob/node_server_init.sh
5. Ganti "bob" dengan pengguna runtime untuk node.
crontab -u bob -e
6. Salin dan tempel (ubah bob ke pengguna yang diinginkan).
@reboot /bin/sh /home/bob/node_server_init.sh
Simpan crontab.
Anda telah berhasil sampai akhir, hadiah Anda adalah reboot (untuk menguji) :)
Jawaban disalin dari pertanyaan terlampir .
Anda dapat menggunakan PM2 , ini adalah manajer proses produksi untuk aplikasi Node.js dengan penyeimbang beban bawaan.
Instal PM2
$ npm install pm2 -g
Mulai aplikasi
$ pm2 start app.js
Jika Anda menggunakan ekspres maka Anda dapat memulai aplikasi seperti
pm2 start ./bin/www --name="app"
Daftar semua proses yang berjalan:
$ pm2 list
Ini akan mendaftar semua proses. Anda kemudian dapat menghentikan / memulai kembali layanan Anda dengan menggunakan ID atau Nama aplikasi dengan perintah berikut.
$ pm2 stop all
$ pm2 stop 0
$ pm2 restart all
Untuk menampilkan log
$ pm2 logs ['all'|app_name|app_id]
$pm2 startup
Setelah itu Anda akan melihat pm2 meminta untuk secara manual menjalankan perintah, salin dan jalankan itu. Lalu, $pm2 save
Sekarang app.js Anda akan selamat dari reboot sistem
Anda perlu membuat skrip shell di folder /etc/init.d untuk itu. Agak rumit jika Anda belum pernah melakukannya tetapi ada banyak informasi di web tentang skrip init.d.
Berikut ini contoh skrip yang saya buat untuk menjalankan situs CoffeeScript selamanya:
#!/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
Saya harus memastikan folder dan PATH secara eksplisit diatur atau tersedia untuk pengguna root karena skrip init.d dijalankan sebagai root.
Gunakan PM2
Yang merupakan opsi terbaik untuk menjalankan server server produksi
Apa keuntungan menjalankan aplikasi Anda dengan cara ini?
PM2 secara otomatis akan me-restart aplikasi Anda jika crash.
PM2 akan menyimpan log pengecualian tidak tertangani Anda - dalam hal ini, dalam file di /home/safeuser/.pm2/logs/app-err.log.
Dengan satu perintah, PM2 dapat memastikan bahwa setiap aplikasi yang dikelolanya restart ketika server reboot. Pada dasarnya, aplikasi simpul Anda akan mulai sebagai layanan.
Forever tidak dibuat untuk menjalankan aplikasi node sebagai layanan. Pendekatan yang tepat adalah dengan membuat entri / etc / inittab (sistem linux lama) atau pemula (sistem linux yang lebih baru).
Berikut ini beberapa dokumentasi tentang cara mengaturnya sebagai pemula: https://github.com/cvee/node-upstart
crontab
tidak berfungsi untuk saya di CentOS x86 6.5. @reboot sepertinya tidak berfungsi.
Akhirnya saya mendapat solusi ini:
Edit: /etc/rc.local
sudo vi /etc/rc.local
Tambahkan baris ini ke akhir file. Ubah USER_NAME
dan PATH_TO_PROJECT
ke Anda sendiri. NODE_ENV=production
berarti aplikasi berjalan dalam mode produksi. Anda dapat menambahkan lebih banyak baris jika Anda perlu menjalankan lebih dari satu aplikasi node.js.
su - USER_NAME -c "NODE_ENV=production /usr/local/bin/forever start /PATH_TO_PROJECT/app.js"
Jangan diatur NODE_ENV
dalam jalur terpisah, aplikasi Anda akan tetap berjalan dalam mode pengembangan, karena selamanya tidak mendapatkan NODE_ENV
.
# WRONG!
su - USER_NAME -c "export NODE_ENV=production"
Simpan dan keluar vi (tekan ESC : w q return
). Anda dapat mencoba me-reboot server Anda. Setelah server Anda reboot, aplikasi node.js Anda harus berjalan secara otomatis, bahkan jika Anda tidak masuk ke akun apa pun dari jarak jauh melalui ssh.
Anda sebaiknya mengatur NODE_ENV
lingkungan di shell Anda. NODE_ENV
akan diatur secara otomatis ketika akun Anda USER_NAME
masuk.
echo export NODE_ENV=production >> ~/.bash_profile
Jadi Anda dapat menjalankan perintah seperti selamanya berhenti / mulai /PATH_TO_PROJECT/app.js
melalui ssh tanpa pengaturan NODE_ENV
lagi.
Saya menulis sebuah skrip yang melakukan ini:
https://github.com/chovy/node-startup
Saya belum pernah mencoba selamanya, tetapi Anda dapat menyesuaikan perintah yang dijalankannya, sehingga harus langsung:
/etc/init.d/node-app start
/etc/init.d/node-app restart
/etc/init.d/node-app stop
Saya mencoba banyak jawaban di atas. Tak satu pun dari mereka yang bekerja untuk saya. Aplikasi saya dipasang di /home
dan sebagai pengguna, bukan sebagai root. Ini mungkin berarti bahwa ketika skrip mulai yang disebutkan di atas berjalan, /home
belum terpasang, sehingga aplikasi belum dimulai.
Kemudian saya menemukan instruksi ini oleh Digital Ocean:
Menggunakan PM2 seperti yang dijelaskan sangat sederhana dan berfungsi dengan baik: Server virtual saya mengalami dua crash fisik sejak - downtime hanya sekitar satu menit.
Masalah dengan rc.local adalah bahwa perintah diakses sebagai root yang berbeda dari login sebagai pengguna dan menggunakan sudo.
Saya memecahkan masalah ini dengan menambahkan skrip .sh dengan perintah startup yang saya inginkan ke etc / profile.d. File .sh dalam profil.d akan dimuat secara otomatis dan perintah apa pun akan diperlakukan seolah-olah Anda menggunakan sudo biasa.
Satu-satunya downside ke ini adalah pengguna yang ditentukan harus loggin untuk memulai hal-hal yang dalam situasi saya selalu terjadi.
lengkapi contoh crontab (terletak di / 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;
Anda dapat menggunakan perintah berikut di shell Anda untuk memulai node Anda selamanya:
forever app.js //my node script
Anda harus ingat bahwa server tempat aplikasi Anda berjalan harus selalu dijaga.