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.
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.
Yanıtlar:
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.service
dosya 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.js
olması gerektiğini unutmayın #!/usr/bin/env node
.
Servis dosyanızı /etc/systemd/system
klasö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
.
Failed to issue method call: Unit name ... is not valid.
mı?
/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.
/etc/systemd/system
sadece sizin için systemctl enable /full/path/to/myapp.service
bir sembolik bağlantı oluşturan kullanabilirsiniz /etc/systemd/system
.
node
denir /var/www/myapp/app.js
. Unix'te, bir dosyayı yürütülebilir yaparsanız ve ilk satır #!/some/file
dosyayla başlarsa bu ikili dosyayla yorumlanır. Google 'tercüman Unix' hakkında daha fazla bilgi.
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örmekforever stop example.js
işlemi durdurmak veya forever stop 0
dizin 0 ile işlemi durdurmak için (ile gösterildiği gibi forever list
).forever stop 0
bir 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.
Burada dağıtım yöntemimle ilgili yazdım: node.js uygulamalarını dağıtma
Kısacası:
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.
Sen kullanabilirsiniz monit
, forever
, upstart
ya systemd
da 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
, monit
ve diğer önerilen çözümler iyidir.
Ş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
Örnek dosyalar ile Node.js'yi dağıtmak için oldukça kapsamlı bir kılavuz yazdım:
İş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:
Tüm bunlar systemd ile kolayca yapılır.
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 .
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.
Capistrano, Upstart ve Nginx ile Node.js uygulamalarını dağıtmak için harika ve ayrıntılı bir kılavuz
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:
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.
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://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ı.
Sizin durumunuzda uptart arka plan programını kullanabilirsiniz . Eksiksiz bir dağıtım çözümü için capistrano önerebilirim . İki yararlı kılavuz Node.js env nasıl kurulur ve capistrano + upstart üzerinden nasıl dağıtılır .
Düğüm dağıtım sunucusunu deneyin . Bir uygulamayı özel sunucularınıza dağıtmak için karmaşık bir araç setidir. Node.js ile yazılmıştır ve kurulum için npm kullanır.