Einrichten einer Node.js-Anwendung für die Produktion unter Ubuntu 16.04

Einführung

Node.js is an open source JavaScript runtime environment for easily building server-side and networking applications. Die Plattform läuft unter Linux, OS X, FreeBSD und Windows. Node.js applications can be run at the command line, but we’ll focus on running them as a service, so that they will automatically restart on reboot or failure, and can safely be used in a production environment.

In diesem Tutorial wird das Einrichten einer produktionsbereiten Node.js-Umgebung auf einem einzelnen Ubuntu 16.04-Server behandelt. 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. Der Nginx-Server bietet HTTPS mit einem kostenlosen Zertifikat von Let's Encrypt an.

Voraussetzungen

In diesem Handbuch wird Folgendes vorausgesetzt:

Wenn Sie die Voraussetzungen erfüllt haben, haben Sie einen Server, der die Standard-Nginx-Platzhalterseite mithttps://example.com/ bereitstellt.

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 Paketarchive vonNodeSourceinstallieren.

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 Home-Verzeichnis befinden, und verwenden Siecurl, um das Installationsskript für die Archive von Node.js 6.x abzurufen:

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

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

nano nodesource_setup.sh

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

sudo apt-get install nodejs

Das Paketnodejs enthält sowohl die Binärdateinodejsals auchnpm, sodass Sienpm nicht separat installieren müssen. Damit jedoch einigenpm-Pakete funktionieren (z. B. solche, bei denen Code aus dem Quellcode kompiliert werden muss), müssen Sie dasbuild-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.

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

Erstellen Sie die Anwendung Node.js

Wir werden eineHello World-Anwendung schreiben, die einfach "Hello World" an 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 verwenden wirnano, um eine Beispielanwendung mit dem Namenhello.js zu bearbeiten:

cd ~
nano hello.js

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

hello.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(8080, 'localhost');
console.log('Server running at http://localhost:8080/');

Nun speichern und beenden.

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

Anwendung testen

Um Ihre Anwendung zu testen, markieren Sie die ausführbare Datei vonhello.js:

chmod +x ./hello.js

Und führe es so aus:

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

[.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.

Um die Anwendung zu testen, öffnen Sie eine andere Terminalsitzung auf Ihrem Server und stellen Sie mitcurl eine Verbindung zulocalhost her:

curl http://localhost:8080

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 Sie dies noch nicht getan haben), indem SieCtrl+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 werdennpm 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 weistnpm an, das Modulglobally 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öchten Sie den Befehlpm2 start verwenden, 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
[PM2] PM2 Successfully daemonized
[PM2] Starting hello.js in fork_mode (1 instance)
[PM2] Done.
┌──────────┬────┬──────┬──────┬────────┬─────────┬────────┬─────────────┬──────────┐
│ App name │ id │ mode │ pid  │ status │ restart │ uptime │ memory      │ watching │
├──────────┼────┼──────┼──────┼────────┼─────────┼────────┼─────────────┼──────────┤
│ hello    │ 0  │ fork │ 3524 │ online │ 0       │ 0s     │ 21.566 MB   │ 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. 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 Unterbefehlstartup.

Der Unterbefehlstartupgeneriert und konfiguriert ein Startskript zum Starten von PM2 und seiner verwalteten Prozesse beim Serverstart:

pm2 startup systemd

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

Output[PM2] Init System found: systemd
[PM2] You have to run this command as root. Execute 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 generierten Befehl aus (ähnlich der oben hervorgehobenen Ausgabe, jedoch mit Ihrem Benutzernamen anstelle vonsammy), um PM2 für den Start beim Booten einzurichten (verwenden Sie den Befehl aus Ihrer eigenen Ausgabe):

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

Dadurch wird ein Systemdunit erstellt, das beim Bootenpm2 für Ihren Benutzer ausführt. Diesepm2-Instanz führt wiederumhello.js aus. Sie können den Status der systemd-Einheit mitsystemctl überprüfen:

systemctl status pm2-sammy

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

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 vonpm2 ohne Argumente eine Hilfeseite angezeigt wird, einschließlich der Beispielverwendung, die die PM2-Verwendung ausführlicher behandelt als dieser Abschnitt des Lernprogramms.

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

pm2 stop app_name_or_id

Starten Sie eine Anwendung mit diesem Befehl neu (geben Sie PM2App name oderid an):

pm2 restart app_name_or_id

Die Liste der Anwendungen, die derzeit von PM2 verwaltet werden, kann auch mit dem Unterbefehllistnachgeschlagen werden:

pm2 list

Weitere Informationen zu einer bestimmten Anwendung finden Sie mit dem Unterbefehlinfo (geben Sie die PM2App name oderid an):

pm2 info example

Der PM2-Prozessmonitor kann mit dem Unterbefehlmonitaufgerufen 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 undlocalhost abhört, müssen Sie eine Möglichkeit für Ihre Benutzer einrichten, darauf zuzugreifen. Zu diesem Zweck richten wir den Nginx-Webserver als Reverse-Proxy ein.

Im vorausgesetzten Tutorial richten wir unsere Nginx-Konfiguration in der Datei/etc/nginx/sites-available/defaultein. Öffnen Sie die Datei zum Bearbeiten:

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

Innerhalb desserver-Blocks sollte ein vorhandenerlocation /-Block vorhanden sein. Ersetzen Sie den Inhalt dieses Blocks durch die folgende Konfiguration. Wenn Ihre Anwendung so eingestellt ist, dass sie einen anderen Port überwacht, aktualisieren Sie den hervorgehobenen Teil auf die richtige Portnummer.

/etc/nginx/sites-available/default

. . .
    location / {
        proxy_pass http://localhost:8080;
        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 Port8080 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 Port8081 ausgeführt haben, können Sie diesen Standortblock hinzufügen, um den Zugriff überhttp://example.com/app2 zu ermöglichen:

/etc/nginx/sites-available/default — Optional

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

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 16.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. Viel Glück mit deiner Node.js Entwicklung!