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:
-
Ein Ubuntu 18.04-Server-Setup, wie ininitial server setup guide for Ubuntu 18.04 beschrieben. Sie sollten einen Nicht-Root-Benutzer mit Sudo-Berechtigungen und einer aktiven Firewall haben.
-
Adomain name pointed at your server’s public IP. In diesem Tutorial wird durchgehend der Domainnameexample.com verwendet.
-
Nginx installiert, wie inHow To Install Nginx on Ubuntu 18.04 angegeben.
-
Nginx mit SSL mithilfe von Let's Encrypt-Zertifikaten konfiguriert. How To Secure Nginx with Let’s Encrypt on Ubuntu 18.04 führt Sie durch den Prozess.
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ärdateinodejs
owienpm
, 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 Unterbefehlstartup
zu 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 Unterbefehlmonit
aufgerufen 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.com
ein. Ö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.