Einleitung: Vom lokalen Server zur produktionsreifen Lösung
Sie haben eine leistungsstarke JavaScript-Anwendung mit Node.js erstellt, lokal getestet, und jetzt ist es an der Zeit, sie der Welt zu zeigen. Einfach Dateien auf die VPS hochzuladen und node app.js auszuführen – das ist der Weg eines Anfängers. Auf fortgeschrittenem Niveau umfasst die Bereitstellung die Einrichtung eines Reverse-Proxys, eines Prozessmanagers, die automatische Verlängerung von SSL-Zertifikaten, ein System für kontinuierliche Integration und Bereitstellung (CI/CD) sowie ein ordentliches Monitoring und Logging.
In diesem Artikel werden wir den schrittweisen Prozess der Bereitstellung einer Node.js-Anwendung auf einer VPS (Ubuntu 22.04) auf fortgeschrittenem Niveau durchgehen. Wir richten Nginx als Reverse Proxy, PM2 zur Prozessverwaltung, Let's Encrypt für HTTPS, GitHub Actions für die automatische Bereitstellung bei einem Push ins Repository ein und fügen ein grundlegendes Monitoring hinzu.
Voraussetzungen
- VPS-Server (Ubuntu 22.04) mit SSH-Zugang.
- Eine Domain, die mit der IP Ihres Servers verbunden ist (z.B.
myapp.example.com). - Installiertes Node.js (v18+) und npm auf dem Server.
- Git, installiert auf dem Server.
- Ein Repository Ihrer Anwendung auf GitHub.
1. Server- und PM2-Prozessmanager-Einrichtung
Beginnen wir mit der grundlegenden Vorbereitung der Umgebung. Nachdem Sie sich per SSH mit dem Server verbunden haben, aktualisieren wir die Pakete und installieren die notwendigen Werkzeuge:
sudo apt update && sudo apt upgrade -ysudo apt install nginx git curl -yStellen Sie sicher, dass Node.js installiert ist. Falls nicht – installieren Sie es über NodeSource:
curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -sudo apt install -y nodejsnode -vnpm -vJetzt installieren wir global PM2 – einen fortschrittlichen Prozessmanager für Node.js, der die Anwendung bei einem Absturz automatisch neu startet, Logs verwaltet und Clustering ermöglicht:
sudo npm install -g pm2Klonen Sie das Repository Ihrer Anwendung und installieren Sie die Abhängigkeiten:
git clone https://github.com/ihr-benutzername/ihr-repository.git /var/www/myappcd /var/www/myappnpm install --productionErstellen Sie eine PM2-Ökosystemdatei (ecosystem.config.js) für die Feineinstellung:
// ecosystem.config.jsmodule.exports = { apps: [{ name: 'myapp', script: 'app.js', // oder server.js instances: 'max', // alle CPU-Kerne nutzen exec_mode: 'cluster', env: { NODE_ENV: 'production', PORT: 3000 }, error_file: '/var/log/node-app/err.log', out_file: '/var/log/node-app/out.log', log_date_format: 'YYYY-MM-DD HH:mm Z' }]};Erstellen Sie ein Verzeichnis für die Logs und starten Sie die Anwendung über PM2:
sudo mkdir -p /var/log/node-appsudo chown -R $USER:$USER /var/log/node-apppm2 start ecosystem.config.jspm2 savepm2 startup systemdDer Befehl pm2 startup erstellt einen systemd-Dienst, der PM2 beim Systemstart ausführt. Ihre Anwendung läuft nun auf Port 3000, aber der direkte Zugriff darauf ist unsicher. Fahren wir mit der Nginx-Einrichtung fort.
2. Einrichtung von Nginx als Reverse Proxy und SSL über Let's Encrypt
Nginx wird eingehende Anfragen auf den Ports 80 (HTTP) und 443 (HTTPS) entgegennehmen, sie an Ihren Node.js-Prozess auf Port 3000 weiterleiten und statische Dateien direkt ausliefern – das entlastet Node.js.
Erstellen Sie eine Konfigurationsdatei für Ihre Domain:
sudo nano /etc/nginx/sites-available/myappFügen Sie die folgende Konfiguration ein (ersetzen Sie myapp.example.com durch Ihre Domain):
server { listen 80; server_name myapp.example.com; return 301 https://$server_name$request_uri; # Weiterleitung auf HTTPS}
server { listen 443 ssl http2; server_name myapp.example.com;
# SSL ser