Jak sprawić, by aplikacja node.js działała na stałe?


259

Na serwerze Debian zainstalowałem Node.js. Rozumiem, jak uruchomić aplikację z pakietu za pomocą tego wiersza polecenia:

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

i dostać się na adres 50.51.52.53:8080( adres IP i port).

Ale jak tylko zamknę kit, nie mogę już dotrzeć do adresu 50.51.52.53:8080.

Jak sprawić, by aplikacja Node.js działała na stałe?

Jak możesz się domyślić, jestem początkującym w Linuksie i Node.js.


7
Pamiętaj, że pm2 jest dobrą alternatywą dla Forever , jeśli nie chcesz używać Forever z jakiegokolwiek powodu.
Kevin B

dzięki @KevinB github.com/Unitech/pm2 jest naprawdę dobrą alternatywą
Sachin Chavan

Odpowiedzi:


220

Chociaż inne odpowiedzi rozwiązują problem PO, wszystkie są przesadzone i nie wyjaśniają, dlaczego on lub ona doświadcza tego problemu.

Kluczem jest ta linia: „Zamykam kit, a potem nie mogę dotrzeć do adresu”

Kiedy jesteś zalogowany do swojego zdalnego hosta na Putty, rozpocząłeś proces linuksa SSH i wszystkie polecenia wpisane z tej sesji SSH będą wykonywane jako dzieci tego procesu.

Problem polega na tym, że po zamknięciu Putty wychodzisz z sesji SSH, która zabija ten proces i wszelkie aktywne procesy potomne. Kiedy zamykasz kit, nieumyślnie zabijasz serwer, ponieważ uruchomiłeś go na pierwszym planie . Aby uniknąć tego zachowania, uruchom serwer w tle , dołączając & do swojego polecenia:

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

Problemem jest tutaj brak wiedzy o systemie Linux, a nie pytanie o węzeł. Aby uzyskać więcej informacji, sprawdź: http://linuxconfig.org/understanding-foreground-and-background-linux-processes

AKTUALIZACJA:

Jak wspomnieli inni, serwer węzłów może nadal umrzeć przy wychodzeniu z terminala. Częstym problemem, z jakim się zetknąłem, jest to, że chociaż proces węzła działa w bg, jest on standardem, a stderr jest nadal wskazywany na terminalu. Oznacza to, że jeśli serwer węzła zapisze w pliku console.log lub console.error, otrzyma błąd zepsutej rury i wystąpi awaria. Można tego uniknąć, przesyłając dane wyjściowe procesu:

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

Jeśli problem będzie się powtarzał, powinieneś przyjrzeć się takim rzeczom, jak tmux lub nohup , które są jeszcze bardziej niezawodne niż rozwiązania specyficzne dla węzłów, ponieważ można ich używać do uruchamiania wszystkich typów procesów (baz danych, usług rejestrowania, innych języków).

Częstym błędem, który może spowodować zamknięcie serwera, jest to, że po uruchomieniu nohup node your_path/server.js &wystarczy zamknąć terminal Putty jednym kliknięciem. Zamiast tego powinieneś użyć exitpolecenia, wtedy serwer węzła będzie działał.


7
Jeśli nadal zamykasz sesję szpachlową podczas wykonywania &usługi, to nadal się zamyka. (Właśnie testowany na Debianie Jesse)
NiCk Newman

1
Jak powiedział @NiCkNewman, ta odpowiedź jest niepełna! Zobacz odpowiedź Ricka Roya na prawidłowe rozwiązanie.
thejonwithnoh

19
„&” Powoduje, że proces działa w tle, ale tak naprawdę trzeba dodać „nohup” na początku tego polecenia, aby odłączyć go od okna konsoli, aby aplikacja nie zatrzymała się, gdy okno przejdzie w stan uśpienia po kilku godziny, zmieniając wcześniej wspomniane polecenie na:nohup node /srv/www/MyUserAccount/server/server.js &
SirRodge

2
AIX powersystem, nohup node myApp.js &uruchomił aplikację na bg, ale umiera, gdy termin został zamknięty. Nie jestem pewien, dlaczego.
AnBisw

4
@ Annjawn, musisz użyć exitpolecenia, aby wyjść z terminala.
Ionut Necula

342

Możesz zainstalować na zawsze za pomocą npm:

sudo npm install -g forever

Następnie uruchom aplikację za pomocą:

forever server.js

Lub jako usługa:

forever start server.js

Forever ponownie uruchamia aplikację, gdy z jakiegoś powodu ulega awarii lub zatrzymuje się. Aby ograniczyć ponowne uruchomienie do 5, możesz użyć:

forever -m5 server.js

Aby wyświetlić listę wszystkich uruchomionych procesów:

forever list

Zanotuj liczbę całkowitą w nawiasach i użyj jej w następujący sposób, aby zatrzymać proces:

forever stop 0

Ponowne uruchomienie uruchomionego procesu przebiega następująco:

forever restart 0

Jeśli pracujesz nad plikiem aplikacji, możesz użyć tego -wparametru, aby automatycznie uruchamiać się ponownie po każdej server.jszmianie pliku:

forever -w server.js

