Bagaimana cara menjalankan aplikasi Node.js sebagai prosesnya sendiri?

195

Apa cara terbaik untuk menggunakan Node.js?

Saya memiliki VPS Dreamhost (itulah yang mereka sebut VM ), dan saya telah dapat menginstal Node.js dan mengatur proxy. Ini berfungsi dengan baik selama saya menjaga koneksi SSH yang saya mulai dengan simpul terbuka.

hormatilah Kode
sumber
6
Hmm, aneh bagi saya bahwa Anda memanggil menggunakan Forever sebagai "deploying node.js". Bukankah itu hanya alat pemantauan / pengawasan proses? Biasanya penyebaran web berarti (setidaknya apa yang saya temui dalam artikel) beberapa kegiatan yang saling terkait yang membuat aplikasi web tersedia (alat proses ini menjadi bagian darinya). Bagaimanapun, ini masih posting yang bagus di sini di StackOverflow karena saya sudah belajar dari jawaban semua orang.
mikong
Ini hanya penyebaran node.js paling sederhana di Dreamhost. Tujuannya hanya untuk membuat simpul berjalan andal sebagai titik awal untuk membangun.
respectTheCode
Bagaimana Anda menangani penerusan domain ke port node yang sedang berjalan?
GRM
2
@ grm Saya menggunakan HTTP-Proxy github.com/nodejitsu/node-http-proxy
respectTheCode
Kami menggunakan Elastic Beanstalk sekarang dan bekerja dengan cukup baik.
respectTheCode

Jawaban:

107

Jawaban 2016 : hampir setiap distribusi Linux dilengkapi dengan systemd, yang berarti selamanya, monit, PM2, dll. Tidak lagi diperlukan - OS Anda sudah menangani tugas-tugas ini .

Buat myapp.servicefile (ganti 'myapp' dengan nama aplikasi Anda, tentu saja):

[Unit]
Description=My app

[Service]
ExecStart=/var/www/myapp/app.js
Restart=always
User=nobody
# Note Debian/Ubuntu uses 'nogroup', RHEL/Fedora uses 'nobody'
Group=nobody
Environment=PATH=/usr/bin:/usr/local/bin
Environment=NODE_ENV=production
WorkingDirectory=/var/www/myapp

[Install]
WantedBy=multi-user.target

Catatan jika Anda baru mengenal Unix: /var/www/myapp/app.js seharusnya ada #!/usr/bin/env nodedi baris pertama.

Salin file layanan Anda ke /etc/systemd/systemfolder.

Beri tahu systemd tentang layanan baru dengan systemctl daemon-reload.

Mulai dengan systemctl start myapp.

Aktifkan untuk dijalankan saat boot dengan systemctl enable myapp.

Lihat log dengan journalctl -u myapp

Ini diambil dari Bagaimana kami menggunakan aplikasi simpul di Linux, edisi 2018 , yang juga mencakup perintah untuk menghasilkan AWS / DigitalOcean / Azure CloudConfig untuk membangun Linux / server simpul (termasuk .servicefile).

mikemaccana
sumber
1
Ada ide tentang bagaimana cara menghadapinya Failed to issue method call: Unit name ... is not valid.?
Julien Genestoux
1
@JulienGenestoux, nama 'unit' sama dengan layanan Anda. Kedengarannya ada perbedaan di sana. Setelah Anda menyalin file ke /etc/systemd/systemAnda mungkin perlu menjalankan systemctl daemon-reload(systemd biasanya akan memberi tahu Anda jika ini diperlukan). TBH ini sebaiknya ditanyakan sebagai pertanyaan terpisah.
mikemaccana
3
Alih-alih menyalin file layanan Anda ke /etc/systemd/system, Anda bisa menggunakan systemctl enable /full/path/to/myapp.service, yang menciptakan symlink /etc/systemd/systemuntuk Anda.
Arne
1
Bagaimana cara membandingkannya dengan PM2? Bisakah itu menggantikan PM2 atau apakah PM2 menawarkan fitur yang lebih diperlukan?
Sergei Basharov
1
@VinodSrivastav nodedisebut dengan /var/www/myapp/app.jssendirinya. Di Unix, jika Anda membuat file dapat dieksekusi, dan baris pertama dimulai dengan #!/some/filefile akan ditafsirkan dengan biner itu. Google 'juru bahasa Unix' untuk tahu lebih banyak.
mikemaccana
101

