Bagaimana membuat aplikasi node.js berjalan secara permanen?

259

Di server Debian, saya menginstal Node.js. Saya mengerti cara meluncurkan aplikasi dari dempul dengan baris perintah ini:

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

dan sampai di alamat 50.51.52.53:8080(IP dan port).

Tapi begitu saya menutup dempul, maka saya tidak bisa mencapai alamat 50.51.52.53:8080lagi.

Bagaimana cara membuat aplikasi Node.js berjalan secara permanen?

Seperti yang bisa Anda tebak, saya seorang pemula dengan Linux dan Node.js.

Sam
sumber
7
Perhatikan bahwa pm2 adalah alternatif yang baik untuk Forever , jika Anda tidak ingin menggunakan Forever untuk alasan apa pun.
Kevin B
terima kasih @KevinB github.com/Unitech/pm2 adalah alternatif yang sangat bagus
Sachin Chavan

Jawaban:

221

Meskipun jawaban yang lain menyelesaikan masalah OP, semuanya berlebihan dan tidak menjelaskan mengapa ia mengalami masalah ini.

Kuncinya adalah baris ini, "Saya menutup dempul, maka saya tidak bisa mencapai alamat"

Ketika Anda masuk ke host jarak jauh di Putty Anda telah memulai proses SSH linux dan semua perintah yang diketik dari sesi SSH akan dieksekusi sebagai anak-anak dari proses tersebut.

Masalah Anda adalah bahwa ketika Anda menutup Dempul Anda keluar dari sesi SSH yang membunuh proses itu dan setiap proses anak aktif. Ketika Anda menutup dempul Anda secara tidak sengaja membunuh server Anda karena Anda menjalankannya di latar depan . Untuk menghindari perilaku ini, jalankan server di latar belakang dengan menambahkan & ke perintah Anda:

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

Masalahnya di sini adalah kurangnya pengetahuan linux dan bukan pertanyaan tentang simpul. Untuk info lebih lanjut, periksa: http://linuxconfig.org/understanding-foreground-and-background-linux-processes

MEMPERBARUI:

Seperti yang telah disebutkan orang lain, server simpul mungkin masih mati ketika keluar dari terminal. Gotcha yang umum saya temui adalah bahwa meskipun proses node berjalan dalam bg, itu stdout dan stderr masih menunjuk ke terminal. Ini berarti bahwa jika server node menulis ke console.log atau console.error maka akan menerima kesalahan pipa rusak dan crash. Ini dapat dihindari dengan menyalurkan output dari proses Anda:

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

Jika masalah tetap ada maka Anda harus melihat ke hal-hal seperti tmux atau nohup , yang masih lebih kuat daripada solusi spesifik node, karena mereka dapat digunakan untuk menjalankan semua jenis proses (database, layanan logging, bahasa lain).

Kesalahan umum yang dapat menyebabkan server keluar adalah setelah menjalankan, nohup node your_path/server.js &Anda cukup menutup terminal Putty dengan satu klik sederhana. Anda harus menggunakan exitperintah sebagai gantinya, maka server simpul Anda akan aktif dan berjalan.

DogNibbler
sumber
7
Jika Anda masih menutup Sesi Putty saat melakukan &layanan masih ditutup. (Baru diuji pada Debian Jesse)
NiCk Newman
1
Seperti yang dikatakan @NiCkNewman, jawaban ini tidak lengkap! Lihat jawaban Rick Roy untuk solusi yang benar.
thejonwithnoh
19
"&" Membuat proses berjalan di latar belakang tetapi Anda benar-benar perlu menambahkan "nohup" pada awal perintah ini untuk melepaskannya dari jendela konsol sehingga aplikasi tidak akan berhenti ketika jendela pergi tidur setelah beberapa jam, memodifikasi perintah yang disebutkan sebelumnya untuk:nohup node /srv/www/MyUserAccount/server/server.js &
SirRodge
2
AIX powersystem, nohup node myApp.js &menjalankan aplikasi dalam bg tetapi ia mati ketika istilah itu ditutup. Tapi tidak yakin kenapa.
AnBisw
4
@Anjjawn, Anda harus menggunakan exitperintah untuk keluar dari terminal.
Ionut Necula
342

Anda dapat menginstal selamanya menggunakan npm seperti ini:

sudo npm install -g forever

Dan kemudian jalankan aplikasi Anda dengan:

forever server.js

Atau sebagai layanan:

forever start server.js

Forever me-restart aplikasi Anda ketika crash atau berhenti karena suatu alasan. Untuk membatasi mulai ulang hingga 5 Anda dapat menggunakan:

forever -m5 server.js

Untuk membuat daftar semua proses yang berjalan:

forever list

Perhatikan bilangan bulat di dalam tanda kurung dan gunakan sebagai berikut untuk menghentikan proses:

forever stop 0

Mulai ulang proses yang sedang berjalan:

forever restart 0

Jika Anda bekerja pada file aplikasi Anda, Anda dapat menggunakan -wparameter untuk memulai kembali secara otomatis setiap kali server.jsfile Anda berubah:

