So richten Sie eine Node.js-Anwendung für die Produktion unter Ubuntu ein 18.04

Einführung

Node.js ist eine Open-Source-JavaScript-Laufzeitumgebung zum Erstellen von serverseitigen und Netzwerkanwendungen. Die Plattform läuft unter Linux, macOS, FreeBSD und Windows. Obwohl Sie Node.js-Anwendungen über die Befehlszeile ausführen können, konzentriert sich dieses Lernprogramm darauf, sie als Dienst auszuführen. Dies bedeutet, dass sie beim Neustart oder bei einem Fehler neu gestartet werden und für die Verwendung in einer Produktionsumgebung sicher sind.

In diesem Tutorial richten Sie eine produktionsbereite Node.js-Umgebung auf einem einzelnen Ubuntu 18.04-Server ein. Dieser Server führt eine Node.js-Anwendung aus, die vonPM2 verwaltet wird, und bietet Benutzern über einen Nginx-Reverse-Proxy sicheren Zugriff auf die Anwendung. Der Nginx-Server bietet HTTPS mit einem kostenlosen Zertifikat vonLet’s Encrypt an.

Voraussetzungen

In diesem Handbuch wird Folgendes vorausgesetzt:

Wenn Sie die Voraussetzungen erfüllt haben, haben Sie einen Server, der die Standard-Platzhalterseite Ihrer Domain beihttps://example.com/ bedient.

[[Schritt-1 - Installieren von Node-Js]] == Schritt 1 - Installieren von Node.js.

Beginnen wir mit der Installation der neuesten LTS-Version von Node.js unter Verwendung der Paketarchive vonNodeSource.

Installieren Sie zunächst die NodeSource-PPA, um Zugriff auf deren Inhalt zu erhalten. Stellen Sie sicher, dass Sie sich in Ihrem Home-Verzeichnis befinden, und verwenden Siecurl, um das Installationsskript für die Archive von Node.js 8.x abzurufen:

cd ~
curl -sL https://deb.nodesource.com/setup_8.x -o nodesource_setup.sh

Sie können den Inhalt dieses Skripts mitnano oder Ihrem bevorzugten Texteditor überprüfen:

nano nodesource_setup.sh

Wenn Sie das Skript überprüft haben, führen Sie es untersudo aus:

sudo bash nodesource_setup.sh

Die PPA wird Ihrer Konfiguration hinzugefügt und Ihr lokaler Paket-Cache wird automatisch aktualisiert. Nachdem Sie das Setup-Skript von Nodesource ausgeführt haben, können Sie das Paket Node.js installieren:

sudo apt install nodejs

Um zu überprüfen, welche Version von Node.js Sie nach diesen ersten Schritten installiert haben, geben Sie Folgendes ein:

nodejs -v
Outputv8.11.3

[.note] #Note: Bei der Installation von der NodeSource PPA wird die ausführbare Datei von Node.js alsnodejs und nicht alsnode.
# bezeichnet.

Das Paketnodejs enthält die Binärdateinodejsowienpm, einen Paketmanager für Knotenmodule, sodass Sienpm nicht separat installieren müssen.

npm verwendet eine Konfigurationsdatei in Ihrem Home-Verzeichnis, um Aktualisierungen zu verfolgen. Es wird erstellt, wenn Sienpm zum ersten Mal ausführen. Führen Sie diesen Befehl aus, um zu überprüfen, obnpm installiert ist, und um die Konfigurationsdatei zu erstellen:

npm -v
Output5.6.0

Damit einigenpm-Pakete funktionieren (z. B. solche, bei denen Code aus dem Quellcode kompiliert werden muss), müssen Sie dasbuild-essential-Paket installieren:

sudo apt install build-essential

Sie haben jetzt die erforderlichen Tools, um mitnpm-Paketen zu arbeiten, für die Code aus dem Quellcode kompiliert werden muss.

Fahren Sie mit der installierten Node.js-Laufzeit mit dem Schreiben einer Node.js-Anwendung fort.

[[Schritt-2 - Erstellen einer Knoten-js-Anwendung]] == Schritt 2 - Erstellen einer Node.js-Anwendung

Schreiben wir eineHello World-Anwendung, die "Hello World" an alle HTTP-Anforderungen zurückgibt. Mit dieser Beispielanwendung können Sie Node.js einrichten. Sie können es durch Ihre eigene Anwendung ersetzen. Vergewissern Sie sich lediglich, dass Sie Ihre Anwendung so ändern, dass sie die entsprechenden IP-Adressen und Ports überwacht.

Erstellen wir zunächst eine Beispielanwendung mit dem Namenhello.js:

cd ~
nano hello.js

Fügen Sie den folgenden Code in die Datei ein:

~/hello.js

const http = require('http');

const hostname = 'localhost';
const port = 3000;