Gunakan Selamanya . Ini menjalankan program Node.js dalam proses terpisah dan me-restart mereka jika ada yang mati.

Pemakaian:

  • forever start example.js untuk memulai suatu proses.
  • forever list untuk melihat daftar semua proses dimulai selamanya
  • forever stop example.jsuntuk menghentikan proses, atau forever stop 0menghentikan proses dengan indeks 0 (seperti yang ditunjukkan oleh forever list).
David Tang
sumber
Ini dekat. Ini dimulai dengan baik tetapi tidak akan membiarkan saya menghentikan apa pun. Saya bisa logout dan kembali kemudian membunuh proses node. Selamanya tidak memulai kembali. Jadi saya sedang memikirkan sesuatu tentang cara kerjanya yang tidak kompatibel dengan DH.
respectTheCode
@ Kevin, Anda tidak dapat membunuh proses simpul karena Forever sendiri berjalan pada simpul! Saya telah menambahkan beberapa petunjuk penggunaan ke jawaban saya, termasuk cara menghentikan proses. Saya telah menggunakan ini di VPS saya dan itu berfungsi seperti pesona.
David Tang
forever stop 0memiliki kesalahan dan hal-hal hanya agak berantakan dari sana. Saya telah mencoba melakukan ini tanpa root pada penggunanya sendiri sehingga saya dapat membersihkan dengan mudah begitu saya menemukan solusi yang tepat. Itu mungkin masalah saya. Saya akan melihat lebih dalam lagi.
respectTheCode
Saya memiliki sesuatu yang salah dengan npm yang menyebabkan masalah. Dengan npm dan node terinstal dengan benar selamanya berfungsi dengan baik. Apa yang akhirnya saya lakukan adalah menambahkan perintah mulai selamanya ke set cronjob untuk dijalankan saat restart. Saya sekarang bekerja pada aplikasi simpul kecil yang akan membiarkan saya memulai dan berhenti selamanya procs.
respectTheCode
Ada alternatif untuk Forever yang menggunakan API cluster asli node: github.com/superjoe30/naught
andrewrk
41

Saya telah menulis tentang metode penerapan saya di sini: Menyebarkan aplikasi node.js

Pendeknya:

  • Gunakan kait pasca-terima git
  • Jake untuk alat pembuatan
  • Mulai sebagai pembungkus layanan untuk simpul
  • Monit untuk memonitor dan me-restart aplikasi itu mereka turun
  • nginx untuk merutekan permintaan ke aplikasi yang berbeda di server yang sama
Ben
sumber
2
Jika saya akan selalu memiliki satu situs Node di server saya, dapatkah saya meninggalkan Nginx dengan aman?
Dor
3
Tautannya
@Aku tahu ini adalah jawaban yang terlambat, tapi aku tidak mau. Terlepas dari hal-hal seperti terminasi dan caching SSL, proxy reverse nginx di depan host memungkinkan Anda memiliki fleksibilitas infrastruktur yang lebih besar daripada menjalankan node secara langsung pada port 80. Ini juga berarti Anda tidak harus menjalankan node sebagai root, yang saya pikir adalah argumen yang cukup berat mendukung pengaturan nginx.
Chris Browne
16

PM2 melakukan trik.

Fitur-fiturnya adalah: Pemantauan, pemuatan ulang kode panas, penyeimbang beban bawaan, skrip startup otomatis, dan proses menghidupkan kembali / membuang.

Nickleefly
sumber
Apakah ini kompatibel dengan layanan seperti Heroku?
FRD
@ FRD Saya tidak berpikir itu berfungsi dengan heroku, periksa artikel ini
nickleefly
9

Anda dapat menggunakan monit, forever, upstartatau systemduntuk memulai server Anda.

Anda dapat menggunakan Varnish atau HAProxy alih-alih Nginx (Nginx dikenal tidak bekerja dengan soket web).