forever -w server.js
N20
sumber
11
@MarthaJames jika ditutup ketika sesi / jendela ssh Anda ditutup, maka Anda mungkin lupa untuk memasukkan "mulai" diforever start <file>
Kristian
8
Apa perbedaan antara menggunakan forever server.jsdan forever start server.js? Saya tahu katanya "sebagai layanan" tetapi apa artinya itu?
Marquizzo
5
Ketika saya mengetik forever server.js, itu mulai server. Jika saya menekan Ctrl+ C, itu akan menghentikan layanan. Jika saya mengetik forever start server.jsmaka itu memulai layanan dan bahkan jika saya menekan Ctrl+ Citu tetap terbuka. Anda kemudian dapat melakukan perintah lain yang dirujuk di atas untuk menghentikan / melihat daftar. Setidaknya itulah yang saya alami.
Termato
6
Apakah ini memulai skrip setelah server restart?
beingalex
1
The forevermodul (v0.15.3) rentan terhadap Regular Expression serangan Denial of Service dan tidak boleh digunakan: github.com/foreverjs/forever/issues/960
Benny Neugebauer
82

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]
Vikash Rajpurohit
sumber
1
Tuhan memberkati Anda! berhasil!! Forever dan Nohup tidak bekerja di server web layanan amazon bitnami nodejs ( docs.bitnami.com/aws/infrastructure/nodejs ). PM2 bekerja dengan sangat baik!
Polras
Perpustakaan ini tampaknya memiliki jumlah awal terbanyak di github
DragonFire
41

Saya akan merekomendasikan mencari sesuatu seperti Forever untuk me-restart Node jika terjadi crash, dan menangani daemonisasi ini untuk Anda.

Brad
sumber
Saya ingin menunjukkan bahwa tanpa nohup, simpul akan keluar ketika Anda keluar dari sesi ssh jika Anda menjalankannya dengan cara ini (kecuali jika Anda menggunakan sesuatu seperti layar untuk tmux).
Haozhun
1
@ Haozhun, Menarik, tapi itu tidak berhasil untuk saya di komputer saya. Ketika saya ssh in dan memulai sesuatu menggunakan perintah ini, itu berjalan selamanya di latar belakang, bahkan setelah menutup sesi SSH.
Brad
@Brad Silakan lihat jawaban ke-2 di stackoverflow.com/questions/4018154/… . Tampaknya beberapa orang setuju dengan komentar pertama dari pertanyaan itu yang menjelaskan nohup. Alangkah baiknya jika kita bisa menyelesaikan kebingungan ini. Tapi saya tidak tahu harus mulai dari mana.
Haozhun
4
Bagi kebanyakan unixen (termasuk sebagian besar distro Linux), menjalankan hal-hal di latar belakang akan tetap mematikan proses jika Anda menutup jendela terminal. Untuk mencegahnya, jalankan dengan nohup. Contoh:nohup node app.js &
slebetman
1
Saya menggunakan Forever dengan Linux env produksi. Saya biasanya menggunakan perintah selamanya mulai - minUptime 10000 -o /logs/myapp.log nodeApp.js
mbokil
36

Jika Anda hanya ingin menjalankan aplikasi simpul di terminal selalu, cukup gunakan layar.

Instal di ubuntu / debian:

sudo apt-get install screen

Pemakaian:

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

ctrl + adan kemudian ctrl + dmemberhentikan

Untuk mendapatkan kembali:

Satu layar: screen -r

Jika ada lebih dari satu, Anda dapat mencantumkan semua layar dengan: screen -ls

Lalu: screen -r pid_number

film42
sumber
1
Ini adalah pilihan yang baik karena juga memungkinkan saya untuk beralih proses ke latar depan kapan saja
aexl
26

Anda cukup menggunakan ini

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

Ini akan membuat aplikasi tetap berjalan dan untuk mematikannya Anda harus membunuhnya.

Untuk itu Anda bisa menginstal htopdan kemudian mencari node dan kemudian membunuhnya

Rick Roy
sumber
18
Penting untuk dicatat bahwa dalam kasus ini, pengguna harus keluar dari sesi Putty dengan benar (yaitu melalui exitperintah). Jika pengguna hanya menutup jendela, ini mungkin menggunakan sinyal selain SIGHUPuntuk mengakhiri proses, dan karena itu simpul akan mati pula.
thejonwithnoh
1
+1 untuk menjadi solusi Linux serbaguna yang sederhana untuk masalah ini. Ini lebih baik daripada jawaban DogNibbler .
thejonwithnoh
@ thejonwithnoh setelah membaca komentar Anda Saya telah mencoba dengan tiba-tiba menutup dempul tetapi server masih berfungsi, mungkin itu ada hubungannya dengan bagaimana env dikonfigurasi. Tapi saya pikir untuk apa OP meminta ini akan menjadi cara paling sederhana untuk mencapainya
Rick Roy
Saya suka pendekatan sederhana ini, ini yang saya gunakan, karena untuk membunuhnya, yang termudah adalah hanya killall node, yang akan membunuh semua proses simpul, dalam kasus saya hanya satu.
Nelson
@Nelson Itu akan membunuh semua proses simpul bagaimana jika Anda memiliki beberapa skrip berjalan dan hanya ingin mengakhiri satu spesifik, saya sarankan Anda menemukan proses dan kemudian mengakhiri yang tertentu kalau-kalau Anda memiliki beberapa proses simpul berjalan di server produksi dan tidak ingin merasa seperti menjadi mimpi buruk: D
Rick Roy
12

