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

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 die Anwendungen 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 Debian 10-Server ein. Dieser Server führt eine Node.js-Anwendung aus, die von PM2 verwaltet wird, und bietet Benutzern über einen Nginx -Reverse-Proxy sicheren Zugriff auf die Anwendung. Der Nginx-Server bietet HTTPS mithilfe eines kostenlosen Zertifikats an, das von Let’s Encrypt bereitgestellt wird.

Voraussetzungen

In diesem Handbuch wird Folgendes vorausgesetzt:

Wenn Sie die Voraussetzungen erfüllt haben, wird auf einem Server unter "+ https: /// +" die Standard-Platzhalterseite Ihrer Domain angezeigt.

Schritt 1 - Installieren von Node.js

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

Um die NodeSource-PPA zu installieren und auf ihren Inhalt zuzugreifen, müssen Sie zuerst Ihren Paketindex aktualisieren und + curl + installieren:

sudo apt update
sudo apt install curl

Stellen Sie sicher, dass Sie sich in Ihrem Ausgangsverzeichnis befinden, und rufen Sie mit "+ curl +" das Installationsskript für die Archive "Node.js .x" auf:

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

Sie können den Inhalt dieses Skripts mit + nano + oder Ihrer https://www.digitalocean.com/community/tutorials/initial-server-setup-with-debian-9#step-six-%E2%80% überprüfen. 94-Vervollständigen-der-optionalen-Konfiguration [bevorzugter Texteditor]:

nano nodesource_setup.sh

Wenn Sie das Skript überprüft haben, führen Sie es unter "+ sudo +" 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
Outputv

Das Paket + nodejs + enthält die Binärdatei + nodejs + sowie https://www.npmjs.com/ [+ npm +], einen Paketmanager für Knotenmodule, sodass Sie `+ nicht installieren müssen npm + `getrennt.

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

npm -v
Output

Damit einige "+ npm " - Pakete funktionieren (z. B. solche, die das Kompilieren von Code aus dem Quellcode erfordern), müssen Sie das " build-essential +" - Paket installieren:

sudo apt install build-essential

Sie haben jetzt die notwendigen Werkzeuge, um mit + npm + - Paketen zu arbeiten, die das Kompilieren von Code aus dem Quellcode erfordern.

Mit der installierten Node.js-Laufzeit können wir mit dem Schreiben einer Node.js-Anwendung fortfahren.

Schritt 2 - Erstellen einer Node.js-Anwendung

Schreiben wir eine Hello World-Anwendung, die "Hello World" für 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 Namen "+ hallo.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 einem HTTP-Erfolgscode von + 200 + zurück. Da wir "+ localhost +" abhören, können Remote-Clients 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/

Um die Anwendung zu testen, öffnen Sie eine andere Terminalsitzung auf Ihrem Server und stellen Sie mit "+ curl" eine Verbindung zu "+ localhost" her:

curl http://localhost:

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 noch nicht geschehen), indem Sie "+ STRG + C +" drücken.

Schritt 3 - PM2 installieren

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 Sie "+ npm +", um die neueste Version von PM2 auf Ihrem Server zu installieren:

sudo npm install pm2 -g

Die Option "+ -g " weist " npm +" an, das Modul global zu installieren, damit es systemweit verfügbar ist.

Verwenden Sie zuerst den Befehl "+ pm2 start", um die Anwendung "+ hello.js" im Hintergrund auszuführen:

pm2 start

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 │
├──────────┼────┼──────┼──────┼────────┼─────────┼────────┼─────┼───────────┼───────┼──────────┤
│     │ 0  │ fork │ 1338 │ online │ 0       │ 0s     │ 0%  │ 23.0 MB   │ sammy │ disabled │
└──────────┴────┴──────┴──────┴────────┴─────────┴────────┴─────┴───────────┴───────┴──────────┘
Use `pm2 show <id|name>` to get more details about an app

Wie Sie sehen, weist PM2 automatisch einen "+ App-Namen " zu, basierend auf dem Dateinamen ohne die Erweiterung " .js ", zusammen mit einer PM2 " id ". PM2 verwaltet auch andere Informationen, wie z. B. die " 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. Sie können jedoch einen weiteren Schritt ausführen, um die Anwendung beim Systemstart mit dem Unterbefehl "+ startup +" zu starten. Dieser Unterbefehl generiert und konfiguriert ein Startskript, um PM2 und die verwalteten Prozesse beim Serverstart zu starten. Geben Sie Folgendes ein:

sudo pm2 startup

Sie sehen eine Ausgabe, die wie folgt aussieht und die von PM2 generierte Servicekonfiguration beschreibt:

Output[PM2] Init System found: systemd
Platform systemd
Template
[Unit]
Description=PM2 process manager
Documentation=https://pm2.keymetrics.io/
After=network.target

[Service]
Type=forking
User=root
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
Environment=PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
Environment=PM2_HOME=/root/.pm2
PIDFile=/root/.pm2/pm2.pid
Restart=on-failure

ExecStart=/usr/lib/node_modules/pm2/bin/pm2 resurrect
ExecReload=/usr/lib/node_modules/pm2/bin/pm2 reload all
ExecStop=/usr/lib/node_modules/pm2/bin/pm2 kill

[Install]
WantedBy=multi-user.target

Target path
/etc/systemd/system/pm2-root.service
Command list
[ 'systemctl enable pm2-root' ]
[PM2] Writing init configuration in /etc/systemd/system/pm2-root.service
[PM2] Making script booting at startup...
[PM2] [-] Executing: systemctl enable pm2-root...
Created symlink /etc/systemd/system/multi-user.target.wants/pm2-root.service → /etc/systemd/system/pm2-root.service.
[PM2] [v] Command successfully executed.
+---------------------------------------+
[PM2] Freeze a process list on reboot via:
$ pm2 save

[PM2] Remove init script via:
$ pm2 unstartup systemd

Sie haben jetzt eine systemd unit erstellt, die beim Booten + pm2 + ausführt. Diese + pm2 + Instanz führt ihrerseits + hello.js + aus.

Starten Sie den Dienst mit + systemctl +:

sudo systemctl start pm2-root.service

Überprüfen Sie den Status der Systemeinheit:

systemctl status pm2-root.service

Die Ausgabe sollte folgendermaßen aussehen:

Output● pm2-root.service - PM2 process manager
  Loaded: loaded (/etc/systemd/system/pm2-root.service; enabled; vendor preset: enabled)
  Active:  since Fri 2019-07-12 16:09:54 UTC; 4s ago

Eine detaillierte Übersicht über systemd finden Sie unter Systemd Essentials: Arbeiten mit Services, Units und das Tagebuch.

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

Beenden Sie eine Anwendung mit diesem Befehl (geben Sie den PM2 "+ App-Namen" oder "+ ID" an):

pm2 stop

Starten Sie eine Anwendung neu:

pm2 restart

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

pm2 list

Informationen zu einer bestimmten Anwendung erhalten Sie unter Verwendung des "+ App-Namens +":

pm2 info

Der PM2-Prozessmonitor kann mit dem Unterbefehl + monit + aufgerufen werden. Hier werden der Anwendungsstatus, die CPU und die Speichernutzung angezeigt:

pm2 monit

Beachten Sie, dass beim Ausführen von + pm2 + 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

Ihre Anwendung läuft und hört auf + localhost, 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 / + ein. Öffnen Sie diese Datei zum Bearbeiten:

sudo nano /etc/nginx/sites-available/

Im + server + Block sollte ein + location / + 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 / your_domain

server {
...
   location / {
       proxy_pass http://localhost:;
       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. Unter der Annahme, dass unser Server unter "+" verfügbar ist, würde der Zugriff auf " https: /// " über einen Webbrowser die Anfrage an " hello.js " senden und den Port " 3000 " unter " localhost +" abhören .

Sie können demselben Serverblock zusätzliche "+ location " - Blöcke hinzufügen, um den Zugriff auf andere Anwendungen auf demselben Server zu ermöglichen. Wenn Sie beispielsweise auch eine andere Node.js-Anwendung auf Port " 3001 " ausführen, können Sie diesen Standortblock hinzufügen, um den Zugriff über " https: /// +" zu ermöglichen:

/ etc / nginx / sites-available / your_domain - Optional

server {
...
   location / {
       proxy_pass http://localhost:;
       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

Vorausgesetzt, Ihre Node.js-Anwendung wird ausgeführt und Ihre Anwendung und Ihre Nginx-Konfigurationen sind korrekt, sollten Sie nun über den Nginx-Reverse-Proxy auf Ihre Anwendung zugreifen können. Probieren Sie es aus, indem Sie im Browser auf Ihre Domain zugreifen: + https: // +.

Fazit

Herzliche Glückwünsche! Sie haben jetzt Ihre Node.js-Anwendung hinter einem Nginx-Reverse-Proxy auf einem Debian 10-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.