Sebagai solusi cepat dan kotor yang dapat Anda gunakan nohup node your_app.js &untuk mencegah aplikasi Anda berhenti dengan server Anda, tetapi forever, monitdan solusi lain yang diusulkan lebih baik.

nponeccop
sumber
2
Seorang pengguna "Sergey Yarotskiy" mencoba mengedit posting Anda dengan mengatakan bahwa Nginx sekarang mendukung WebSockets (sejak versi 1.3). Saya menolak suntingan karena saya pikir itu harus diposting sebagai komentar. (Kalau tidak, Anda akan memiliki dua kalimat yang bertentangan di pos yang sama, yang membingungkan.)
Backlin
7

Saya membuat skrip pemula yang saat ini digunakan untuk aplikasi saya:

description "YOUR APP NAME"
author "Capy - http://ecapy.com"

env LOG_FILE=/var/log/node/miapp.log
env APP_DIR=/var/node/miapp
env APP=app.js
env PID_NAME=miapp.pid
env USER=www-data
env GROUP=www-data
env POST_START_MESSAGE_TO_LOG="miapp HAS BEEN STARTED."
env NODE_BIN=/usr/local/bin/node
env PID_PATH=/var/opt/node/run
env SERVER_ENV="production"

######################################################

start on runlevel [2345]
stop on runlevel [016]

respawn
respawn limit 99 5

pre-start script
    mkdir -p $PID_PATH
    mkdir -p /var/log/node
end script

script
    export NODE_ENV=$SERVER_ENV
    exec start-stop-daemon --start --chuid $USER:$GROUP --make-pidfile --pidfile $PID_PATH/$PID_NAME --chdir $APP_DIR --exec $NODE_BIN -- $APP >> $LOG_FILE 2>&1
end script

post-start script
    echo $POST_START_MESSAGE_TO_LOG >> $LOG_FILE
end script

Kustomisasi semua sebelum ##########, buat file di /etc/init/your-service.conf dan tempel di sana.

Maka kamu bisa:

start your-service
stop your-service
restart your-service
status your-service
Capy
sumber
Terima kasih, apa yang saya butuhkan.
Nilson Morais
6

Saya telah menulis panduan yang cukup komprehensif untuk menggunakan Node.js, dengan contoh file:

Tutorial: Cara Menyebarkan Aplikasi Node.js, Dengan Contoh

Ini mencakup hal-hal seperti http-proxy, SSL dan Socket.IO .

Rich Jones
sumber
Ini terlihat hebat. Saya menggunakan heroku untuk pengembangan dan peluncuran awal tetapi pada akhirnya akan perlu melewati heroku dan menyebar langsung ke EC2. Saya akan bermain dengan ini ketika saya punya waktu.
respectTheCode
5

Inilah artikel yang lebih panjang tentang pemecahan masalah ini dengan systemd: http://savanne.be/articles/deploying-node-js-with-systemd/

Beberapa hal yang perlu diingat:

  • Siapa yang akan memulai pemantauan proses Anda? Forever adalah alat yang hebat, tetapi membutuhkan alat pemantauan agar tetap berjalan. Itu agak konyol, mengapa tidak menggunakan sistem init Anda saja?
  • Bisakah Anda memantau proses Anda secara memadai?
  • Apakah Anda menjalankan beberapa backend? Jika demikian, apakah Anda memiliki ketentuan untuk mencegah salah satu dari mereka menjatuhkan yang lain dalam hal penggunaan sumber daya?
  • Apakah layanan akan dibutuhkan sepanjang waktu? Jika tidak, pertimbangkan aktivasi soket (lihat artikel).

Semua hal ini mudah dilakukan dengan systemd.

Ruben Vermeersch
sumber
5

Jika Anda memiliki akses root, Anda lebih baik mengatur daemon sehingga berjalan aman dan suara di latar belakang. Anda dapat membaca bagaimana melakukannya untuk Debian dan Ubuntu di posting blog Jalankan Node.js sebagai Layanan di Ubuntu .

