Node.js
Bereitstellen von Node.js-Anwendungen in der Produktion
Suche…
NODE_ENV = "Produktion" einstellen
Produktionsbereitstellungen variieren in vielerlei Hinsicht. Eine Standardkonvention bei der Bereitstellung in der Produktion besteht darin, eine Umgebungsvariable namens NODE_ENV
zu definieren und den Wert auf "Produktion" zu setzen .
Laufzeitflags
Jeder in Ihrer Anwendung ausgeführte Code (einschließlich externer Module) kann den Wert von NODE_ENV
:
if(process.env.NODE_ENV === 'production') {
// We are running in production mode
} else {
// We are running in development mode
}
Abhängigkeiten
Wenn die Umgebungsvariable NODE_ENV
auf 'production' gesetzt ist, werden alle devDependencies
in Ihrer package.json- Datei beim Ausführen von npm install
vollständig ignoriert. Sie können dies auch mit einem --production
Flag --production
:
npm install --production
Zur Einstellung von NODE_ENV
Sie eine dieser Methoden verwenden
Methode 1: Setze NODE_ENV für alle Knoten-Apps
Windows:
set NODE_ENV=production
Linux oder anderes Unix-basiertes System:
export NODE_ENV=production
Dadurch wird NODE_ENV
für die aktuelle Bash-Sitzung festgelegt. NODE_ENV
für alle Apps, die nach dieser Anweisung gestartet werden, NODE_ENV
auf production
.
Methode 2: Setze NODE_ENV für die aktuelle App
NODE_ENV=production node app.js
Dadurch wird NODE_ENV
für die aktuelle App festgelegt. Dies ist hilfreich, wenn wir unsere Apps in verschiedenen Umgebungen testen möchten.
Methode 3: Erstellen .env
eine .env
Datei und verwenden Sie sie
Hierfür wird die hier erläuterte Idee verwendet. In diesem Beitrag finden Sie eine ausführlichere Erklärung.
Grundsätzlich erstellen Sie eine .env
Datei und führen ein bash-Skript aus, um sie in der Umgebung .env
.
Um das Schreiben eines Bash-Skripts zu vermeiden, können Sie mit dem Paket env- .env
die in der .env
Datei definierten Umgebungsvariablen .env
.
env-cmd .env node app.js
Methode 4: Verwenden Sie das cross-env
Paket
Mit diesem Paket können Umgebungsvariablen für jede Plattform auf eine Weise festgelegt werden.
Nach der Installation mit npm können Sie es package.json
wie folgt zu Ihrem Bereitstellungsskript in package.json
hinzufügen:
"build:deploy": "cross-env NODE_ENV=production webpack"
App mit dem Prozessmanager verwalten
Es ist empfehlenswert, NodeJS-Apps, die von Prozessmanagern gesteuert werden, auszuführen. Der Prozessmanager hilft, die Anwendung für immer am Leben zu erhalten, bei einem Neustart neu zu starten, ohne Ausfallzeiten neu zu laden und die Verwaltung zu vereinfachen. Die leistungsstärksten von ihnen (wie PM2 ) verfügen über einen integrierten Lastausgleich. Mit PM2 können Sie auch Anwendungsprotokollierung, -überwachung und -cluster verwalten.
PM2-Prozessmanager
PM2 installieren:
npm install pm2 -g
Der Prozess kann im Cluster-Modus mit integriertem Load Balancer gestartet werden, um die Last zwischen den Prozessen zu verteilen:
pm2 start app.js -i 0 --name "api"
( -i gibt die Anzahl der zu pm2 start app.js -i 0 --name "api"
Prozesse an. Wenn es 0 ist, basiert die Prozessnummer auf der CPU-Kernenanzahl)
Bei mehreren Benutzern in der Produktion muss es für PM2 einen einzigen Punkt geben. Dem pm2-Befehl muss daher ein Speicherort vorangestellt werden (für die PM2-Konfiguration). Andernfalls wird für jeden Benutzer mit der Konfiguration in dem entsprechenden Basisverzeichnis ein neuer pm2-Prozess erzeugt. Und es wird inkonsistent sein.
Verwendung: PM2_HOME=/etc/.pm2 pm2 start app.js
Bereitstellung mit PM2
PM2
ist ein Produktionsprozessmanager für Node.js
Anwendungen, mit dem Sie Anwendungen für immer am Leben erhalten und ohne Ausfallzeiten neu laden können. Mit PM2 können Sie auch Anwendungsprotokollierung, -überwachung und -cluster verwalten.
Installieren Sie pm2
global.
npm install -g pm2
Führen Sie dann die node.js
App mit PM2.
pm2 start server.js --name "my-app"
Die folgenden Befehle sind nützlich, wenn Sie mit PM2
.
Alle laufenden Prozesse auflisten:
pm2 list
Stoppen Sie eine App:
pm2 stop my-app
App neu starten:
pm2 restart my-app
So zeigen Sie detaillierte Informationen zu einer App an:
pm2 show my-app
So entfernen Sie eine App aus der Registrierung von PM2:
pm2 delete my-app
Bereitstellung mit dem Prozessmanager
Prozessmanager wird im Allgemeinen in der Produktion verwendet, um eine nodejs-App bereitzustellen. Die Hauptfunktionen eines Prozessmanagers sind ein Neustart des Servers bei einem Absturz, Überprüfen des Ressourcenverbrauchs, Verbesserung der Laufzeitleistung, Überwachung usw.
Einige der populärsten Prozessmanager, die von der Knoten-Community erstellt werden, sind für immer PM2 usw.
Forvever
forever
ist ein Befehlszeilenschnittstellentool, um sicherzustellen, dass ein bestimmtes Skript kontinuierlich ausgeführt wird. Die einfache Benutzeroberfläche von forever
macht es ideal für kleinere Implementierungen von Node.js
Apps und -Skripts.
forever
überwacht Ihren Prozess und startet ihn neu, wenn er abstürzt.
Für forever
global installieren.
$ npm install -g forever
Anwendung ausführen:
$ forever start server.js
Dadurch wird der Server gestartet und eine ID für den Prozess angegeben (beginnt bei 0).
Applikation neustarten :
$ forever restart 0
Hier ist 0
die ID des Servers.
Anwendung stoppen:
$ forever stop 0
Ähnlich wie beim Neustart ist 0
die ID des Servers. Sie können auch eine Prozess-ID oder einen Skriptnamen anstelle der von forever angegebenen ID eingeben.
Für weitere Befehle: https://www.npmjs.com/package/forever
Verwenden verschiedener Eigenschaften / Konfigurationen für verschiedene Umgebungen wie dev, qa, staging usw.
Große Anwendungen erfordern oft unterschiedliche Eigenschaften, wenn sie in unterschiedlichen Umgebungen ausgeführt werden. Wir können dies erreichen, indem Sie Argumente an die NodeJs-Anwendung übergeben und dasselbe Argument im Node-Prozess verwenden, um bestimmte Umgebungseigenschaftsdateien zu laden.
Angenommen, wir haben zwei Eigenschaftsdateien für unterschiedliche Umgebungen.
dev.json
{ "PORT": 3000, "DB": { "host": "localhost", "user": "bob", "password": "12345" } }
qa.json
{ "PORT": 3001, "DB": { "host": "where_db_is_hosted", "user": "bob", "password": "54321" } }
Der folgende Code in der Anwendung wird die entsprechende Eigenschaftsdatei exportieren, die wir verwenden möchten.
process.argv.forEach(function (val) {
var arg = val.split("=");
if (arg.length > 0) {
if (arg[0] === 'env') {
var env = require('./' + arg[1] + '.json');
exports.prop = env;
}
}
});
Wir geben der Bewerbung folgende Argumente
node app.js env=dev
Wenn wir Prozessmanager für immer verwenden, dann ist es so einfach wie
forever start app.js env=dev
Cluster nutzen
Eine einzelne Instanz von Node.js wird in einem einzelnen Thread ausgeführt. Um Multi-Core-Systeme zu nutzen, möchte der Benutzer manchmal ein Cluster von Node.js-Prozessen starten, um die Last zu handhaben.
var cluster = require('cluster');
var numCPUs = require('os').cpus().length;
if (cluster.isMaster) {
// In real life, you'd probably use more than just 2 workers,
// and perhaps not put the master and worker in the same file.
//
// You can also of course get a bit fancier about logging, and
// implement whatever custom logic you need to prevent DoS
// attacks and other bad behavior.
//
// See the options in the cluster documentation.
//
// The important thing is that the master does very little,
// increasing our resilience to unexpected errors.
console.log('your server is working on ' + numCPUs + ' cores');
for (var i = 0; i < numCPUs; i++) {
cluster.fork();
}
cluster.on('disconnect', function(worker) {
console.error('disconnect!');
//clearTimeout(timeout);
cluster.fork();
});
} else {
require('./app.js');
}