Node.js uygulamasını kendi işlemi olarak nasıl çalıştırabilirim?


195

Node.js'yi dağıtmanın en iyi yolu nedir?

Bir Dreamhost VPS'im var ( VM diyorlar ) ve Node.js'yi yükleyip bir proxy ayarlayabildim. Düğüme açtığım SSH bağlantısını açık tuttuğum sürece bu harika çalışıyor.


6
Hmm, Forever'ı "node.js'yi dağıtmak" olarak adlandırmanız garip görünüyor. Bu sadece bir süreç izleme / denetleme aracı değil mi? Genellikle web dağıtımı (en azından makalelerde karşılaştığım şey), bir web uygulamasını kullanılabilir kılan birbiriyle ilişkili birkaç etkinlik anlamına gelir (bu işlem aracı bunun bir parçasıdır). Her neyse, bu herkesin cevaplarından öğrendiğim gibi StackOverflow'da hala harika bir gönderi.
mikong

Bu, node.js'nin Dreamhost'a en basit şekilde dağıtılmasıdır. Amaç, düğümün, inşa edilecek bir başlangıç ​​noktası olarak güvenilir bir şekilde çalışmasını sağlamaktı.
respectTheCode

Etki alanının çalıştığı bağlantı noktası düğümüne iletilmesini nasıl sağladınız?
grm


Şimdi Elastik Beanstalk kullanıyoruz ve oldukça iyi çalışıyor.
respectTheCode

Yanıtlar:


107

2016 cevabı : neredeyse her Linux dağıtımı sistemd ile birlikte gelir, bu da sonsuza dek, monit, PM2, vb. Artık gerekli değildir - işletim sisteminiz zaten bu görevleri yerine getirir .

Bir myapp.servicedosya oluşturun (açıkça 'myapp' yerine uygulamanızın adını yazın):

