Node.js Applikationen betreiben
Dieser Artikel erklärt, wie man Node.js-Anwendungen auf Nines Managed Servern betreibt.
Wenn du deine Anwendung in einem Container ausführen möchtest, findest du in unserem Artikel zu Podman die wichtigsten Informationen.
Container ermöglichen dir, deine Anwendung in unterschiedlichen Umgebungen betreiben zu können, ohne dabei wesentliche Anpassungen an der Applikation selbst vornehmen zu müssen. Container erleichtern zudem die Verwaltung von Abhängigkeiten und helfen dir, deine Anwendung zu skalieren, indem sie sie von anderen Prozessen im System isolieren.
1. Node.js Version Manager einrichten
Um verschiedene Node.js-Versionen unabhängig des eingesetzten Betriebssystems zu verwenden, empfehlen wir die Nutzung eines Versionsmanagers wie nvm.
Das ermöglicht es dir auch, "globale" Node.js-Pakete installieren.
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/master/install.sh | bash
Neben der Installation von nvm wird der Pfad der Installation sowie eine Umgebungsvariable zu deiner .bashrc hinzugefügt.
Um nvm über das CLI zu verwenden, muss die .bashrc erneut eingelesen werden.
source $SHELL
2. Node-Version installieren
Nun kann die gewünschte Node-Version installiert werden:
nvm ls-remote # verfügbare Versionen anzeigen
nvm install 'lts/*' # die neueste LTS-Version installieren
nvm install 22 # die neueste 22.x-Version installieren
nvm alias default 'lts/*' # LTS als Standardversion festlegen
Verschiedene Versionen verwalten
Um pro Projekt die verwendete Node-Version zu bestimmen, kann eine .nvmrc Konfigurationsdatei erstellt werden:
$ cat .nvmrc
lts/*
3. Prozessmanager installieren
Wir empfehlen die Nutzung von systemd für das Prozessmanagement. Im Fall von Node.js sollte es zusammen mit pm2 verwendet werden.
Während systemd hervorragend für die Verwaltung und Wiederherstellung von Diensten geeignet ist, vereinfacht pm2 das Node-Prozessmanagement mit integrierter Lastverteilung (Node.js läuft ohne pm2 nur als einzelner Prozess), überwacht Prozesse und ermöglicht und Neustarts ohne Ausfallzeiten.
Um sicherzustellen, dass pm2 nach einem Neustart immer gestartet wird, verwenden wir daher systemd, und pm2, um alle Node.js-Anwendungen eines Benutzers zu verwalten.
Installiere pm2 mit folgendem Befehl:
npm install -g pm2
Du kannst pm2 nun verwenden, um deine Node.js-Anwendungen zu verwalten. Weitere Details dazu findest du in der offiziellen Dokumentation.
4. pm2 nach dem Neustart mit systemd starten
Um pm2 als Benutzerdienst zu starten, wenn das System neu gestartet wird, erstelle einen systemd-Benutzerdienst (~/.config/systemd/user/pm2.service):
[Unit]
Description=PM2 Prozessmanager
Documentation=https://pm2.keymetrics.io/
[Service]
Type=forking
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
Environment=NODE_ENV=production
Environment=NODE_VERSION=14
Environment=PM2_HOME=%h/.pm2
PIDFile=%h/.pm2/%p.pid
ExecStart=%h/.nvm/nvm-exec pm2 resurrect
ExecReload=%h/.nvm/nvm-exec pm2 reload all
ExecStop=%h/.nvm/nvm-exec pm2 kill
[Install]
WantedBy=default.target
Aktivieren und starte den pm2-Dienst:
systemctl --user enable pm2
systemctl --user start pm2
Fehlersuche
- Stelle sicher, dass die
.bashrckorrekt geladen wird - Überprüfe, ob der Dienst korrekt gestartet wurde:
systemctl --user status app.service - Überprüfe die Log-Ausgabe:
journalctl --user -f
Weitere Informationen zur Verwendung von Systemd findest du im folgendem Support-Artikel.
Rotation von Log-Dateien
Es wird empfohlen, auch für pm2 die log rotation einzurichten, um sicherzustellen, dass nicht zu viel Speicherplatz durch Log-Dateien belegt wird.
Um Logrotate zu aktivieren, folge den Anweisungen in "Rotation von Log-Dateien" und füge die folgende Konfiguration hinzu:
~/.pm2/logs/*.log {
daily
rotate 14
notifempty
compress
copytruncate
compresscmd /usr/bin/zstdmt
compressoptions -18 -T0 --rm -qq
compressext .zst
uncompresscmd /usr/bin/unzstd
}
5. Webserver konfigurieren
Dadurch sollte deine Anwendung über http zugänglich sein. Um https-Unterstützung hinzuzufügen, verwende bitte proxy_letsencrypt_https, wie in nine-manage-vhosts mit Let's Encrypt dokumentiert.
Die Anwendung läuft jetzt auf einem lokalen Port. Um die Anwendung über http und https zu erreichen, muss der Webserver diese Anfragen an den lokalen Port weiterleiten.
Auf deinem Managed Server sind bereits zwei nine-manage-vhost Vorlagen für diesen Anwendungsfall vorinstalliert: proxy und proxy_letsencrypt.
Erstelle einen neuen vHost und geben den lokalen Port der Anwendung über die Variable PROXYPORT an:
$ sudo nine-manage-vhosts virtual-host create example.com --template proxy --template-variable PROXYPORT=3000 --webroot ~/exampleapp/static
Virtual Host created: example.com
example.com
===========
DOMAIN: example.com
USER: www-data
WEBROOT: /home/www-data/exampleapp/static
TEMPLATE: proxy
TEMPLATE VARIABLES: PROXYPORT
3000
ALIASES: www.example.com
example.com.server.nine.ch
Bei Aufruf der URL http://example.com.server.nine.ch wird nun deine Applikation angesprochen.