Korzystam z modułu wieczności węzła, aby utrzymać działanie serwera węzłów. Na zawsze jednak kończy się, gdy nastąpi restart systemu. Czy jest jakiś sposób, aby automatycznie uruchomić serwer węzłów (na zawsze) po ponownym uruchomieniu systemu?
190
Odpowiedzi:
Sugerowałbym użycie crontab. Jest łatwy w użyciu.
Jak
Aby rozpocząć edycję, uruchom następującą procedurę, zastępując „testser” wybranym użytkownikiem środowiska wykonawczego dla procesu węzła. Jeśli wybierzesz innego użytkownika niż ty, będziesz musiał uruchomić to z sudo.
Jeśli nigdy wcześniej tego nie robiłeś, pojawi się pytanie, z którym edytorem chcesz edytować. Lubię vima, ale polecę nano dla łatwości użytkowania.
Raz w edytorze dodaj następujący wiersz:
Zapisz plik. Powinieneś otrzymać informację zwrotną, że cron został zainstalowany.
Aby uzyskać dalsze potwierdzenie instalacji crona, wykonaj następujące czynności (ponownie zastępując „testser” docelową nazwą użytkownika), aby wyświetlić listę aktualnie zainstalowanych cronów:
Zauważ, że moim zdaniem zawsze powinieneś używać pełnych ścieżek podczas uruchamiania plików binarnych w cronie. Ponadto, jeśli ścieżka do twojego wiecznego skryptu jest nieprawidłowa, uruchom,
which forever
aby uzyskać pełną ścieżkę.Biorąc pod uwagę te
forever
połączenianode
, możesz także podać pełną ścieżkę donode
:Dalsza lektura
źródło
@reboot
cron jest uruchamiany na deamonie crona od początku. Aby dodać, nigdy nie spotkałem się z sytuacją, która sugerowałaby, że moje crony ustawione na@reboot
nie uruchamiają się przy starcie systemu. Sposób, w jaki go wyłączasz, nie ma w tym przypadku znaczenia./home
to, że nie jest jeszcze zamontowany, więc to nie zadziała, jeśli Twój kod mieszka/home
.@reboot varname=value ...
W tym celu możesz skorzystać z usługi Forever-Service.
Zapewni to app.js w bieżącym katalogu jako usługę przez wieczność. Usługa zostanie automatycznie uruchomiona ponownie przy każdym ponownym uruchomieniu systemu. Również po zatrzymaniu spróbuje zatrzymać się z gracją. Ten skrypt zawiera również skrypt logrotate.
Adres Github: https://github.com/zapty/forever-service
UWAGA: Jestem autorem serwisu na zawsze.
źródło
forever-service install test
,test
będzie to nazwa usługi , ale nie nazwa pliku właściwego programu / node .js do uruchomienia. Domyślnie zakłada nazwa programu jestapp.js
, ale można zastąpić go z--script
flagą, co następuje:forever-service install test --script main.js
. (Niesprawdzone, więc popraw mnie, jeśli coś jest nie tak.)Ten przypadek dotyczy Debiana.
Dodaj następujące elementy do
/etc/rc.local
/usr/bin/sudo -u {{user}} /usr/local/bin/forever start {{app path}}
{{user}}
zastępuje twoją nazwę użytkownika.{{app path}}
zastępuje ścieżkę aplikacji. Na przykład,/var/www/test/app.js
źródło
/etc/rc.local
, a nie/etc/init.d/rc.local
app.js
aby upewnić się, że względne pliki są ładowane poprawnie -process.chdir('/your/path/to/your/app');
Dokumenty referencyjne Node.js tutaj/etc/rc.local
:( cd /path/to/project && /usr/bin/sudo -u {{user}} env PORT={{port number}} PATH=$PATH:/usr/local/bin sh -c "forever start app.js" )
Zainstaluj PM2 globalnie za pomocą NPM
npm install pm2 -g
Rozpocznij skrypt z pm2
pm2 start app.js
wygeneruj aktywny skrypt startowy
pm2 startup
UWAGA: Uruchomienie pm2 służy do uruchomienia PM2 po ponownym uruchomieniu systemu. Po uruchomieniu PM2 ponownie uruchamia wszystkie procesy, którymi zarządzał przed awarią systemu.
Jeśli chcesz wyłączyć automatyczne uruchamianie, po prostu użyj PM2 Unstartup
Jeśli chcesz, aby skrypt startowy był wykonywany przez innego użytkownika, po prostu użyj
-u <username>
opcji i--hp <user_home>:
źródło
Alternatywna metoda crontab zainspirowana tą odpowiedzią i tym wpisem na blogu.
1. Utwórz plik skryptu bash (zmień boba na żądanego użytkownika).
2. Skopiuj i wklej to w właśnie utworzonym pliku.
Edytuj powyższe ścieżki zgodnie z konfiguracją!
3. Upewnij się, że skrypt bash może zostać wykonany.
4. Przetestuj skrypt bash.
5. Zamień „bob” na użytkownika wykonawczego dla węzła.
6. Skopiuj i wklej (zmień boba na żądanego użytkownika).
Uratuj crontab.
Dotarłeś do końca, twoją nagrodą jest ponowne uruchomienie (do przetestowania) :)
źródło
Skopiowano odpowiedź z załączonego pytania .
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
Uruchom aplikację
Jeśli używasz ekspresowego, możesz uruchomić aplikację tak jak
Lista wszystkich uruchomionych procesów:
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.
Aby wyświetlić dzienniki
źródło
$pm2 startup
Po tym zobaczysz pm2 z prośbą o ręczne uruchomienie polecenia, skopiowanie i uruchomienie tego. Wtedy$pm2 save
teraz Twoja aplikacja.js przetrwaW tym celu musisz utworzyć skrypt powłoki w folderze /etc/init.d. Jest to trochę skomplikowane, jeśli nigdy tego nie robiłeś, ale w Internecie jest mnóstwo informacji na temat skryptów init.d.
Oto przykład skryptu, który utworzyłem, aby uruchomić witrynę CoffeeScript na zawsze:
Musiałem się upewnić, że folder i ścieżki są jawnie ustawione lub dostępne dla użytkownika root, ponieważ skrypty init.d są uruchamiane jako root.
źródło
Użyj PM2
Która jest najlepsza opcja do uruchomienia serwera produkcyjnego serwera
Jakie są zalety uruchamiania aplikacji w ten sposób?
PM2 automatycznie uruchomi ponownie aplikację, jeśli ulegnie awarii.
PM2 będzie przechowywać dziennik nieobsługiwanych wyjątków - w tym przypadku w pliku pod adresem /home/safeuser/.pm2/logs/app-err.log.
Za pomocą jednego polecenia PM2 może zapewnić, że wszystkie zarządzane przez niego aplikacje uruchomią się ponownie po ponownym uruchomieniu serwera. Zasadniczo aplikacja węzła zostanie uruchomiona jako usługa.
ref: https://www.digitalocean.com/community/tutorials/how-to-use-pm2-to-setup-a-node-js-production-environment-on-an-ubuntu-vps
źródło
Forever nie został stworzony do uruchamiania aplikacji węzłów jako usług. Właściwym podejściem jest albo utworzenie wpisu / etc / inittab (stare systemy Linux) lub upstart (nowsze systemy Linux).
Oto dokumentacja, w jaki sposób ustawić to jako upstart: https://github.com/cvee/node-upstart
źródło
crontab
nie działa dla mnie na CentOS x86 6.5. @reboot wydaje się nie działać.Wreszcie mam to rozwiązanie:
Edytować:
/etc/rc.local
Dodaj ten wiersz na końcu pliku. Zmień
USER_NAME
iPATH_TO_PROJECT
na własny.NODE_ENV=production
oznacza, że aplikacja działa w trybie produkcyjnym. Możesz dodać więcej linii, jeśli chcesz uruchomić więcej niż jedną aplikację node.js.Nie ustawiaj
NODE_ENV
w osobnym wierszu, Twoja aplikacja będzie nadal działać w trybie programowania, ponieważ wieczność się nie pojawiNODE_ENV
.Zapisz i wyjdź z vi (naciśnij
ESC : w q return
). Możesz spróbować zrestartować serwer. Po ponownym uruchomieniu serwera aplikacja node.js powinna uruchomić się automatycznie, nawet jeśli nie logujesz się na żadne konto zdalnie przez ssh.Lepiej ustaw
NODE_ENV
środowisko w swojej powłoce.NODE_ENV
zostanie ustawiony automatycznie poUSER_NAME
zalogowaniu się na konto .Możesz więc uruchamiać polecenia takie jak na zawsze stop / start
/PATH_TO_PROJECT/app.js
przez ssh bezNODE_ENV
ponownego ustawiania .źródło
Napisałem skrypt, który robi dokładnie to:
https://github.com/chovy/node-startup
Nie próbowałem z wiecznością, ale możesz dostosować uruchamiane polecenie, więc powinno być proste:
źródło
Próbowałem wiele z powyższych odpowiedzi. Żadne z nich nie działało dla mnie. Moja aplikacja jest zainstalowana
/home
jako użytkownik, a nie jako użytkownik root. Prawdopodobnie oznacza to, że po uruchomieniu wyżej wymienionych skryptów startowych/home
nie jest jeszcze zamontowane, więc aplikacja się nie uruchamia.Potem znalazłem te instrukcje autorstwa Digital Ocean:
https://www.digitalocean.com/community/tutorials/how-to-use-pm2-to-setup-a-node-js-production-environment-on-an-ubuntu-vps
Używanie PM2 jak wyjaśniono było bardzo proste i działa idealnie: Moje wirtualne serwery miały dwie fizyczne awarie, ponieważ - czas przestoju wynosił tylko około minuty.
źródło
Problem z rc.local polega na tym, że komendy są dostępne jako root, co różni się od zalogowania jako użytkownik i używania sudo.
Rozwiązałem ten problem, dodając skrypt .sh z poleceniami uruchamiania, które chcę etc / profile.d. Każdy plik .sh w profilu.d zostanie załadowany automatycznie, a każde polecenie będzie traktowane tak, jakbyś używał zwykłego sudo.
Jedynym minusem jest to, że określony użytkownik musi się zalogować, aby rozpocząć, co w mojej sytuacji zawsze miało miejsce.
źródło
kompletny przykład crontab (znajduje się w / etc / crontab) ..
źródło
Możesz użyć następującego polecenia w powłoce, aby uruchomić węzeł na zawsze:
Należy pamiętać, że serwer, na którym działa aplikacja, powinien być zawsze włączony.
źródło