[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

Unix'te yeniyseniz: ilk satırda /var/www/myapp/app.jsolması gerektiğini unutmayın #!/usr/bin/env node.

Servis dosyanızı /etc/systemd/systemklasöre kopyalayın.

Systemd ile yeni servis hakkında bilgi verin systemctl daemon-reload.

İle başlayın systemctl start myapp.

İle önyüklemede çalışmasını etkinleştirin systemctl enable myapp.

İle günlükleri görün journalctl -u myapp

Bu, Linux / düğüm sunucuları ( dosya dahil ) oluşturmak için bir AWS / DigitalOcean / Azure CloudConfig oluşturma komutlarını da içeren, Linux, 2018 sürümünde düğüm uygulamalarını nasıl dağıttığımızdan alınmıştır .service.


1
Nasıl başa çıkılacağı hakkında bir fikrin var Failed to issue method call: Unit name ... is not valid.mı?
Julien Genestoux

1
@JulienGenestoux 'birim' adı hizmetinizle aynıdır. Kulağa bir tutarsızlık varmış gibi geliyor. Dosyayı kopyaladıktan sonra /etc/systemd/systemçalıştırmanız gerekebilir systemctl daemon-reload(systemd normalde bunun gerekli olup olmadığını size bildirir). Bu en iyi ayrı bir soru olarak sorulur.
mikemaccana

3
Servis dosyanızı içine kopyalamak yerine, /etc/systemd/systemsadece sizin için systemctl enable /full/path/to/myapp.servicebir sembolik bağlantı oluşturan kullanabilirsiniz /etc/systemd/system.
Arne

1
Pm2 ile nasıl karşılaştırılır? Pm2'nin yerini alabilir mi veya pm2 daha gerekli özellikler sunuyor mu?
Sergei Basharov

1
@VinodSrivastav kendi başına nodedenir /var/www/myapp/app.js. Unix'te, bir dosyayı yürütülebilir yaparsanız ve ilk satır #!/some/filedosyayla başlarsa bu ikili dosyayla yorumlanır. Google 'tercüman Unix' hakkında daha fazla bilgi.
mikemaccana

101

Sonsuza kadar kullan . Node.js programlarını ayrı işlemlerde çalıştırır ve ölürse yeniden başlatır.

Kullanımı:

  • forever start example.js bir süreç başlatmak.
  • forever list sonsuza dek başlatılan tüm süreçlerin listesini görmek
  • forever stop example.jsişlemi durdurmak veya forever stop 0dizin 0 ile işlemi durdurmak için (ile gösterildiği gibi forever list).

Bu yakın. Sadece iyi başlar ama bir şey durmama izin vermeyeceğim. Oturumu kapatıp tekrar açabildim ve sonra düğüm işlemini öldürdüm. Sonsuza kadar yeniden başlatmadı. Bu yüzden nasıl çalıştığı hakkında DH ile uyumlu olmadığını düşünüyorum.
respectTheCode

@Kevin, düğüm sürecini öldüremezsiniz çünkü Forever'ın kendisi düğümde çalışır! Cevabıma bir işlemin nasıl durdurulacağı da dahil olmak üzere bazı kullanım talimatları ekledim. Bunu VPS'imde kullanıyorum ve bir cazibe gibi çalıştı.
David Tang

forever stop 0bir hata vardı ve işler oradan ayrı düştü. Doğru çözümü bulduktan sonra kolayca temizleyebilmem için kendi kullanıcısı üzerinde kök olmadan yapmaya çalışıyorum. Bu benim sorunum olabilir. Buna biraz daha bakacağım.
respectTheCode

Sorunlara neden olan npm ile yanlış bir şey vardı. Npm ve düğüm doğru monte ile sonsuza dek harika çalışır. Ne kadar sona erdi yeniden başlatma çalıştırmak için bir cronjob seti sonsuza kadar start komutları eklemek oldu. Şimdi sonsuza kadar procs başlatmak ve durdurmak sağlayacak küçük bir düğüm uygulaması üzerinde çalışıyorum.
respectTheCode

Düğümün yerel küme API'sını kullanan Forever'a bir alternatif var: github.com/superjoe30/naught
andrewrk

41

Burada dağıtım yöntemimle ilgili yazdım: node.js uygulamalarını dağıtma

Kısacası:

  • Git alma sonrası kancasını kullan
  • Yapım aracı için Jake
  • Düğüm için hizmet sarıcı olarak başlatma
  • İzledikleri uygulamaları izlemek ve yeniden başlatmak için monit
  • istekleri aynı sunucudaki farklı uygulamalara yönlendirmek için nginx

2
Sunucumda her zaman tek bir Düğüm sitesi olacaksa, Nginx'i güvenle atabilir miyim?
Dor

3
Bağlantı kopmuş gibi görünüyor
verybadalloc

@Bu sorunun geç bir yanıt olduğunu biliyorum, ama istemezdim. SSL sonlandırması ve önbelleğe alma gibi şeylerin yanı sıra, ana bilgisayarın önündeki bir nginx ters proxy'si, düğümü doğrudan bağlantı noktası 80'de çalıştırmaktan daha büyük bir altyapı esnekliği sağlar. Ayrıca düğümü kök olarak çalıştırmanız gerekmediği anlamına gelir. nginx kurulumu lehine oldukça ağır bir argüman.
Chris Browne

16

pm2 püf noktaları yapar.

Özellikler: İzleme, sıcak kod yeniden yükleme, yerleşik yük dengeleyici, otomatik başlatma komut dosyası ve yeniden diriltme / döküm işlemleri.


Heroku gibi servislerle uyumlu mu?
FRD

@FRD Ben heroku ile çalıştığını düşünmüyorum, bu makaleye
atın

9

Sen kullanabilirsiniz monit, forever, upstartya systemdda sunucuyu başlatın.

Nginx yerine Varnish veya HAProxy kullanabilirsiniz (Nginx'in websockets ile çalışmadığı bilinmektedir).

Hızlı ve kirli çözüm olarak kullanabileceğiniz nohup node your_app.js &uygulama sizin sunucu ile sonlandırma önlemek için, ancak forever, monitve diğer önerilen çözümler iyidir.


2
Bir kullanıcı "Sergey Yarotskiy", Nginx'in artık WebSockets'i (sürüm 1.3'ten beri) desteklediğini söyleyerek sizi düzenlemeye çalıştı. Bunun yerine yorum olarak gönderilmesi gerektiğini düşündüğüm için düzenlemeyi reddettim. (Aksi takdirde, aynı
gönderide

7

Şu anda uygulamalarım için kullanılan bir Upstart komut dosyası hazırladım:

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

######### önce tüm özelleştirin, /etc/init/your-service.conf içinde bir dosya oluşturun ve oraya yapıştırın.

O zaman yapabilirsin:

start your-service
stop your-service
restart your-service
status your-service

Teşekkürler, tam ihtiyacım olan şey.
Nilson Morais


5

İşte bu sorunu systemd ile çözme hakkında daha uzun bir makale: http://savanne.be/articles/deploying-node-js-with-systemd/

Akılda tutulması gereken bazı şeyler:

  • Süreç izlemeye kim başlayacak? Sonsuza dek harika bir araçtır, ancak kendini çalışmaya devam ettirmek için bir izleme aracına ihtiyacı vardır. Bu biraz saçma, neden sadece init sisteminizi kullanmıyorsunuz?
  • Süreçlerinizi yeterince izleyebilir misiniz?
  • Birden fazla arka uç mu kullanıyorsunuz? Eğer öyleyse, kaynak kullanımı açısından herhangi birinin diğerlerini düşürmesini engelleyecek hükümleriniz var mı?
  • Hizmet her zaman gerekli olacak mı? Değilse, soket aktivasyonunu düşünün (makaleye bakın).

Tüm bunlar systemd ile kolayca yapılır.


5

Kök erişiminiz varsa, arka planda güvenli ve sağlam çalışması için bir arka plan programı kurmanız daha iyi olur. Debian ve Ubuntu için bunu nasıl yapacağınızı blog yayınında Run Node.js'yi Ubuntu'da Hizmet olarak okuyabilirsiniz .


Köküm olduğunu sanmıyordum ama sadece web panelinde etkinleştirmem gerekiyor gibi görünüyor. Buna bir şans vereceğim.
respectTheCode

3

Her zaman hile yapacak.

@Kevin: İşlemleri iyi bir şekilde öldürebilmelisin. Belgeleri biraz daha kontrol ediyorum. Hatayı yeniden oluşturabilirseniz, GitHub'da bir sorun olarak yayınlamak harika olurdu.


Kevin kimdir? OP?
Peter Mortensen


2

Box9'un dediği gibi, Forever üretim kodu için iyi bir seçimdir. Ancak SSH bağlantısı istemciden kapalı olsa bile bir işlemin devam etmesini sağlamak da mümkündür .

Üretim için iyi bir fikir olmak zorunda olmasa da, uzun hata ayıklama oturumlarının ortasındayken veya uzun süreçlerin konsol çıktısını izlemek veya SSH bağlantınızı kesmek için faydalı olduğunda, terminali sunucuda canlı tutmak için bu çok kullanışlıdır. daha sonra yeniden bağlanmak için (işlerin nasıl gittiğini kontrol etmek için Node.js uygulamasını evde başlatmak ve daha sonra iş yerinde konsola yeniden bağlamak gibi).

Sunucunuzun * nix kutusu olduğu varsayılarak , istemci SSH'si kapalı olsa bile işlemin devam etmesini sağlamak için kabuktan ekran komutunu kullanabilirsiniz . Henüz yüklenmediyse ekranı web'den indirebilir / yükleyebilirsiniz (Linux ise dağıtımınız için bir paket arayın veya OS X ise MacPorts'u kullanın ).

Aşağıdaki gibi çalışır:

  1. SSH bağlantısını ilk açtığınızda, 'ekran' yazın - bu ekran oturumunuzu başlatır.
  2. Normal şekilde çalışmaya başlayın (örneğin, Node.js uygulamanızı başlatın)
  3. İşiniz bittiğinde terminalinizi kapatın. Sunucu işlemleriniz çalışmaya devam edecek.
  4. Konsolunuza yeniden bağlanmak için sunucuya geri dönün, oturum açın ve yeniden bağlanmak için 'screen -r' girin. Eski konsol içeriğiniz, kullanmaya devam etmeniz için geri dönecektir.
  5. Ekrandan çıkmak için sunucuya bağlıyken, konsol istemine 'exit' yazın - bu sizi normal kabuğa bırakır.

Gerekirse aynı anda çalışan birden çok ekran oturumunuz olabilir ve herhangi bir istemciden herhangi birine bağlanabilirsiniz. Tüm seçenekler için çevrimiçi dokümanları okuyun.


İyi bilgi. Üretim için işe yaramayacağını, ancak uzak bir sunucuda hata ayıklama yaparken çok yararlı olabileceğini kabul ediyorum.
respectTheCode

neden sadece nohup düğümü myapp.js kullanmayın & 2> /var/log/myapp.log 1> / dev / null
markus_p

Bu av yararlı buldum youtube.com/watch?v=P4mT5Tbx_KE açıklayan nohupveforever
Vinod Srivastav

1

Forever, uygulamaları çalışır durumda tutmak için iyi bir seçenektir (ve npm güzel bir modül olarak yüklenebilir).

Ancak daha ciddi 'dağıtım' için - dağıtma, yeniden başlatma, komutları çalıştırma vb. Uzaktan yönetim gibi şeyler - capistrano'yu düğüm uzantısıyla kullanırım.

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


1

https://paastor.com , sizin için bir VPS'ye veya başka bir sunucuya dağıtım yapan nispeten yeni bir hizmettir. Kod iletmek için bir CLI var. Paastor'un ücretsiz bir katmanı var, en azından bunu yayınlarken yaptı.



Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.