const server = http.createServer((req, res) => {
  res.statusCode = 200;
  res.setHeader('Content-Type', 'text/plain');
  res.end('Hello World!\n');
});

server.listen(port, hostname, () => {
  console.log(`Server running at http://${hostname}:${port}/`);
});

Speichern Sie die Datei und beenden Sie den Editor.

Diese Node.js-Anwendung überwacht die angegebene Adresse (localhost) und den angegebenen Port (3000) und gibt "Hello World!" mit einem200 HTTP-Erfolgscode. Da wirlocalhost abhören, können Remoteclients keine Verbindung zu unserer Anwendung herstellen.

Geben Sie zum Testen Ihrer Anwendung Folgendes ein:

node hello.js

Sie werden die folgende Ausgabe sehen:

OutputServer running at http://localhost:3000/

[.note] #Note: Wenn Sie eine Node.js-Anwendung auf diese Weise ausführen, werden zusätzliche Befehle blockiert, bis die Anwendung durch Drücken vonCTRL+C.
# beendet wird.

Öffnen Sie zum Testen der Anwendung eine andere Terminalsitzung auf Ihrem Server und stellen Sie mitcurl eine Verbindung zulocalhost her:

curl http://localhost:3000

Wenn die folgende Ausgabe angezeigt wird, funktioniert die Anwendung ordnungsgemäß und wartet auf die richtige Adresse und den richtigen Port:

OutputHello World!

Wenn die erwartete Ausgabe nicht angezeigt wird, stellen Sie sicher, dass Ihre Anwendung Node.js ausgeführt wird und so konfiguriert ist, dass sie die richtige Adresse und den richtigen Port überwacht.

Wenn Sie sicher sind, dass es funktioniert, beenden Sie die Anwendung (falls Sie dies noch nicht getan haben), indem SieCTRL+C drücken.

[[Schritt-3 - Installation von PM2]] == Schritt 3 - Installation von PM2

Als Nächstes installieren wir PM2, einen Prozessmanager für Node.js-Anwendungen. PM2 ermöglicht die Dämonisierung von Anwendungen, sodass sie als Dienst im Hintergrund ausgeführt werden.

Verwenden Sienpm, um die neueste Version von PM2 auf Ihrem Server zu installieren:

sudo npm install pm2@latest -g

Die Option-g weistnpm an, das Modulglobally zu installieren, damit es systemweit verfügbar ist.

Verwenden Sie zuerst den Befehlpm2 start, um Ihre Anwendunghello.js im Hintergrund auszuführen:

pm2 start hello.js

Dadurch wird Ihre Anwendung auch zur Prozessliste von PM2 hinzugefügt, die jedes Mal ausgegeben wird, wenn Sie eine Anwendung starten:

Output[PM2] Spawning PM2 daemon with pm2_home=/home/sammy/.pm2
[PM2] PM2 Successfully daemonized
[PM2] Starting /home/sammy/hello.js in fork_mode (1 instance)
[PM2] Done.
┌──────────┬────┬──────┬──────┬────────┬─────────┬────────┬─────┬───────────┬───────┬──────────┐
│ App name │ id │ mode │ pid  │ status │ restart │ uptime │ cpu │ mem       │ user  │ watching │
├──────────┼────┼──────┼──────┼────────┼─────────┼────────┼─────┼───────────┼───────┼──────────┤
│ hello    │ 0  │ fork │ 1338 │ online │ 0       │ 0s     │ 0%  │ 23.0 MB   │ sammy │ disabled │
└──────────┴────┴──────┴──────┴────────┴─────────┴────────┴─────┴───────────┴───────┴──────────┘
 Use `pm2 show ` to get more details about an app

Wie Sie sehen können, weist PM2 automatisch einApp name (basierend auf dem Dateinamen ohne die Erweiterung.js) und ein PM2id zu. PM2 verwaltet auch andere Informationen, wie z. B.PID des Prozesses, seinen aktuellen Status und die Speichernutzung.

Anwendungen, die unter PM2 ausgeführt werden, werden automatisch neu gestartet, wenn die Anwendung abstürzt oder beendet wird. Wir können jedoch einen zusätzlichen Schritt ausführen, um die Anwendung beim Systemstart mit dem Unterbefehlstartupzu starten. Dieser Unterbefehl generiert und konfiguriert ein Startskript, um PM2 und die verwalteten Prozesse beim Serverstart zu starten:

pm2 startup systemd

Die letzte Zeile der resultierenden Ausgabe enthält einen Befehl, der mit Superuser-Rechten ausgeführt werden soll, damit PM2 beim Start gestartet wird:

Output[PM2] Init System found: systemd
[PM2] To setup the Startup Script, copy/paste the following command:
sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u sammy --hp /home/sammy

Führen Sie den Befehl in der Ausgabe mit Ihrem Benutzernamen anstelle vonsammy aus:

sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u sammy --hp /home/sammy

