Einrichten einer Node.js-Anwendung für die Produktion unter Rocky Linux 9

Einführung

Node.js ist eine Open-Source-JavaScript-Laufzeitumgebung zum Erstellen von serverseitigen und netzwerkbasierten Anwendungen. Die Plattform läuft auf Linux, macOS, FreeBSD und Windows. Obwohl Sie Node.js-Anwendungen über die Befehlszeile ausführen können, konzentriert sich dieses Tutorial darauf, sie als Dienst auszuführen. Dies bedeutet, dass sie bei Neustart oder Fehler neu gestartet werden und sicher für den Einsatz in einer Produktionsumgebung sind.

In diesem Tutorial richten Sie eine produktionsfähige Node.js-Umgebung auf einem einzelnen Rocky Linux 9-Server ein. Dieser Server wird eine von PM2 verwaltete Node.js-Anwendung ausführen und den Benutzern über einen Nginx-Reverse-Proxy einen sicheren Zugriff auf die Anwendung ermöglichen. Der Nginx-Server wird HTTPS mithilfe eines kostenlosen Zertifikats von Let’s Encrypt anbieten.

Voraussetzungen

Dieses Handbuch setzt voraus, dass Sie folgendes haben:

Wenn Sie die Voraussetzungen abgeschlossen haben, haben Sie einen Server, der die Standardplatzhalterseite Ihrer Domain unter https://example.com/ bedient.

Schritt 1 — Erstellen einer Node.js-Anwendung

Lassen Sie uns eine Hello World-Anwendung schreiben, die „Hello World“ auf jede HTTP-Anfrage zurückgibt. Diese Beispielanwendung hilft Ihnen dabei, mit Node.js zu starten. Sie können sie durch Ihre eigene Anwendung ersetzen — stellen Sie nur sicher, dass Sie Ihre Anwendung so ändern, dass sie auf den entsprechenden IP-Adressen und Ports hört.

Der Standard-Texteditor, der mit Rocky Linux 9 geliefert wird, ist vi. vi ist ein extrem leistungsstarker Texteditor, kann jedoch für Benutzer, die keine Erfahrung damit haben, etwas umständlich sein. Sie könnten einen benutzerfreundlicheren Editor wie nano installieren, um das Bearbeiten von Konfigurationsdateien auf Ihrem Rocky Linux 9-Server zu erleichtern:

  1. sudo dnf install nano

Jetzt erstellen Sie mit nano oder Ihrem bevorzugten Texteditor eine Beispielanwendung namens hello.js:

  1. 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 verlassen Sie den Editor. Wenn Sie nano verwenden, drücken Sie Strg+X, dann, wenn Sie dazu aufgefordert werden, Y und dann Enter.

Diese Node.js-Anwendung hört auf die angegebene Adresse (localhost) und Port (3000) und gibt „Hello World!“ mit einem 200 HTTP-Statuscode zurück. Da wir auf localhost hören, können entfernte Clients keine Verbindung zu unserer Anwendung herstellen.

Um Ihre Anwendung zu testen, geben Sie Folgendes ein:

  1. node hello.js

Sie erhalten die folgende Ausgabe:

Output
Server running at http://localhost:3000/

Hinweis: Das Ausführen einer Node.js-Anwendung auf diese Weise blockiert zusätzliche Befehle, bis die Anwendung durch Drücken von STRG+C beendet wird.

Um die Anwendung zu testen, öffnen Sie eine weitere Terminal-Sitzung auf Ihrem Server und verbinden Sie sich mit localhost mit curl:

  1. curl http://localhost:3000

Wenn Sie die folgende Ausgabe erhalten, funktioniert die Anwendung ordnungsgemäß und hört an der richtigen Adresse und Port:

Output
Hello World!

Wenn Sie nicht die erwartete Ausgabe erhalten, stellen Sie sicher, dass Ihre Node.js-Anwendung ausgeführt wird und so konfiguriert ist, dass sie auf der richtigen Adresse und dem richtigen Port hört.

Sobald Sie sicher sind, dass es funktioniert, beenden Sie die Anwendung (falls noch nicht geschehen), indem Sie STRG+C drücken.

Schritt 2 – Installation von PM2

