Wie lässt man am besten eine NodeJS App auf einem Server laufen? Lange Zeit nutzte ich dafür einfach den „screen“ Befehl, welcher überhaupt keine Prozessüberwachung oder ähnliches hatte. Der nächste Versuch war „forever“, was nun dafür sorgte der Prozess, sollte er denn sterben, automatisch neu gestartet wird.
Aber die beste Lösung die ich finden konnte war „pm2„. Der „Advanced, production process manager for Node.js“ bietet neben Prozessüberwachung auch Unterstützung für Load Balancing, Logfile Management, Git Pull, uvm.
Installiert wird pm2 sehr einfach mit
> npm install pm2 -g
Unsere NodeJS Applikation kann dann gestartet werden:
> pm2 start app.js
Das meiste ist damit auch schon passiert. Pm2 kümmert führt die App nun aus und startet sie bei Bedarf neu.
Alle Prozesse auflisten lassen kann man mit
> pm2 list
![List](storage/list.PNG)
Details zu einem bestimmten Prozess bekommt man durch die Eingabe von
> pm2 show appName/appId
![Info](storage/info.PNG)
Und eine Überwachung aller Prozesse kann man sich so anzeigen lassen
> pm2 monit
![Monit](storage/monit.PNG)
Besonders überzeugt hat mich pm2 wenn man Load Balancing einsetzen möchte. Dazu muss man die App lediglich mit einem weiteren Parameter starten:
> pm2 start app.js -i 4
Mit „-i 4“ wird pm2 angewiesen 4 Workerinstanzen der Applikation zu starten. Die Anzahl der Worker kann man jederzeit mit
> pm2 scale appName 2
ändern (in dem Fall wird die Workeranzahl auf 2 reduziert).
Das schöne dabei ist dass pm2 sich um das Clustering kümmert. Man muss also in der NodeJS App keine Load Balancing Funktion, das so genannte „Clustering“ übernimmt komplett pm2.
Das bedeutet dieser Code wird dabei überflüssig:
var cluster = require('cluster');
var http = require('http');
var os = require('os');
var numCPUs = os.cpus().length;
if (cluster.isMaster) {
// Master:
// Let's fork as many workers as you have CPU cores
for (var i = 0; i < numCPUs; ++i) {
cluster.fork();
}
} else {
// Worker:
// Let's spawn a HTTP server
// (Workers can share any TCP connection.
// In this case its a HTTP server)
http.createServer(function(req, res) {
res.writeHead(200);
res.end("hello world");
}).listen(8080);
}
Sondern man kann sich auf das wesentliche konzentrieren:
var http = require('http');
http.createServer(function(req, res) {
res.writeHead(200);
res.end("hello world");
}).listen(8080);
Hinterlasse jetzt einen Kommentar