Als zusätzlichen Schritt können wir die PM2-Prozessliste und die entsprechenden Umgebungen speichern:

pm2 save

Sie haben jetzt ein systemdunit erstellt, daspm2 für Ihren Benutzer beim Booten ausführt. Diesepm2-Instanz führt wiederumhello.js aus.

Starten Sie den Dienst mitsystemctl:

sudo systemctl start pm2-sammy

Überprüfen Sie den Status der Systemeinheit:

systemctl status pm2-sammy

Eine detaillierte Übersicht über systemd finden Sie unterSystemd Essentials: Working with Services, Units, and the Journal.

Zusätzlich zu den von uns behandelten Befehlen bietet PM2 zahlreiche Unterbefehle, mit denen Sie Informationen zu Ihren Anwendungen verwalten oder nachschlagen können.

Stoppen Sie eine Anwendung mit diesem Befehl (geben Sie die PM2App name oderid an):

pm2 stop app_name_or_id

Starten Sie eine Anwendung neu:

pm2 restart app_name_or_id

Listen Sie die Anwendungen auf, die derzeit von PM2 verwaltet werden:

pm2 list

Informationen zu einer bestimmten Anwendung erhalten Sie mitApp name:

pm2 info app_name

Der PM2-Prozessmonitor kann mit dem Unterbefehlmonitaufgerufen werden. Hier werden der Anwendungsstatus, die CPU und die Speichernutzung angezeigt:

pm2 monit

Beachten Sie, dass beim Ausführen vonpm2 ohne Argumente auch eine Hilfeseite mit Beispielverwendung angezeigt wird.

Nachdem Ihre Node.js-Anwendung von PM2 ausgeführt und verwaltet wird, richten wir den Reverse-Proxy ein.

[[Schritt-4 - Einrichten von Nginx als Reverse-Proxy-Server]] == Schritt 4 - Einrichten von Nginx als Reverse-Proxy-Server

Ihre Anwendung wird ausgeführt und lauschtlocalhost, aber Sie müssen eine Möglichkeit einrichten, damit Ihre Benutzer darauf zugreifen können. Zu diesem Zweck richten wir den Nginx-Webserver als Reverse-Proxy ein.

Im vorausgesetzten Tutorial richten Sie Ihre Nginx-Konfiguration in der Datei/etc/nginx/sites-available/example.comein. Öffnen Sie diese Datei zum Bearbeiten:

sudo nano /etc/nginx/sites-available/example.com

Innerhalb desserver-Blocks sollte einlocation /-Block vorhanden sein. Ersetzen Sie den Inhalt dieses Blocks durch die folgende Konfiguration. Wenn Ihre Anwendung einen anderen Port überwachen soll, aktualisieren Sie den hervorgehobenen Teil auf die richtige Portnummer:

/etc/nginx/sites-available/example.com

server {
...
    location / {
        proxy_pass http://localhost:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }
...
}

Dadurch wird der Server so konfiguriert, dass er auf Anforderungen im Stammverzeichnis reagiert. Angenommen, unser Server ist beiexample.com verfügbar, würde der Zugriff aufhttps://example.com/ über einen Webbrowser die Anforderung anhello.js senden und Port3000 beilocalhost abhören.

Sie können demselben Serverblock zusätzlichelocation-Blöcke hinzufügen, um Zugriff auf andere Anwendungen auf demselben Server zu erhalten. Wenn Sie beispielsweise auch eine andere Node.js-Anwendung auf Port3001 ausgeführt haben, können Sie diesen Standortblock hinzufügen, um den Zugriff überhttps://example.com/app2 zu ermöglichen:

/etc/nginx/sites-available/example.com — Optional

server {
...
    location /app2 {
        proxy_pass http://localhost:3001;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }
...
}

Speichern Sie die Datei, und schließen Sie den Editor, sobald Sie die Positionsblöcke für Ihre Anwendungen hinzugefügt haben.

Stellen Sie sicher, dass Sie keine Syntaxfehler eingeführt haben, indem Sie Folgendes eingeben:

sudo nginx -t

Starten Sie Nginx neu:

sudo systemctl restart nginx

Angenommen, Ihre Node.js-Anwendung wird ausgeführt und Ihre Anwendung und Nginx-Konfigurationen sind korrekt. Sie sollten nun über den Nginx-Reverse-Proxy auf Ihre Anwendung zugreifen können. Probieren Sie es aus, indem Sie auf die URL Ihres Servers zugreifen (die öffentliche IP-Adresse oder den Domainnamen).

Fazit

Herzliche Glückwünsche! Sie haben jetzt Ihre Node.js-Anwendung hinter einem Nginx-Reverse-Proxy auf einem Ubuntu 18.04-Server ausgeführt. Dieses Reverse-Proxy-Setup ist flexibel genug, um Ihren Benutzern Zugriff auf andere Anwendungen oder statische Webinhalte zu gewähren, die Sie freigeben möchten.