Als nächstes installieren wir PM2, einen Prozess-Manager für Node.js-Anwendungen. PM2 ermöglicht es, Anwendungen zu daemonisieren, so dass sie im Hintergrund als Dienst ausgeführt werden.

Verwenden Sie npm, um die neueste Version von PM2 auf Ihrem Server zu installieren:

  1. sudo npm install pm2@latest -g

Die Option -g teilt npm mit, das Modul global zu installieren, so dass es systemweit verfügbar ist.

Zuerst verwenden wir den Befehl pm2 start, um Ihre Anwendung, hello.js, im Hintergrund auszuführen:

  1. pm2 start hello.js

Dies fügt Ihre Anwendung auch der Prozessliste von PM2 hinzu, 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. ┌────┬────────────────────┬──────────┬──────┬───────────┬──────────┬──────────┐ │ id │ name │ mode │ ↺ │ status │ cpu │ memory │ ├────┼────────────────────┼──────────┼──────┼───────────┼──────────┼──────────┤ │ 0 │ hello │ fork │ 0 │ online │ 0% │ 25.2mb │ └────┴────────────────────┴──────────┴──────┴───────────┴──────────┴──────────┘

Wie oben angegeben, weist PM2 automatisch einen App-Namen zu (basierend auf dem Dateinamen, ohne die Erweiterung .js) und eine PM2-ID zu. PM2 verwaltet auch andere Informationen wie die PID des Prozesses, seinen aktuellen Status und die Speicherauslastung.

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 unternehmen, um die Anwendung beim Systemstart mithilfe des Unterbefehls startup zu starten. Dieser Unterbefehl generiert und konfiguriert ein Startskript, um PM2 und seine verwalteten Prozesse beim Serverstart zu starten:

  1. pm2 startup systemd
Output
… [PM2] To setup the Startup Script, copy/paste the following command: sudo env PATH=$PATH:/usr/bin /usr/local/lib/node_modules/pm2/bin/pm2 startup systemd -u sammy --hp /home/sammy

Kopieren und führen Sie den bereitgestellten Befehl aus (dies dient dazu, Berechtigungsprobleme bei der Ausführung von Node.js-Tools als sudo zu vermeiden):

  1. sudo env PATH=$PATH:/usr/bin /usr/local/lib/node_modules/pm2/bin/pm2 startup systemd -u sammy --hp /home/sammy
Output
… [ 'systemctl enable pm2-sammy' ] [PM2] Writing init configuration in /etc/systemd/system/pm2-sammy.service [PM2] Making script booting at startup... [PM2] [-] Executing: systemctl enable pm2-sammy... Created symlink /etc/systemd/system/multi-user.target.wants/pm2-sammy.service → /etc/systemd/system/pm2-sammy.service. [PM2] [v] Command successfully executed. +---------------------------------------+ [PM2] Freeze a process list on reboot via: $ pm2 save [PM2] Remove init script via: $ pm2 unstartup systemd

Jetzt müssen Sie eine Änderung am Systemd-Dienst vornehmen, der gerade erstellt wurde, um ihn mit dem SELinux-Sicherheitssystem von Rocky Linux kompatibel zu machen. Öffnen Sie mit nano oder Ihrem bevorzugten Texteditor /etc/systemd/system/pm2-sammy.service:

  1. sudo nano /etc/systemd/system/pm2-sammy.service

Ersetzen Sie im [Service]-Block der Konfigurationsdatei den Inhalt der PIDFile-Einstellung durch /run/pm2.pid, wie unten hervorgehoben, und fügen Sie die andere hervorgehobene Environment-Zeile hinzu:

/etc/systemd/system/pm2-sammy.service
[Unit]
Description=PM2 process manager
Documentation=https://pm2.keymetrics.io/
After=network.target

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

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

[Install]

Speichern und schließen Sie die Datei. Sie haben nun eine systemd Unit erstellt, die pm2 beim Booten für Ihren Benutzer ausführt. Diese pm2-Instanz führt wiederum hello.js aus.

Starten Sie den Dienst mit systemctl:

  1. sudo systemctl start pm2-sammy

Überprüfen Sie den Status der systemd-Einheit:

  1. systemctl status pm2-sammy

Für einen detaillierten Überblick über systemd lesen Sie bitte Systemd Essentials: Arbeiten mit Diensten, Einheiten und dem Journal.