Forever adalah modul NodeJs yang sangat baik untuk melakukan hal itu.

Instal foreverdengan mengetikkan baris perintah

$ npm install forever -g

Kemudian gunakan perintah berikut untuk menjalankan skrip node.js

$ forever start /path/to/script.js

Anda baik untuk pergi. Selain itu Anda dapat berlari

$ forever list

untuk melihat semua skrip yang berjalan. Anda dapat menghentikan skrip tertentu dengan mengetik

$ forever stop [pid]

di mana [pid]ID proses dari skrip akan Anda peroleh dari listperintah. Untuk menghentikan semua skrip, Anda dapat mengetik

$ forever stopall

sumber
10

nohup bekerja saya cek di AWS Ubunto vm ikuti yang benarsyntax

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

lalu tekan enter Anda akan melihat baris ini

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

lalu ketik ini

rm nohup.out

masukkan deskripsi gambar di sini

Adiii
sumber
3
Saya suka bagaimana Anda menghapus nama host di bash prompt kecil, tetapi meninggalkannya di judul besar jendela 😂
conny
10

Instalasi

$ [sudo] npm install forever -g

Anda dapat menggunakan selamanya untuk menjalankan skrip secara terus menerus

forever start server.js

forever list

untuk layanan berhenti

forever stop server.js
Sudhir singh
sumber
9

Inilah solusi pemula yang telah saya gunakan untuk proyek pribadi saya:

Tempatkan di /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

Ini juga akan menangani respawning aplikasi Anda jika crash. Ini akan menyerah upaya untuk respawn aplikasi Anda jika crash 3 atau lebih banyak dalam waktu kurang dari 15 detik.

Adam Eberlin
sumber
9

Selama pengembangan, saya sarankan menggunakan nodemon . Ini akan memulai ulang server Anda setiap kali ada perubahan file. Seperti yang orang lain tunjukkan, Selamanya adalah pilihan tetapi dalam produksi, semuanya tergantung pada platform yang Anda gunakan. Anda biasanya ingin menggunakan cara sistem operasi yang direkomendasikan untuk menjaga layanan tetap terjaga (mis. Http://www.freedesktop.org/wiki/Software/systemd/ ).

Olivier Lalonde
sumber
Ini bekerja untuk saya pada aplikasi MEAN.JS - nodemonmenjalankan perintah kasar kecuali jika Anda menentukan file server JS, jadi saya menggunakan ini untuk menjalankan mongo dan simpul selamanya / secara bersamaan
J-Dizzle
8

Saya telah menemukan selamanya untuk melakukan pekerjaan dengan sangat baik.

Dengan asumsi Anda sudah menginstal npm, jika tidak, lakukan saja

sudo apt-get install npm

Kemudian instal selamanya

npm install forever --global

Sekarang Anda bisa menjalankannya seperti ini

forever start app.js

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

erax
sumber
npm rm -g selamanya untuk menghapusnya
DragonFire
6

Pertama instal pm2 secara global

npm install -g pm2

lalu mulai

pm2 start bin/www 
Vinayak Shedgeri
sumber
5

Cara lain adalah membuat unit sistem untuk aplikasi Anda. buat file "XXX.service" di folder "/ etc / systemd / system", mirip dengan ini:

[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

Keuntungannya adalah aplikasi akan berjalan sebagai layanan, secara otomatis restart jika crash.

Anda juga dapat menggunakan sytemctl untuk mengelolanya:

systemctl start XXXuntuk memulai layanan, systemctl stop XXXmenghentikannya dan systemctl enable XXXmemulai aplikasi secara otomatis ketika sistem melakukan booting.

Alex
sumber
4

Saya harap ini akan membantu Anda.

Di baris perintah, instal selamanya:

npm install forever -g

Buat file contoh:

sudo nano server.js 

Anda dapat mengedit file dan mendapatkan hasil langsung di browser Anda.
Anda dapat menggunakan filezilla atau editor apa pun untuk mengedit file. Jalankan perintah ini untuk menjalankan file:

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

masukkan deskripsi gambar di sini

Ghanshyam Nakiya
sumber
4

Tidak perlu menginstal paket lain.

Jalankan perintah ini

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

server.js adalah file server Anda atau bisa juga api.js

Setelah itu tekan " keluar " untuk menutup terminal

exit
Gajender Singh
sumber
0

Paket selamanya bekerja untuk saya, hanya satu hal, itu tergantung pada sedalam-dalamnya , jadi jika Anda memiliki masalah dengan menginstalnya seperti:

npm -g install forever

Mencoba:

npm -g install forever deep-equal@1.1.1

sebagai gantinya.

Alireza
sumber