Jak uruchomić aplikację Node.js jako własny proces?


195

Jaki jest najlepszy sposób wdrożenia Node.js?

Mam Dreamhost VPS (tak nazywają maszynę wirtualną ) i udało mi się zainstalować Node.js i skonfigurować serwer proxy. Działa to świetnie, o ile utrzymuję połączenie SSH, które rozpocząłem z otwartym węzłem.


6
Hmm, wydaje mi się dziwne, że nazywasz używając Forever jako „wdrażanie node.js”. Czy to nie tylko narzędzie do monitorowania / nadzoru procesu? Zwykle wdrożenie sieciowe oznacza (przynajmniej to, co napotykam w artykułach) kilka powiązanych ze sobą działań, które udostępniają aplikację internetową (to narzędzie procesowe jest jej częścią). W każdym razie jest to nadal świetny post w StackOverflow, ponieważ nauczyłem się z odpowiedzi wszystkich.
mikong,

To tylko najprostsze wdrożenie node.js na Dreamhost. Celem było po prostu zapewnienie niezawodnego działania węzła jako punktu wyjścia do budowania.
szacunek TheCode

Jak sobie poradziłeś z przekazywaniem domeny do uruchomionego węzła portu?
grm

2
@grm Korzystam z serwera
szacunek TheCode

Używamy teraz Elastic Beanstalk i działa całkiem nieźle.
szacunek TheCode

Odpowiedzi:


107

Odpowiedź 2016 : prawie każda dystrybucja Linuksa jest dostarczana z systemd, co oznacza, że ​​na zawsze, monitorowanie, PM2 itp. Nie są już potrzebne - Twój system operacyjny już obsługuje te zadania .

Utwórz myapp.serviceplik (oczywiście zastępując „myapp” nazwą aplikacji):

