Es ist ein Server, ja.
Eine node.js-Webanwendung ist genau wie Nginx oder Apache ein vollwertiger Webserver.
Sie können Ihre node.js-Anwendung tatsächlich ohne Verwendung eines anderen Webservers bereitstellen. Ändern Sie einfach Ihren Code in:
app = express();
http.createServer(app).listen(80);
In der Tat verwenden einige Projekte node.js als Front-End- Load-Balancer für andere Server (einschließlich Apache).
Beachten Sie, dass node.js nicht der einzige Entwicklungsstapel ist, der dies tut. Webentwicklungs-Frameworks in Go, Java und Swift tun dies ebenfalls.
Warum?
Am Anfang war der CGI. CGI war in Ordnung und funktionierte einwandfrei. Apache würde eine Anfrage erhalten, feststellen, dass die URL eine CGI-App ausführen muss, diese CGI-App ausführen und Daten als Umgebungsvariablen übergeben, die Standardausgabe lesen und die Daten an den Browser zurücksenden.
Das Problem ist, dass es langsam ist. Es ist in Ordnung, wenn die CGI-App ein kleines statisch kompiliertes C-Programm war, aber eine Gruppe kleiner statisch kompilierter C-Programme schwer zu warten war. Also fingen die Leute an, in Skriptsprachen zu schreiben. Dann wurde es schwierig, dies aufrechtzuerhalten, und die Leute begannen, objektorientierte MVC-Frameworks zu entwickeln. Jetzt hatten wir Probleme - JEDE ANFRAGE muss all diese Klassen kompilieren und all diese Objekte erstellen, nur um etwas HTML bereitzustellen, auch wenn nichts Dynamisches zu bedienen ist (weil das Framework herausfinden muss, dass es nichts Dynamisches zu bedienen gibt).
Was ist, wenn wir nicht bei jeder Anfrage alle diese Objekte erstellen müssen?
Das dachten die Leute. Und aus dem Versuch, dieses Problem zu lösen, gingen mehrere Strategien hervor. Eine der frühesten bestand darin, Dolmetscher wie mod_php
in Apache direkt in Webserver einzubetten . Kompilierte Klassen und Objekte können in globalen Variablen gespeichert und daher zwischengespeichert werden. Eine andere Strategie bestand darin, eine Vorkompilierung durchzuführen. Eine weitere Strategie bestand darin, die Anwendung als regulären Serverprozess auszuführen und mit dem Webserver über ein benutzerdefiniertes Protokoll wie FastCGI zu kommunizieren.
Dann haben einige Entwickler einfach HTTP als App-> Server-Protokoll verwendet. Tatsächlich ist die App auch ein HTTP-Server. Dies hat den Vorteil, dass Sie kein neues, möglicherweise fehlerhaftes, möglicherweise nicht getestetes Protokoll implementieren müssen und Ihre App direkt über einen Webbrowser (oder auch häufig curl
) debuggen können . Und Sie benötigen keinen modifizierten Webserver, um Ihre App zu unterstützen, sondern nur einen Webserver, der Reverse Proxy oder Weiterleitungen durchführen kann.
Warum Apache / Nginx verwenden?
Wenn Sie eine node.js-App bereitstellen, beachten Sie, dass Sie der Autor Ihres eigenen Webservers sind. Jeder potenzielle Fehler in Ihrer App ist ein direkt ausnutzbarer Fehler im Internet. Einige Leute fühlen sich (zu Recht) damit nicht wohl.
Wenn Sie eine Apache- oder Nginx-Schicht vor Ihrer node.js-App hinzufügen, steht Ihnen im Live-Internet eine kampferprobte, sicherheitsgehärtete Software als Schnittstelle zu Ihrer App zur Verfügung. Es fügt ein kleines bisschen Latenz hinzu (das Reverse Proxy), aber die meisten halten es für lohnenswert.
Dies war in den frühen Tagen von node.js der Standardratschlag. Heutzutage gibt es aber auch Websites und Webdienste, die node.js direkt dem Internet zugänglich machen. Das http.Server
Modul ist jetzt im Internet ziemlich gut kampferprobt, um vertrauenswürdig zu sein.
Isn't it true that a Node.js based server (i.e. code) will still be placed within something like Nginx to run?
Nein, das ist falsch