Neben den von uns behandelten bietet PM2 viele Unterbefehle, mit denen Sie Ihre Anwendungen verwalten oder Informationen über sie abrufen können.

Beenden Sie eine Anwendung mit diesem Befehl (geben Sie den PM2 App-Namen oder die id an):

  1. pm2 stop app_name_or_id

Starten Sie eine Anwendung neu:

  1. pm2 restart app_name_or_id

Listen Sie die aktuell von PM2 verwalteten Anwendungen auf:

  1. pm2 list

Erhalten Sie Informationen über eine bestimmte Anwendung anhand ihres App-Namens:

  1. pm2 info app_name

Der PM2-Prozessmonitor kann mit dem monit-Unterbefehl aufgerufen werden. Dies zeigt den Anwendungsstatus, CPU- und Speicherauslastung an:

  1. pm2 monit

Beachten Sie, dass das Ausführen von pm2 ohne Argumente auch eine Hilfeseite mit Beispielnutzung anzeigt.

Jetzt, da Ihre Node.js-Anwendung läuft und von PM2 verwaltet wird, lassen Sie uns den Reverse-Proxy einrichten.

Schritt 3 — Einrichten von Nginx als Reverse-Proxy-Server

Ihre Anwendung läuft und hört auf localhost, aber Sie müssen einen Weg einrichten, damit Ihre Benutzer darauf zugreifen können. Wir werden den Nginx-Webserver als Reverse-Proxy zu diesem Zweck einrichten.

In dem vorherigen Tutorial haben Sie Ihre Nginx-Konfiguration in der Datei /etc/nginx/conf.d/your_domain.conf eingerichtet. Öffnen Sie diese Datei zum Bearbeiten:

  1. sudo nano /etc/nginx/conf.d/your_domain.conf

Innerhalb des server-Blocks sollte bereits ein vorhandener location /-Block vorhanden sein. Ersetzen Sie den Inhalt dieses Blocks durch die folgende Konfiguration. Wenn Ihre Anwendung auf einem anderen Port hört, aktualisieren Sie den markierten Teil mit der richtigen Portnummer:

/etc/nginx/conf.d/your_domain.conf
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;
    }
...
}

Dies konfiguriert den Server so, dass er auf Anfragen an seiner Wurzel antwortet. Unter der Annahme, dass unser Server unter deine_domain verfügbar ist, würde der Zugriff auf https://deine_domain/ über einen Webbrowser die Anfrage an hello.js senden, der auf Port 3000 unter localhost hört.

Sie können zusätzliche location-Blöcke zum selben Serverblock hinzufügen, um den Zugriff auf andere Anwendungen auf demselben Server zu ermöglichen. Wenn Sie beispielsweise eine weitere Node.js-Anwendung auf Port 3001 ausführen würden, könnten Sie diesen Location-Block hinzufügen, um den Zugriff darauf über https://deine_domain/app2 zu erlauben:

/etc/nginx/conf.d/your_domain.conf — 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;
    }
...
}

Sobald Sie die Location-Blöcke für Ihre Anwendungen hinzugefügt haben, speichern Sie die Datei und verlassen Sie Ihren Editor.

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

  1. sudo nginx -t

Starten Sie Nginx neu:

  1. sudo systemctl restart nginx

Unter der Annahme, dass Ihre Node.js-Anwendung läuft und Ihre Anwendungs- und Nginx-Konfigurationen korrekt sind, sollten Sie jetzt über den Nginx-Reverse-Proxy auf Ihre Anwendung zugreifen können. Probieren Sie es aus, indem Sie die URL Ihres Servers (seine öffentliche IP-Adresse oder seinen Domainnamen) aufrufen.

Fazit

Herzlichen Glückwunsch! Ihre Node.js-Anwendung läuft nun hinter einem Nginx-Reverse-Proxy auf einem Rocky Linux 9-Server. Diese Reverse-Proxy-Konfiguration ist flexibel genug, um Ihren Benutzern den Zugriff auf andere Anwendungen oder statische Webinhalte zu ermöglichen, die Sie teilen möchten.

Als nächstes möchten Sie vielleicht in Wie man eine Node.js-Anwendung mit Docker erstellt schauen.

Source:
https://www.digitalocean.com/community/tutorials/how-to-set-up-a-node-js-application-for-production-on-rocky-linux-9