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

Einführung

Node.js ist eine Open-Source-JavaScript-Laufzeitumgebung zum einfachen Erstellen von serverseitigen Anwendungen und Netzwerkanwendungen. Die Plattform läuft unter Linux, OS X, FreeBSD und Windows. Node.js-Anwendungen können über die Befehlszeile ausgeführt werden. Wir konzentrieren uns jedoch darauf, sie als Dienst auszuführen, damit sie beim Neustart oder bei Fehlern automatisch neu gestartet werden und sicher in einer Produktionsumgebung verwendet werden können.

In diesem Tutorial werden wir uns mit dem Einrichten einer produktionsbereiten Node.js-Umgebung auf einem einzelnen Debian 8-Server befassen. Auf diesem Server wird eine von PM2 verwaltete Node.js-Anwendung ausgeführt, und Benutzer erhalten über einen Nginx-Reverseproxy sicheren Zugriff auf die Anwendung.

Voraussetzungen

In diesem Handbuch wird davon ausgegangen, dass Sie einen Debian 8-Server haben, der mit einem Nicht-Root-Benutzer mit "+ sudo +" - Berechtigungen konfiguriert ist, wie in https://www.digitalocean.com/community/tutorials/initial-server-setup-with beschrieben -debian-8 [Handbuch zur Ersteinrichtung des Servers für Debian 8].

Es wird auch davon ausgegangen, dass Sie einen Domainnamen haben, der auf die öffentliche IP-Adresse des Servers verweist.

Beginnen wir mit der Installation der Node.js-Laufzeit auf Ihrem Server.

Installieren Sie Node.js

Wir werden die neueste LTS-Version von Node.js unter Verwendung der NodeSource -Paketarchive installieren.

Zunächst müssen Sie die NodeSource-PPA installieren, um auf deren Inhalt zugreifen zu können. Stellen Sie sicher, dass Sie sich in Ihrem Ausgangsverzeichnis befinden, und rufen Sie mit curl das Installationsskript für die Node.js 6.x-Archive auf:

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

Sie können den Inhalt dieses Skripts mit nano (oder Ihrem bevorzugten Texteditor) überprüfen:

nano nodesource_setup.sh

Und führen Sie das Skript 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 auf die gleiche Weise installieren wie oben beschrieben:

sudo apt-get install nodejs

Das Paket "+ nodejs " enthält die Binärdatei " nodejs " sowie " npm ", sodass Sie " npm " nicht separat installieren müssen. Damit jedoch 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-get install build-essential

Die Node.js-Laufzeit ist jetzt installiert und bereit, eine Anwendung auszuführen! Lassen Sie uns eine Node.js-Anwendung schreiben.

Erstellen Sie die Anwendung Node.js

Wir werden eine Hello World-Anwendung schreiben, die einfach "Hello World" auf alle HTTP-Anforderungen zurückgibt. Dies ist eine Beispielanwendung, mit der Sie Node.js einrichten können, die Sie durch Ihre eigene Anwendung ersetzen können. Stellen Sie lediglich sicher, dass Sie Ihre Anwendung so ändern, dass sie die entsprechenden IP-Adressen und Ports überwacht.

Hallo Weltcode

Erstellen und öffnen Sie zunächst Ihre Node.js-Anwendung zum Bearbeiten. In diesem Tutorial bearbeiten wir mit + nano + eine Beispielanwendung mit dem Namen + hello.js +:

cd ~
nano hello.js

Fügen Sie den folgenden Code in die Datei ein. Wenn Sie möchten, können Sie den hervorgehobenen Port "++" an beiden Stellen ersetzen (stellen Sie sicher, dass Sie einen Nicht-Administrator-Port verwenden, d. H. 1024 oder höher):

hallo.js

#!/usr/bin/env nodejs
var http = require('http');
http.createServer(function (req, res) {
 res.writeHead(200, {'Content-Type': 'text/plain'});
 res.end('Hello World\n');
}).listen(, 'localhost');
console.log('Server running at http://localhost:/');

