Ich verwende das Forever-Modul des Knotens, um meinen Knotenserver am Laufen zu halten. Für immer wird jedoch beendet, wenn ein Systemneustart erfolgt. Gibt es eine Möglichkeit, den Knotenserver beim Neustart des Systems automatisch (mit für immer) zu starten?
190
Antworten:
Ich würde vorschlagen, Crontab zu verwenden. Es ist einfach zu bedienen.
Wie man
Um mit der Bearbeitung zu beginnen, führen Sie Folgendes aus, indem Sie den "Testbenutzer" durch Ihren gewünschten Laufzeitbenutzer für den Knotenprozess ersetzen. Wenn Sie einen anderen Benutzer als sich selbst auswählen, müssen Sie dies mit sudo ausführen.
Wenn Sie dies noch nie zuvor getan haben, werden Sie gefragt, mit welchem Editor Sie bearbeiten möchten. Ich mag Vim, werde aber Nano empfehlen, um die Bedienung zu vereinfachen.
Fügen Sie im Editor die folgende Zeile hinzu:
Speicher die Datei. Sie sollten eine Rückmeldung erhalten, dass der Cron installiert wurde.
Führen Sie zur weiteren Bestätigung der Installation des Cron Folgendes aus (ersetzen Sie erneut "testuser" durch Ihren Zielbenutzernamen), um die aktuell installierten Cron aufzulisten:
Beachten Sie, dass Sie meiner Meinung nach immer vollständige Pfade verwenden sollten, wenn Sie Binärdateien in cron ausführen. Wenn der Pfad zu Ihrem Skript für immer nicht korrekt ist, führen Sie ihn aus
which forever
, um den vollständigen Pfad abzurufen.Angesichts dieser
forever
Anrufenode
möchten Sie möglicherweise auch den vollständigen Pfad angeben zunode
:Weiterführende Literatur
quelle
@reboot
Cron's auf dem Cron Deamon gestartet werden. Außerdem bin ich noch nie auf eine Situation gestoßen, die darauf hindeutet, dass meine Cron-Werte, die auf eingestellt sind, beim@reboot
Systemstart nicht ausgeführt werden. Die Art und Weise, wie Sie es herunterfahren, spielt dabei keine Rolle./home
noch nicht gemountet zu sein, daher funktioniert dies nicht, wenn Ihr Code darin lebt/home
.@reboot varname=value ...
Sie können dazu den Forever-Service verwenden.
Dadurch wird app.js im aktuellen Verzeichnis für immer als Dienst bereitgestellt. Der Dienst wird bei jedem Neustart des Systems automatisch neu gestartet. Auch wenn es gestoppt wird, wird es einen anmutigen Stopp versuchen. Dieses Skript stellt auch das Logrotate-Skript bereit.
Github-URL: https://github.com/zapty/forever-service
HINWEIS: Ich bin der Autor von forever-service.
quelle
forever-service install test
,test
wird der Name des Service , aber nicht der Name des aktuellen Programms / node js - Datei auszuführen. Standardmäßig wird davon ausgegangen, dass der Name des Programms lautetapp.js
. Sie können ihn jedoch--script
wie folgt mit dem Flag überschreiben :forever-service install test --script main.js
. (Ungetestet, bitte korrigieren Sie mich, wenn Syntaxdetails falsch sind.)Dieser Fall gilt für Debian.
Fügen Sie Folgendes hinzu:
/etc/rc.local
/usr/bin/sudo -u {{user}} /usr/local/bin/forever start {{app path}}
{{user}}
ersetzt Ihren Benutzernamen.{{app path}}
ersetzt Ihren App-Pfad. Beispielsweise,/var/www/test/app.js
quelle
/etc/rc.local
, nicht/etc/init.d/rc.local
app.js
um sicherzustellen, dass die relativen Dateien korrekt geladen werden -process.chdir('/your/path/to/your/app');
Node.js Referenzdokumente hier/etc/rc.local
den Trick für mich zu( cd /path/to/project && /usr/bin/sudo -u {{user}} env PORT={{port number}} PATH=$PATH:/usr/local/bin sh -c "forever start app.js" )
Installieren Sie PM2 global mit NPM
npm install pm2 -g
Starten Sie Ihr Skript mit pm2
pm2 start app.js
Generieren Sie ein aktives Startskript
pm2 startup
HINWEIS: Der Start von pm2 dient zum Starten von PM2 beim Neustart des Systems. PM2 startet nach dem Start alle Prozesse neu, die vor dem Systemausfall verwaltet wurden.
Wenn Sie den automatischen Start deaktivieren möchten, verwenden Sie einfach pm2 unstartup
Wenn Sie möchten, dass das Startskript unter einem anderen Benutzer ausgeführt wird, verwenden Sie einfach die
-u <username>
Option und die--hp <user_home>:
quelle
Eine alternative Crontab-Methode, die von dieser Antwort und diesem Blog-Beitrag inspiriert wurde .
1. Erstellen Sie eine Bash-Skriptdatei (ändern Sie Bob in den gewünschten Benutzer).
2. Kopieren Sie diese und fügen Sie sie in die gerade erstellte Datei ein.
Stellen Sie sicher, dass Sie die obigen Pfade entsprechend Ihrer Konfiguration bearbeiten!
3. Stellen Sie sicher, dass das Bash-Skript ausgeführt werden kann.
4. Testen Sie das Bash-Skript.
5. Ersetzen Sie "bob" durch den Laufzeitbenutzer für den Knoten.
6. Kopieren und einfügen (Bob auf gewünschten Benutzer ändern).
Speichern Sie die Crontab.
Du hast es bis zum Ende geschafft, dein Preis ist ein Neustart (zum Testen) :)
quelle
Kopierte Antwort von der beigefügten Frage .
Sie können PM2 verwenden , einen Produktionsprozessmanager für Node.js-Anwendungen mit integriertem Load Balancer.
Installieren Sie PM2
Starten Sie eine Anwendung
Wenn Sie Express verwenden, können Sie Ihre App wie starten
Auflistung aller laufenden Prozesse:
Es werden alle Prozesse aufgelistet. Sie können Ihren Dienst dann stoppen / neu starten, indem Sie die ID oder den Namen der App mit dem folgenden Befehl verwenden.
Protokolle anzeigen
quelle
$pm2 startup
Danach wird pm2 aufgefordert, einen Befehl manuell auszuführen, zu kopieren und auszuführen. Dann,$pm2 save
jetzt überlebt Ihre app.js SystemneustartsDazu müssen Sie im Ordner /etc/init.d ein Shell-Skript erstellen. Es ist etwas kompliziert, wenn Sie es noch nie getan haben, aber es gibt im Web viele Informationen zu init.d-Skripten.
Hier ist ein Beispiel für ein Skript, das ich erstellt habe, um eine CoffeeScript-Site für immer auszuführen:
Ich musste sicherstellen, dass der Ordner und die PATHs explizit festgelegt wurden oder dem Root-Benutzer zur Verfügung standen, da init.d-Skripte als root ausgeführt werden.
quelle
Verwenden Sie die PM2
Welches ist die beste Option, um den Server Produktionsserver auszuführen
Was sind die Vorteile einer solchen Ausführung Ihrer Anwendung?
PM2 startet Ihre Anwendung automatisch neu, wenn sie abstürzt.
PM2 führt ein Protokoll Ihrer nicht behandelten Ausnahmen - in diesem Fall in einer Datei unter /home/safeuser/.pm2/logs/app-err.log.
Mit einem Befehl kann PM2 sicherstellen, dass alle von ihm verwalteten Anwendungen beim Neustart des Servers neu gestartet werden. Grundsätzlich wird Ihre Knotenanwendung als Dienst gestartet.
Ref: https://www.digitalocean.com/community/tutorials/how-to-use-pm2-to-setup-a-node-js-production-environment-on-an-ubuntu-vps
quelle
Forever wurde nicht erstellt, um Knotenanwendungen als Dienste auszuführen. Der richtige Ansatz besteht darin, entweder einen / etc / inittab-Eintrag (alte Linux-Systeme) oder einen Upstart (neuere Linux-Systeme) zu erstellen.
Hier finden Sie einige Dokumentationen zum Einrichten als Upstart: https://github.com/cvee/node-upstart
quelle
crontab
funktioniert bei mir unter CentOS x86 6.5 nicht. @reboot scheint nicht zu funktionieren.Endlich habe ich diese Lösung:
Bearbeiten:
/etc/rc.local
Fügen Sie diese Zeile am Ende der Datei hinzu. Ändern Sie
USER_NAME
undPATH_TO_PROJECT
zu Ihren eigenen.NODE_ENV=production
bedeutet, dass die App im Produktionsmodus ausgeführt wird. Sie können weitere Zeilen hinzufügen, wenn Sie mehr als eine node.js-App ausführen müssen.Nicht
NODE_ENV
in einer separaten Zeile festlegen , Ihre App wird weiterhin im Entwicklungsmodus ausgeführt, da dies für immer nicht möglich istNODE_ENV
.Speichern und beenden Sie vi (drücken Sie
ESC : w q return
). Sie können versuchen, Ihren Server neu zu starten. Nach dem Neustart Ihres Servers sollte Ihre node.js-App automatisch ausgeführt werden, auch wenn Sie sich nicht über ssh remote bei einem Konto anmelden.Sie sollten die
NODE_ENV
Umgebung besser in Ihre Shell einfügen.NODE_ENV
wird automatisch festgelegt, wenn sich Ihr KontoUSER_NAME
anmeldet.So können Sie Befehle wie für immer stoppen / starten
/PATH_TO_PROJECT/app.js
über ssh ausführen, ohne sieNODE_ENV
erneut einzustellen .quelle
Ich habe ein Skript geschrieben, das genau das tut:
https://github.com/chovy/node-startup
Ich habe es nicht für immer versucht, aber Sie können den ausgeführten Befehl anpassen, sodass er einfach sein sollte:
quelle
Ich habe viele der oben genannten Antworten ausprobiert. Keiner von ihnen hat für mich gearbeitet. Meine App ist in
/home
und als Benutzer installiert , nicht als root. Dies bedeutet wahrscheinlich, dass, wenn die oben genannten Startskripte ausgeführt werden,/home
noch nicht gemountet ist und die App daher nicht gestartet wird.Dann habe ich diese Anleitung von Digital Ocean gefunden:
https://www.digitalocean.com/community/tutorials/how-to-use-pm2-to-setup-a-node-js-production-environment-on-an-ubuntu-vps
Die Verwendung von PM2 war sehr einfach und funktioniert einwandfrei: Meine virtuellen Server hatten seitdem zwei physische Abstürze - die Ausfallzeit betrug nur etwa eine Minute.
quelle
Das Problem mit rc.local besteht darin, dass auf die Befehle als root zugegriffen wird, was sich von der Anmeldung als Benutzer und der Verwendung von sudo unterscheidet.
Ich habe dieses Problem gelöst, indem ich ein .sh-Skript mit den Startbefehlen hinzugefügt habe, die ich usw. / profile.d möchte. Jede .sh-Datei in profile.d wird automatisch geladen und jeder Befehl wird so behandelt, als ob Sie das reguläre sudo verwendet hätten.
Der einzige Nachteil dabei ist, dass sich der angegebene Benutzer anmelden muss, damit Dinge beginnen, was in meiner Situation immer der Fall war.
quelle
vollständiges Beispiel crontab (befindet sich unter / etc / crontab) ..
quelle
Sie können den folgenden Befehl in Ihrer Shell verwenden, um Ihren Knoten für immer zu starten:
Sie müssen berücksichtigen, dass der Server, auf dem Ihre App ausgeführt wird, immer eingeschaltet bleiben sollte.
quelle