[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

Uwaga: jeśli dopiero zaczynasz korzystać z Uniksa:/var/www/myapp/app.js powinien być #!/usr/bin/env nodew pierwszej linii.

Skopiuj plik usługi do /etc/systemd/systemfolderu.

Poinformuj systemd o nowej usłudze za pomocą systemctl daemon-reload.

Zacznij od systemctl start myapp.

Włącz go, aby uruchamiał się przy rozruchu systemctl enable myapp.

Zobacz dzienniki z journalctl -u myapp

To pochodzi z tego, jak wdrażamy aplikacje węzłów w systemie Linux, edycja 2018 , która obejmuje również polecenia do generowania AWS / DigitalOcean / Azure CloudConfig do budowania serwerów Linux / węzłów (w tym .servicepliku).


1
Masz pomysł, jak sobie z tym poradzić Failed to issue method call: Unit name ... is not valid.?
Julien Genestoux

1
@JulienGenestoux nazwa „jednostki” jest taka sama jak Twoja usługa. Brzmi jak rozbieżność. Po skopiowaniu pliku /etc/systemd/systemmoże być konieczne uruchomienie systemctl daemon-reload(systemd zwykle powie ci, czy jest to potrzebne). TBH najlepiej zadać to jako osobne pytanie.
mikemaccana

3
Zamiast kopiować plik usługi do /etc/systemd/system, możesz po prostu użyć systemctl enable /full/path/to/myapp.service, który tworzy dowiązanie symboliczne/etc/systemd/system dla ciebie .
Arne,

1
Jak to porównać z pm2? Czy może zastąpić pm2 lub czy pm2 oferuje bardziej niezbędne funkcje?
Siergiej Baszarow

1
@VinodSrivastav nodejest wywoływany /var/www/myapp/app.jssam. W Uniksie, jeśli plik jest wykonywalny, a pierwsza linia zaczyna się #!/some/fileod pliku, będzie interpretowany z tym plikiem binarnym. Google „interpreter Unix”, aby dowiedzieć się więcej.
mikemaccana

101

Posługiwać się zawsze . Uruchamia programy Node.js w osobnych procesach i uruchamia je ponownie, jeśli jakiś umiera.

Stosowanie:

  • forever start example.js rozpocząć proces.
  • forever list aby zobaczyć listę wszystkich procesów rozpoczętych na zawsze
  • forever stop example.jsaby zatrzymać proces lub forever stop 0zatrzymać proces z indeksem 0 (jak pokazano przez forever list).

To jest blisko Zaczyna się dobrze, ale nie pozwól mi nic zatrzymać. Byłem w stanie się wylogować i ponownie zalogować, a następnie zabić proces węzła. Forever go nie uruchomił ponownie. Myślę więc o tym, jak to działa, nie jest kompatybilne z DH.
szacunek TheCode

@Kevin, nie możesz zabić procesu węzła, ponieważ Forever sam działa na węźle! Do mojej odpowiedzi dodałem instrukcje użytkowania, w tym sposób zatrzymania procesu. Używam tego na moim VPS i działało to jak urok.
David Tang,

forever stop 0miał błąd i rzeczy po prostu się rozpadły. Próbowałem to zrobić bez rootowania na własnym użytkowniku, abym mógł łatwo wyczyścić, gdy tylko znajdę właściwe rozwiązanie. To może być mój problem. Przyjrzę się temu jeszcze trochę.
szacunek TheCode

Miałem coś nie tak z npm, co powodowało problemy. Po prawidłowym zainstalowaniu npm i węzła zawsze działa świetnie. Skończyło się na tym, że dodałem polecenia „zawsze start” do zestawu cronjob, aby działał przy ponownym uruchomieniu. Pracuję teraz nad małą aplikacją węzła, która pozwoli mi uruchomić i zatrzymać na zawsze procy.
szacunek TheCode

Istnieje alternatywa dla Forever, która korzysta z natywnego API klastra węzła: github.com/superjoe30/naught
andrewrk 18.09.2013

41

O mojej metodzie wdrażania pisałem tutaj: wdrażania pisałem Wdrażanie aplikacji node.js

W skrócie:

  • Użyj haka po otrzymaniu git
  • Jake dla narzędzia do budowania
  • Upstart jako opakowanie usługi dla węzła
  • Monitoruj i ponownie uruchamiaj aplikacje, gdy spadną
  • nginx kieruje żądania do różnych aplikacji na tym samym serwerze

2
Jeśli zawsze będę mieć jedną witrynę z Węzłem na moim serwerze, czy mogę bezpiecznie porzucić Nginx?
Dor

3
Link wydaje się być zepsuty
verybadalloc

@Dor wiem, że to późna odpowiedź, ale nie zrobiłbym tego. Oprócz takich rzeczy jak zakończenie SSL i buforowanie, odwrotne proxy nginx przed hostem pozwala na większą elastyczność infrastrukturalną niż uruchamianie węzła bezpośrednio na porcie 80. Oznacza to również, że nie musisz uruchamiać węzła jako root, co moim zdaniem jest dość ciężki argument na korzyść konfiguracji nginx.
Chris Browne

16

pm2 robi sztuczki.

Funkcje obejmują: monitorowanie, ponowne ładowanie gorącego kodu, wbudowany moduł równoważenia obciążenia, automatyczny skrypt uruchamiania i procesy wskrzeszenia / zrzutu.


Czy jest kompatybilny z usługami takimi jak Heroku?
FRD

@FRD Nie sądzę, że to działa z heroku, sprawdź ten artykuł
nickleefly

9

Można użyć monit, forever, upstartlub systemd, aby rozpocząć swój serwer.

Możesz użyć Lakier lub HAProxy zamiast Nginx (wiadomo, że Nginx nie działa z gniazdami internetowymi).

Jako szybkie i brudne rozwiązanie możesz użyć nohup node your_app.js & do zapobiegania aplikacja kończące się z serwerem, ale forever, moniti inne proponowane rozwiązania są lepsze.


2
Użytkownik „Sergey Yarotskiy” próbował edytować Twój post, mówiąc, że Nginx obsługuje teraz WebSockets (od wersji 1.3). Odrzuciłem edycję, ponieważ uważam, że powinna ona zostać opublikowana jako komentarz. (W przeciwnym razie miałbyś dwa sprzeczne zdania w tym samym poście, co jest mylące.)
Backlin

7

Stworzyłem skrypt Upstart aktualnie używany dla moich aplikacji:

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

Dostosuj wszystko przed #########, utwórz plik w /etc/init/your-service.conf i wklej go tam.

Następnie możesz:

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

Dziękuję, właśnie tego potrzebowałem.
Nilson Morais,


5

Oto dłuższy artykuł na temat rozwiązania tego problemu z systememd: http://savanne.be/articles/deploying-node-js-with-systemd/

Kilka rzeczy, o których należy pamiętać:

  • Kto rozpocznie monitorowanie procesu? Forever to świetne narzędzie, ale potrzebuje narzędzia do monitorowania, aby móc dalej działać. To trochę głupie, dlaczego nie skorzystać z systemu init?
  • Czy potrafisz odpowiednio monitorować swoje procesy?
  • Czy korzystasz z wielu backendów? Jeśli tak, to czy masz jakieś przepisy, które zapobiegną obniżeniu innych pod względem zużycia zasobów?
  • Czy usługa będzie potrzebna przez cały czas? Jeśli nie, rozważ aktywację gniazda (zobacz artykuł).

Wszystkie te rzeczy można łatwo wykonać przy pomocy systemd.



3

Wieczność załatwi sprawę.

@Kevin: Powinieneś być w stanie dobrze zabijać procesy. Chciałbym jeszcze trochę sprawdzić dokumentację. Jeśli możesz odtworzyć błąd, dobrze byłoby opublikować go jako problem na GitHub.


Kim jest Kevin? OP?
Peter Mortensen


2

Jak powiedział Box9, Forever jest dobrym wyborem dla kodu produkcyjnego. Możliwe jest jednak także kontynuowanie procesu, nawet jeśli połączenie SSH jest zamknięte od klienta.

Chociaż niekoniecznie jest to dobry pomysł na produkcję, jest to bardzo przydatne, gdy znajduje się w środku długich sesji debugowania lub śledzi wyniki konsolowe długich procesów lub gdy przydatne jest rozłączenie połączenia SSH, ale utrzymanie terminala na serwerze aby połączyć się później (np. uruchomienie aplikacji Node.js w domu i ponowne połączenie z konsolą później w pracy, aby sprawdzić, jak się sprawy mają).

Zakładając, że twój serwer to * nix box, możesz użyć polecenia screen z powłoki, aby proces nadal działał, nawet jeśli klient SSH jest zamknięty. Możesz pobrać / zainstalować ekran z Internetu, jeśli nie jest jeszcze zainstalowany (poszukaj pakietu dla swojej dystrybucji w przypadku Linuksa lub użyj MacPorts w przypadku OS X).

Działa w następujący sposób:

  1. Po pierwszym otwarciu połączenia SSH wpisz „screen” - rozpocznie się sesja screen.
  2. Rozpocznij normalną pracę (tj. Uruchom aplikację Node.js)
  3. Po zakończeniu zamknij terminal. Procesy na serwerze będą nadal działać.
  4. Aby ponownie połączyć się z konsolą, ssh z powrotem do serwera, zaloguj się i wpisz „screen -r”, aby ponownie się połączyć. Stary kontekst konsoli wyskoczy z powrotem i będzie gotowy do wznowienia korzystania z niego.
  5. Aby wyjść z ekranu, gdy jesteś podłączony do serwera, wpisz „exit” w wierszu poleceń konsoli - spowoduje to przejście do zwykłej powłoki.

W razie potrzeby możesz mieć wiele sesji ekranu uruchomionych w ten sposób i możesz połączyć się z dowolną z nich z dowolnego klienta. Przeczytaj dokumentację online dla wszystkich opcji.


Dobra informacja. Zgadzam się, że nie działałoby to w przypadku produkcji, ale może być bardzo przydatne podczas debugowania na zdalnym serwerze.
szacunek TheCode

dlaczego nie użyć po prostu węzła nohup myapp.js & 2> /var/log/myapp.log 1> / dev / null
markus_p

Znalazłem to przydatne youtube.com/watch?v=P4mT5Tbx_KE wyjaśniające nohupiforever
Vinod Srivastav

1

Forever jest dobrą opcją do utrzymywania działania aplikacji (i npm można zainstalować jako moduł, co jest miłe).

Ale w przypadku poważniejszych „wdrożeń” - takich jak zdalne zarządzanie wdrażaniem, restartowaniem, uruchamianiem poleceń itp. - użyłbym capistrano z rozszerzeniem węzła.

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


1

https://paastor.com to stosunkowo nowa usługa, która wykonuje wdrożenie za Ciebie, na VPS lub innym serwerze. Istnieje interfejs CLI do wypychania kodu. Paastor ma darmowy poziom, przynajmniej tak było w momencie publikowania tego.



Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.