Nun speichern und beenden.

Diese Node.js-Anwendung überwacht einfach die angegebene Adresse (+ localhost +) und den angegebenen Port (++) 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.

Anwendung testen

Damit wir die Anwendung testen können, markieren Sie die ausführbare Datei + hello.js +:

chmod +x ./hello.js

Und führe es so aus:

./hello.js
OutputServer running at http://localhost:/

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 überwacht die richtige Adresse und den richtigen Port:

OutputHello World

Wenn Sie nicht die richtige Ausgabe sehen, 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.

Installieren Sie PM2

Jetzt installieren wir PM2, einen Prozessmanager für Node.js-Anwendungen. PM2 bietet eine einfache Möglichkeit zum Verwalten und Dämonisieren von Anwendungen (Ausführen im Hintergrund als Dienst).

Wir werden + npm + verwenden, einen Paketmanager für Node-Module, der mit Node.js installiert wird, um PM2 auf unserem Server zu installieren. Verwenden Sie diesen Befehl, um PM2 zu installieren:

sudo npm install -g pm2

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

Anwendung mit PM2 verwalten

PM2 ist einfach und leicht zu bedienen. Wir werden einige grundlegende Verwendungen von PM2 behandeln.

Anwendung starten

Als erstes müssen Sie den Befehl + pm2 start + verwenden, 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
[PM2] PM2 Successfully daemonized
[PM2] Starting  in fork_mode (1 instance)
[PM2] Done.
┌──────────┬────┬──────┬──────┬────────┬─────────┬────────┬─────────────┬──────────┐
│ App name │ id │ mode │ pid  │ status │ restart │ uptime │ memory      │ watching │
├──────────┼────┼──────┼──────┼────────┼─────────┼────────┼─────────────┼──────────┤
│     │ 0  │ fork │ 3524 │ online │ 0       │ 0s     │ 21.566 MB   │ disabled │
└──────────┴────┴──────┴──────┴────────┴─────────┴────────┴─────────────┴──────────┘
Use `pm2 show <id|name>` to get more details about an app

Wie Sie sehen, weist PM2 automatisch einen * App-Namen * (basierend auf dem Dateinamen, ohne die Erweiterung + .js +) und eine PM2 * -ID * zu. 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. Es muss jedoch ein zusätzlicher Schritt ausgeführt werden, damit die Anwendung beim Systemstart (Booten oder Neustarten) gestartet wird. Glücklicherweise bietet PM2 eine einfache Möglichkeit, dies zu tun, den Unterbefehl + startup +.

Der Unterbefehl + startup + generiert und konfiguriert ein Startskript, um PM2 und seine verwalteten Prozesse beim Serverstart zu starten. Sie müssen auch die Plattform angeben, auf der Sie ausgeführt werden (in unserem Fall "+ ubuntu +"):

pm2 startup systemd

Die letzte Zeile der resultierenden Ausgabe enthält einen Befehl, den Sie mit Superuser-Berechtigungen ausführen müssen:

Output[PM2] You have to run this command as root. Execute the following command:

Führen Sie den generierten Befehl aus (ähnlich der oben hervorgehobenen Ausgabe, aber mit Ihrem Benutzernamen anstelle von "++"), um PM2 für den Start beim Booten einzurichten (verwenden Sie den Befehl aus Ihrer eigenen Ausgabe):

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

Dadurch wird eine systemd * unit * erstellt, die + pm2 + für Ihren Benutzer beim Booten ausführt. Diese + pm2 + Instanz führt ihrerseits + hello.js + aus. Sie können den Status der Systemeinheit mit + systemctl + überprüfen:

systemctl status pm2

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

Andere PM2-Verwendung (optional)

PM2 bietet viele Unterbefehle, mit denen Sie Informationen zu Ihren Anwendungen verwalten oder nachschlagen können. Beachten Sie, dass beim Ausführen von + pm2 + ohne Argumente eine Hilfeseite angezeigt wird, die die Verwendung von PM2 ausführlicher als in diesem Abschnitt des Lernprogramms behandelt.

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

