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?
190
Jawaban:
Saya sarankan menggunakan crontab. Mudah digunakan.
Bagaimana caranya
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.
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:
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:
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 itunode
, Anda mungkin juga ingin memberikan jalur lengkap kenode
:Bacaan lebih lanjut
sumber
@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.
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.
sumber
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 adalahapp.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
sumber
/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>:
sumber
Sebuah metode crontab alternatif terinspirasi oleh ini jawaban dan ini posting blog.
1. Buat file skrip bash (ubah bob menjadi pengguna yang diinginkan).
2. Salin dan tempel ini di dalam file yang baru saja Anda buat.
Pastikan untuk mengedit jalur di atas sesuai dengan konfigurasi Anda!
3. Pastikan skrip bash dapat dieksekusi.
4. Uji skrip bash.
5. Ganti "bob" dengan pengguna runtime untuk node.
6. Salin dan tempel (ubah bob ke pengguna yang diinginkan).
Simpan crontab.
Anda telah berhasil sampai akhir, hadiah Anda adalah reboot (untuk menguji) :)
sumber
Jawaban disalin dari pertanyaan terlampir .
Anda dapat menggunakan PM2 , ini adalah manajer proses produksi untuk aplikasi Node.js dengan penyeimbang beban bawaan.
Instal PM2
Mulai aplikasi
Jika Anda menggunakan ekspres maka Anda dapat memulai aplikasi seperti
Daftar semua proses yang berjalan:
Ini akan mendaftar semua proses. Anda kemudian dapat menghentikan / memulai kembali layanan Anda dengan menggunakan ID atau Nama aplikasi dengan perintah berikut.
Untuk menampilkan log
sumber
$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 sistemAnda 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:
Saya harus memastikan folder dan PATH secara eksplisit diatur atau tersedia untuk pengguna root karena skrip init.d dijalankan sebagai root.
sumber
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.
ref: https://www.digitalocean.com/community/tutorials/how-to-use-pm2-to-setup-a-node-js-production-environment-on-an-ubuntu-vps
sumber
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
sumber
crontab
tidak berfungsi untuk saya di CentOS x86 6.5. @reboot sepertinya tidak berfungsi.Akhirnya saya mendapat solusi ini:
Edit:
/etc/rc.local
Tambahkan baris ini ke akhir file. Ubah
USER_NAME
danPATH_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.Jangan diatur
NODE_ENV
dalam jalur terpisah, aplikasi Anda akan tetap berjalan dalam mode pengembangan, karena selamanya tidak mendapatkanNODE_ENV
.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 AndaUSER_NAME
masuk.Jadi Anda dapat menjalankan perintah seperti selamanya berhenti / mulai
/PATH_TO_PROJECT/app.js
melalui ssh tanpa pengaturanNODE_ENV
lagi.sumber
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:
sumber
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:
https://www.digitalocean.com/community/tutorials/how-to-use-pm2-to-setup-a-node-js-production-environment-on-an-ubuntu-vps
Menggunakan PM2 seperti yang dijelaskan sangat sederhana dan berfungsi dengan baik: Server virtual saya mengalami dua crash fisik sejak - downtime hanya sekitar satu menit.
sumber
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.
sumber
lengkapi contoh crontab (terletak di / etc / crontab) ..
sumber
Anda dapat menggunakan perintah berikut di shell Anda untuk memulai node Anda selamanya:
Anda harus ingat bahwa server tempat aplikasi Anda berjalan harus selalu dijaga.
sumber