Einrichten einer Node.js-Anwendung für die Produktion unter Ubuntu 14.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, und ihre Anwendungen sind in JavaScript geschrieben. Node.js applications can be run at the command line but we will teach you how to run them as a service, so they will automatically restart on reboot or failure, so you can use them in a production environment.

In diesem Tutorial wird das Einrichten einer produktionsbereiten Node.js-Umgebung behandelt, die aus zwei Ubuntu 14.04-Servern besteht. Auf einem Server werden Node.js-Anwendungen ausgeführt, die von PM2 verwaltet werden, während auf dem anderen Server Benutzer über einen Nginx-Reverseproxy auf den Anwendungsserver zugreifen können.

Die CentOS-Version dieses Tutorials finden Sie unterhere.

Voraussetzungen

In diesem Handbuch werden zwei Ubuntu 14.04-Serverwith private networking (im selben Datencenter) verwendet. Wir werden sie mit folgenden Namen bezeichnen:

  • app: Der Server, auf dem Node.js Runtime, Ihre Node.js-Anwendung und PM2 installiert werden

  • web: Der Server, auf dem der Nginx-Webserver installiert wird, der als Reverse-Proxy für Ihre Anwendung fungiert. Benutzer greifen auf die öffentliche IP-Adresse dieses Servers zu, um zu Ihrer Node.js-Anwendung zu gelangen.

Es ist möglich, einen einzelnen Server für dieses Lernprogramm zu verwenden, aber Sie müssen unterwegs einige Änderungen vornehmen. Verwenden Sie einfach die IP-Adresse des lokalen Hosts, d. H. 127.0.0.1, wo immer die private IP-Adresse desapp-Servers verwendet wird.

Hier ist ein Diagramm, wie Ihr Setup aussehen wird, nachdem Sie diesem Tutorial gefolgt sind:

Reverse Proxy to Node.js Application

Bevor Sie mit diesem Handbuch beginnen, sollten Sie einen regulären Benutzer ohne Rootberechtigung mitsudo-Berechtigungen auf beiden Servern konfigurieren. Dies ist der Benutzer, unter dem Sie sich bei Ihren Servern anmelden sollten. Sie können lernen, wie Sie ein reguläres Benutzerkonto konfigurieren, indem Sie die Schritte 1 bis 4 in unsereninitial server setup guide for Ubuntu 14.04 ausführen.

Wenn Sie über einen Domainnamen anstelle der öffentlichen IP-Adresse auf den Server Ihreswebzugreifen möchten, kaufen Sie einen Domainnamen und befolgen Sie die folgenden Tutorials:

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

Installieren Sie Node.js

Wir werden die neueste LTS-Version von Node.js auf dem Server vonappinstallieren.

Aktualisieren Sie auf dem Server vonappdie apt-get-Paketlisten mit diesem Befehl:

sudo apt-get update

Verwenden Sie dannapt-get, um das Paketgit zu installieren, von demnpm abhängt:

sudo apt-get install git

Gehen Sie zuNode.js Downloads page und suchen Sie den Download-Link fürLinux Binaries (.tar.xz). Klicken Sie mit der rechten Maustaste darauf und kopieren Sie die Linkadresse in Ihre Zwischenablage. Zum Zeitpunkt dieses Schreibens ist die neueste LTS-Version4.2.3. Wenn Sie die neueste stabile Version von Node.js installieren möchten, gehen Sie zuappropriate page und kopieren Sie diesen Link.

Wechseln Sie in Ihr Home-Verzeichnis und laden Sie die Node.js-Quelle mitwget herunter. Fügen Sie den Download-Link anstelle des markierten Teils ein:

cd ~
wget https://nodejs.org/dist/v4.2.3/node-v4.2.3-linux-x64.tar.gz

Extrahieren Sie nun das soeben heruntergeladene tar-Archiv mit den folgenden Befehlen in das Verzeichnisnode:

mkdir node
tar xvf node-v*.tar.?z --strip-components=1 -C ./node

Wenn Sie das heruntergeladene Node.js-Archiv löschen möchten, da wir es nicht mehr benötigen, wechseln Sie in Ihr Ausgangsverzeichnis und verwenden Sie den Befehlrm:

cd ~
rm -rf node-v*

Als Nächstes konfigurieren wir die globalenprefix vonnpm, wobeinpm symbolische Links zu installierten Node-Paketen erstellt, die sich in Ihrem Standardpfad befinden. Wir setzen es mit diesem Befehl auf/usr/local:

mkdir node/etc
echo 'prefix=/usr/local' > node/etc/npmrc

Jetzt können wir die Binärdateiennode undnpm an unseren Installationsort verschieben. Wir verschieben es mit diesem Befehl in/opt/node:

sudo mv node /opt/

An dieser Stelle möchten Sie möglicherweiseroot zum Eigentümer der Dateien machen:

sudo chown -R root: /opt/node

Zuletzt erstellen wir symbolische Verknüpfungen der Binärdateiennode undnpm in Ihrem Standardpfad. Wir werden die Links mit diesen Befehlen in/usr/local/bin setzen:

sudo ln -s /opt/node/bin/node /usr/local/bin/node
sudo ln -s /opt/node/bin/npm /usr/local/bin/npm

Stellen Sie sicher, dass Node installiert ist, indem Sie die Version mit dem folgenden Befehl überprüfen:

node -v

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

Jetzt erstellen wir eineHello World-Anwendung, die einfach "Hello World" an alle HTTP-Anforderungen zurückgibt. Dies ist eine Beispielanwendung, mit der Sie Node.js einrichten und durch eine eigene Anwendung ersetzen können. Ändern Sie Ihre Anwendung nur, um die entsprechenden IP-Adressen und Ports abzuhören.

Da unsere Node.js-Anwendung Anforderungen von unserem Reverse-Proxy-Serverweb bedienen soll, verwenden wir die private Netzwerkschnittstelle unseresapp-Servers für die Kommunikation zwischen Servern. Suchen Sie nach der privaten Netzwerkadresse Ihresapp-Servers.

Wenn Sie ein DigitalOcean-Droplet als Server verwenden, können Sie die private IP-Adresse des Servers über den DienstMetadataabrufen. Verwenden Sie auf dem Server vonappden Befehlcurl, um die IP-Adresse jetzt abzurufen:

curl -w "\n" http://169.254.169.254/metadata/v1/interfaces/private/0/ipv4/address

Sie möchten die Ausgabe (die private IP-Adresse) kopieren, da sie zum Konfigurieren unserer Anwendung Node.js verwendet wird.

Hallo Weltcode

Als Nächstes erstellen und öffnen Sie Ihre Node.js-Anwendung zur Bearbeitung. In diesem Tutorial verwenden wirvi, um eine Beispielanwendung mit dem Namenhello.js zu bearbeiten:

cd ~
vi hello.js

Fügen Sie den folgenden Code in die Datei ein und ersetzen Sie die beiden markiertenAPP_PRIVATE_IP_ADDRESS-Elemente durch die private IP-Adresse desapp-Servers. Wenn Sie möchten, können Sie auch 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

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

Nun speichern und beenden.

Diese Node.js-Anwendung überwacht einfach die angegebene IP-Adresse und den angegebenen Port und gibt "Hello World" mit dem HTTP-Erfolgscode200zurück. Dies bedeutet, dass die Anwendung nur von Servern im selben privaten Netzwerk erreichbar ist, z. B. von unseremweb-Server.

Testanwendung (optional)

Wenn Sie testen möchten, ob Ihre Anwendung funktioniert, führen Sie diesen Befehlnode auf dem Serverappaus:

node hello.js

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 und stellen Sie eine Verbindung zum Server Ihreswebher. Da sich der Webserver im selben privaten Netzwerk befindet, sollte er in der Lage sein, die private IP-Adresse desapp-Servers mitcurl zu erreichen. Stellen Sie sicher, dass SieAPP_PRIVATE_IP_ADDRESS und den Port durch die private IP-Adresse desapp-Servers und den Port ersetzen, wenn Sie ihn geändert haben:

curl http://APP_PRIVATE_IP_ADDRESS:8080

Wenn die folgende Ausgabe angezeigt wird, funktioniert die Anwendung ordnungsgemäß und überwacht die richtige IP-Adresse und den richtigen Port:

Output:Hello 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 IP-Adresse und den richtigen Port überwacht.

Stellen Sie sicher, dass Sie die Anwendung auf dem Server vonappbeenden (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 als Dienst).

Wir werden Node Packaged Modules (NPM) verwenden, einen Paketmanager für Node-Module, der mit Node.js installiert wird, um PM2 auf dem Server vonappzu installieren. Verwenden Sie diesen Befehl, um PM2 zu installieren:

sudo npm install pm2 -g

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:┌──────────┬────┬──────┬──────┬────────┬───────────┬────────┬────────────┬──────────┐
│ App name │ id │ mode │ PID  │ status │ restarted │ uptime │     memory │ watching │
├──────────┼────┼──────┼──────┼────────┼───────────┼────────┼────────────┼──────────┤
│ hello    │ 0  │ fork │ 5871 │ online │         0 │ 0s     │ 9.012 MB   │ disabled │
└──────────┴────┴──────┴──────┴────────┴───────────┴────────┴────────────┴──────────┘

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, 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 Fallubuntu:

pm2 startup ubuntu

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

Output:[PM2] You have to run this command as root
[PM2] Execute the following command :
[PM2] sudo su -c "env PATH=$PATH:/opt/node/bin pm2 startup ubuntu -u sammy --hp /home/sammy"

Führen Sie den Befehl aus, der generiert wurde (ähnlich wie bei der oben hervorgehobenen Ausgabe), um PM2 für den Start beim Start einzurichten (verwenden Sie den Befehl von Ihrer eigenen Ausgabe):

 sudo su -c "env PATH=$PATH:/opt/node/bin pm2 startup ubuntu -u sammy --hp /home/sammy"

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 example

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

pm2 restart example

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 Reverse Proxy Server ein

Nachdem Ihre Anwendung ausgeführt wird und eine private IP-Adresse abgehört wird, 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 ein Nginx-Server-Setup haben, können Sie denlocation-Block einfach in den Serverblock Ihrer Wahl kopieren (stellen Sie sicher, dass der Speicherort nicht mit dem vorhandenen Inhalt Ihres Webservers in Konflikt steht).

Aktualisieren Sie auf dem Server vonwebdie apt-get-Paketlisten mit diesem Befehl:

sudo apt-get update

Dann installiere Nginx mit apt-get:

sudo apt-get install nginx

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

sudo vi /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 Direktiveserver_name(oder die IP-Adresse, wenn Sie keine Domain eingerichtet haben) durch Ihren eigenen Domainnamen und dieAPP_PRIVATE_IP_ADDRESS durch die private IP-Adresse desapp-Servers ersetzen . Ändern Sie außerdem den Port (8080), wenn Ihre Anwendung so eingestellt ist, dass sie einen anderen Port überwacht:

/etc/nginx/sites-available/default

server {
    listen 80;

    server_name example.com;

    location / {
        proxy_pass http://APP_PRIVATE_IP_ADDRESS: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 vonwebo konfiguriert, dass er auf Anforderungen im Stammverzeichnis reagiert. Angenommen, unser Server ist beiexample.com verfügbar, würde der Zugriff aufhttp://example.com/ über einen Webbrowser die Anfrage an die private IP-Adresse des Anwendungsservers an Port8080 senden, die von der empfangen und beantwortet wird Node.js Anwendung.

Sie können demselben Serverblock zusätzlichelocation-Blöcke hinzufügen, um Zugriff auf andere Anwendungen auf demselbenweb-Server zu erhalten. Wenn Sie beispielsweise auch eine andere Node.js-Anwendung auf demapp-Server auf Port8081 ausführen, können Sie diesen Standortblock hinzufügen, um den Zugriff überhttp://example.com/app2 zu ermöglichen:

Nginx-Konfiguration - Zusätzliche Standorte

    location /app2 {
        proxy_pass http://APP_PRIVATE_IP_ADDRESS: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.

Starten Sie Nginx auf dem Server vonwebneu:

sudo service nginx restart

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

Fazit

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

Wenn Sie Übertragungen zwischen Ihrem Webserver und Ihren Benutzern verschlüsseln möchten, geben Siehere is a tutorial that will help you get HTTPS (TLS/SSL) support set up an.