pm2 stop

Starten Sie eine Anwendung mit diesem Befehl neu (geben Sie PM2 + App name oder` + id` an):

pm2 restart

Die Liste der derzeit von PM2 verwalteten Anwendungen kann auch mit dem Unterbefehl + list + abgerufen werden:

pm2 list

Weitere Informationen zu einer bestimmten Anwendung erhalten Sie mit dem Unterbefehl + info + (geben Sie den App-Namen von PM2 oder id an):

pm2 info

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

pm2 monit

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

Richten Sie Nginx als Reverse-Proxy-Server ein

Nachdem Ihre Anwendung ausgeführt wird und * localhost * abhört, müssen Sie eine Möglichkeit einrichten, dass Ihre Benutzer darauf zugreifen können. Zu diesem Zweck richten wir einen Nginx-Webserver als Reverse-Proxy ein. In diesem Tutorial wird ein Nginx-Server von Grund auf neu eingerichtet. Wenn Sie bereits einen Nginx-Server eingerichtet haben, können Sie einfach den Block "+ location +" in den Serverblock Ihrer Wahl kopieren (stellen Sie sicher, dass der Speicherort nicht mit den vorhandenen Inhalten Ihres Webservers in Konflikt steht).

Installieren Sie zuerst Nginx mit apt-get:

sudo apt-get install nginx

Öffnen Sie nun die Standard-Serverblock-Konfigurationsdatei zum Bearbeiten:

sudo nano /etc/nginx/sites-available/default

Löschen Sie alles in der Datei und fügen Sie die folgende Konfiguration ein. Stellen Sie sicher, dass Sie die Direktive "+ Servername " durch Ihren eigenen Domainnamen ersetzen. Ändern Sie außerdem den Port (`+`), wenn Ihre Anwendung einen anderen Port überwacht:

/ etc / nginx / sites-available / default

server {
   listen 80;

   server_name ;

   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. Angenommen, unser Server ist unter "+ example.com " verfügbar. Wenn Sie über einen Webbrowser auf " http: // example.com / " zugreifen, wird die Anforderung an " hello.js " gesendet, wobei Sie den Port " 8080 +" abhören bei * localhost *.

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 " 8081 " ausführen, können Sie diesen Standortblock hinzufügen, um den Zugriff über " http: // example.com / app2 +" zu ermöglichen:

Nginx-Konfiguration - Zusätzliche Standorte

   location /app2 {
       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;
   }

Wenn Sie die Standortblöcke für Ihre Anwendungen hinzugefügt haben, speichern Sie sie und beenden Sie sie.

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

sudo nginx -t

Starten Sie als nächstes Nginx neu:

sudo systemctl restart nginx

Lassen Sie als Nächstes den Datenverkehr zu Nginx über eine Firewall zu, sofern diese aktiviert ist.

Wenn Sie * ufw * verwenden, können Sie den folgenden Befehl verwenden:

sudo ufw allow 'Nginx Full'

Mit * ufw * können Sie den Status immer mit dem folgenden Befehl überprüfen:

sudo ufw status

Wenn Sie stattdessen * IPTables * verwenden, können Sie den Datenverkehr mit Nginx mithilfe des folgenden Befehls zulassen:

sudo iptables -I INPUT -p tcp -m tcp --dport 80 -j ACCEPT

Sie können den Status Ihrer IPTables jederzeit überprüfen, indem Sie den folgenden Befehl ausführen:

sudo iptables -S

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 (die öffentliche IP-Adresse oder den Domainnamen) zugreifen.

Von hier aus sollten Sie Ihre Einrichtung weiterhin sichern, indem Sie https://www.digitalocean.com/community/tutorials/how-to-secure-nginx-with-let-s-encrypt-on-debian-8[How lesen So sichern Sie Nginx mit Let’s Encrypt unter Debian 8

Fazit

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