11
@MarthaJames, jeśli jest zamykany, gdy twoja sesja / okno ssh zostanie zamknięte, prawdopodobnie zapomniałeś dołączyć „start” wforever start <file>
Kristian

8
Jaka jest różnica między używaniem forever server.jsa forever start server.js? Wiem, że jest napisane „jako usługa”, ale co to znaczy?
Marquizzo

5
Kiedy wpisuję forever server.js, uruchamia serwer. Naciśnięcie Ctrl+ Cspowoduje zatrzymanie usługi. Jeśli wpiszesz forever start server.js, uruchomi usługę, a nawet jeśli naciśniesz Ctrl+ C, pozostanie otwarty. Następnie możesz wykonać powyższe polecenia, aby zatrzymać / przejrzeć listę. Tego przynajmniej doświadczyłem.
Termato,

6
Czy to uruchamia skrypt po ponownym uruchomieniu serwera?
beingalex

1
foreverModuł (v0.15.3) jest podatny na Regular Expression atakami typu DoS i nie powinien być stosowany: github.com/foreverjs/forever/issues/960
Benny Neugebauer

82

Możesz użyć PM2 , jest to menedżer procesów produkcyjnych dla aplikacji Node.js z wbudowanym modułem równoważenia obciążenia.

Zainstaluj PM2

$ npm install pm2 -g

Uruchom aplikację

$ pm2 start app.js

Jeśli używasz ekspresowego, możesz uruchomić aplikację jak

pm2 start ./bin/www --name="app"

Lista wszystkich uruchomionych procesów:

$ pm2 list

Wyświetli listę wszystkich procesów. Następnie możesz zatrzymać / uruchomić ponownie usługę, używając identyfikatora lub nazwy aplikacji za pomocą następującego polecenia.

$ pm2 stop all                  
$ pm2 stop 0                    
$ pm2 restart all               

Aby wyświetlić dzienniki

$ pm2 logs ['all'|app_name|app_id]

1
Niech cię Bóg błogosławi! to działa!! Forever and Nohup nie działa na serwerze amazowej usługi bitnami nodejs server ( docs.bitnami.com/aws/infrastructure/nodejs ). PM2 działa świetnie!
polras

Ta biblioteka wydaje się mieć największą liczbę uruchomień na githubie
DragonFire

41

Polecam poszukać czegoś takiego jak Forever, aby zrestartować Węzeł w razie awarii i zająć się tym za Ciebie.


Chciałbym zaznaczyć, że bez nohupwęzeł zakończy działanie po wyjściu z sesji ssh, jeśli uruchomisz ją w ten sposób (chyba że używasz czegoś takiego jak screen do tmux).
Haozhun,

1
@Haozhun, ciekawe, ale nie tak to działa na moich komputerach. Kiedy ssh i uruchamiam coś za pomocą tego polecenia, działa ono zawsze w tle, nawet po zamknięciu sesji SSH.
Brad

@Brad proszę zobaczyć 2nd odpowiedź na stackoverflow.com/questions/4018154/... . Wydaje się, że niektórzy ludzie zgadzają się z pierwszym komentarzem do tego pytania, które wyjaśnia nohup. Byłoby wspaniale, gdybyśmy mogli rozwiązać to zamieszanie. Ale nie wiem od czego zacząć.
Haozhun

4
W większości unixenów (w tym w większości dystrybucji Linuksa) uruchamianie rzeczy w tle nadal zabije proces, jeśli zamkniesz okno terminala. Aby temu zapobiec, uruchom go za pomocą nohup. Przykład:nohup node app.js &
slebetman

1
Używam Forever z produkcyjnym środowiskiem Linux. Zwykle używam polecenia na zawsze start --minUptime 10000 -o /logs/myapp.log nodeApp.js
mbokil

36

Jeśli chcesz zawsze uruchamiać aplikację węzła w terminalu, po prostu użyj ekranu.

Zainstaluj na Ubuntu / Debian:

sudo apt-get install screen

Stosowanie:

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

ctrl + aa następnie ctrl + dzwolnić

Aby uzyskać, powraca:

Jeden ekran: screen -r

Jeśli jest więcej niż jeden, możesz wyświetlić listę wszystkich ekranów za pomocą: screen -ls

I wtedy: screen -r pid_number


1
Jest to dobra opcja, ponieważ pozwala mi także w dowolnym momencie przełączyć proces na pierwszy plan
aexl

26

Możesz po prostu tego użyć

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

Dzięki temu aplikacja będzie działać i aby ją zamknąć, będziesz musiał ją zabić.

W tym celu możesz zainstalować, htopa następnie wyszukać węzeł, a następnie go zabić


18
Ważne jest, aby pamiętać, że w takim przypadku użytkownik musiałby poprawnie wyjść z sesji PuTTY (tj. Za pomocą exitpolecenia). Jeśli użytkownik po prostu zamknie okno, może użyć innego sygnału niż SIGHUPzakończenie procesu, a zatem węzeł i tak zostanie zamknięty.
thejonwithnoh

1
+1 za bycie prostym uniwersalnym rozwiązaniem problemu dla Linuksa. To jest lepsze niż odpowiedź DogNibblera .
thejonwithnoh