Seldaek
sumber
Saya tidak berpikir saya memiliki root tetapi tampaknya saya hanya perlu mengaktifkannya di panel web. Saya akan mencoba ini.
respectTheCode
3

Selama-lamanya akan melakukan trik.

@ Kevin: Anda harus dapat membunuh proses dengan baik. Saya akan memeriksa dokumentasi sedikit. Jika Anda dapat mereproduksi kesalahan, akan lebih baik mempostingnya sebagai masalah di GitHub.

Marak
sumber
Siapa itu Kevin? OP?
Peter Mortensen
2

Seperti yang dikatakan Box9, Forever adalah pilihan yang baik untuk kode produksi. Tetapi juga memungkinkan untuk menjaga proses tetap berjalan bahkan jika koneksi SSH ditutup dari klien.

Meskipun tidak selalu merupakan ide yang baik untuk produksi, ini sangat berguna ketika di tengah sesi debug yang panjang, atau untuk mengikuti output konsol dari proses yang panjang, atau setiap kali berguna untuk memutuskan koneksi SSH Anda, tetapi menjaga terminal tetap hidup di server untuk menyambung kembali nanti (seperti memulai aplikasi Node.js di rumah dan menghubungkan kembali ke konsol nanti di tempat kerja untuk memeriksa bagaimana keadaannya).

Dengan asumsi bahwa server Anda adalah kotak * nix, Anda dapat menggunakan perintah layar dari shell untuk tetap menjalankan proses meskipun klien SSH ditutup. Anda dapat mengunduh / menginstal layar dari web jika belum diinstal (mencari paket untuk distribusi Anda jika Linux, atau menggunakan MacPorts jika OS X).

Ini berfungsi sebagai berikut:

  1. Saat Anda pertama kali membuka koneksi SSH, ketik 'layar' - ini akan memulai sesi layar Anda.
  2. Mulai bekerja seperti biasa (yaitu mulai aplikasi Node.js Anda)
  3. Setelah selesai, tutup terminal Anda. Proses server Anda akan terus berjalan.
  4. Untuk menyambung kembali ke konsol Anda, ssh kembali ke server, masuk, dan masukkan 'layar -r' untuk menyambung kembali. Konteks konsol lama Anda akan siap untuk Anda gunakan kembali.
  5. Untuk keluar dari layar, saat terhubung ke server, ketik 'keluar' pada prompt konsol - yang akan menjatuhkan Anda ke shell biasa.

Anda dapat menjalankan beberapa sesi layar secara bersamaan seperti ini jika perlu, dan Anda dapat menyambungkannya ke mana saja dari klien mana pun. Baca dokumentasi online untuk semua opsi.

cjcela
sumber
Informasi yang baik untuk dimiliki. Saya setuju bahwa itu tidak akan berfungsi untuk produksi tetapi bisa sangat berguna ketika melakukan debug pada server jarak jauh.
respectTheCode
mengapa tidak menggunakan nohup node myapp.js & 2> /var/log/myapp.log 1> / dev / null
markus_p
Saya menemukan av ini bermanfaat youtube.com/watch?v=P4mT5Tbx_KE menjelaskan nohupdanforever
Vinod Srivastav
1

Forever adalah pilihan yang baik untuk menjaga aplikasi tetap berjalan (dan ini dapat diinstal sebagai modul yang bagus).

Tetapi untuk 'penyebaran' yang lebih serius - hal-hal seperti manajemen jarak jauh dari penyebaran, memulai kembali, menjalankan perintah dll - Saya akan menggunakan capistrano dengan ekstensi node.

https://github.com/loopj/capistrano-node-deploy

martir
sumber
1

https://paastor.com adalah layanan yang relatif baru yang melakukan penyebaran untuk Anda, ke VPS atau server lain. Ada CLI untuk mendorong kode. Paastor memiliki tingkat gratis, setidaknya itu pada saat memposting ini.

ruffrey
sumber
1

Coba gunakan node-deploy-server . Ini adalah toolset kompleks untuk menyebarkan aplikasi ke server pribadi Anda. Ini ditulis dalam Node.js dan menggunakan npm untuk instalasi.

AndyGrom
sumber