@ thejonwithnoh po przeczytaniu twojego komentarza próbowałem z gwałtownie zamykającym się kitem, ale serwer nadal działał, być może miało to związek z konfiguracją env. Ale pomyślałem, że to, o co prosi OP, będzie najprostszym sposobem na osiągnięcie tego
Rick Roy

Lubię to proste podejście, którego używam, ponieważ do jego zabicia najłatwiej jest po prostu killall node, który zabije wszystkie procesy węzłowe, w moim przypadku tylko jeden.
Nelson

@Nelson To zabiłoby wszystkie procesy węzłowe, co jeśli masz uruchomionych wiele skryptów i chcesz tylko zakończyć jeden konkretny, radzę znaleźć ten proces, a następnie zakończyć ten konkretny, na wypadek, gdyby na serwerze produkcyjnym było uruchomionych wiele procesów węzłowych i nie chcę mieć ochoty na koszmar: D
Rick Roy

12

Forever to bardzo dobry moduł do tego celu.

Zainstaluj forever, wpisując w wierszu polecenia

$ npm install forever -g

Następnie użyj następującego polecenia, aby uruchomić skrypt node.js

$ forever start /path/to/script.js

Możesz ruszać. Dodatkowo możesz biegać

$ forever list

aby zobaczyć wszystkie uruchomione skrypty. Możesz zakończyć dowolny skrypt, pisząc

$ forever stop [pid]

gdzie [pid]jest identyfikator procesu skryptu uzyskanego z listpolecenia. Aby zatrzymać wszystkie skrypty, możesz wpisać

$ forever stopall

10

nohup działa sprawdziłem w AWS Ubunto vm postępuj zgodnie z poprawnymisyntax

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

następnie naciśnij Enter, zobaczysz tę linię

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

następnie wpisz to

rm nohup.out

wprowadź opis zdjęcia tutaj


3
Podoba mi się, jak wyczyściłeś nazwę hosta w małym wierszu polecenia, ale zostawiłeś ją w wielkim tytule okna con
conny

10

Instalacja

$ [sudo] npm install forever -g

Możesz używać wieczności do ciągłego uruchamiania skryptów

forever start server.js

forever list

do zatrzymania usługi

forever stop server.js

9

Oto dorobkiewicz rozwiązanie używam dla moich projektów:

Umieść w /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

Będzie to również obsługiwać odradzanie aplikacji w przypadku awarii. Porzuci próby odrodzenia twojej aplikacji, jeśli zawiesi się 3 lub więcej razy w mniej niż 15 sekund.


9

Podczas programowania zalecam używanie nodemon . Ponownie uruchomi serwer po każdej zmianie pliku. Jak zauważyli inni, Forever jest opcją, ale w produkcji wszystko zależy od używanej platformy. Zazwyczaj będziesz chciał skorzystać z zalecanego przez system operacyjny sposobu utrzymania usług (np. Http://www.freedesktop.org/wiki/Software/systemd/ ).


Działa to dla mnie w aplikacji MEAN.JS - nodemonuruchamia polecenie chrząknięcia, chyba że podasz plik JS serwera, więc używam go do uruchamiania mongo i węzła na zawsze / jednocześnie
J-Dizzle

8

Stwierdziłem, że na zawsze doskonale wykonuję tę pracę.

Zakładając, że masz już zainstalowaną npm, jeśli nie, po prostu zrób

sudo apt-get install npm

Następnie zainstaluj na zawsze

npm install forever --global

Teraz możesz uruchomić to w ten sposób

forever start app.js

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


npm rm -g na zawsze do usunięcia
DragonFire


5

Innym sposobem jest utworzenie jednostki systemowej dla aplikacji. utwórz plik „XXX.service” w folderze „/ etc / systemd / system”, podobnie jak to:

[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

Korzyścią jest to, że aplikacja będzie działać jako usługa, automatycznie uruchomi się ponownie, jeśli ulegnie awarii.

Do zarządzania nim możesz także użyć sytemctl:

systemctl start XXXaby uruchomić usługę, systemctl stop XXXzatrzymać ją i systemctl enable XXXautomatycznie uruchomić aplikację po uruchomieniu systemu.


4

Mam nadzieję, że to Ci pomoże.

W wierszu polecenia zainstaluj na zawsze:

npm install forever -g

Utwórz przykładowy plik:

sudo nano server.js 

Możesz edytować plik i uzyskiwać wyniki bezpośrednio w przeglądarce.
Możesz użyć filezilla lub dowolnego edytora do edycji pliku. Uruchom to polecenie, aby uruchomić plik:

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

wprowadź opis zdjęcia tutaj


3

Nie trzeba instalować żadnego innego pakietu.

Uruchom to polecenie

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

server.js to plik serwera lub może to być api.js

Następnie naciśnij „ exit ”, aby zamknąć terminal

exit


0

pakiet na zawsze działał dla mnie, tylko jedna rzecz, zależy od głębokiej równości , więc jeśli miałeś problem z instalacją, taki jak:

npm -g install forever

Próbować:

npm -g install forever deep-equal@1.1.1

zamiast.

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.