web-dev-qa-db-de.com

Server auf Basis von Node.js im Vergleich zum Apache HTTP-Server

Ich habe vor kurzem Node.js studiert und bin auf etwas Material zum Schreiben von einfachen Node.js-Servern gestoßen. Zum Beispiel...

var express = require("express"),
http = require("http"), app;

// Create our Express-powered HTTP server
// and have it listen on port 3000
app = express();
http.createServer(app).listen(3000);

// set up our routes
app.get("/hello", function (req, res) {
    res.send("Hello World!");
});

app.get("/goodbye", function (req, res) {
    res.send("Goodbye World!");
});

... Nun, obwohl ich scheinbar zu verstehen, was im Code vorgeht, bin ich durch die Terminologie etwas verwirrt ... denn wenn ich den Begriff Server höre, denke ich über Dinge wie Apache oder Nginx nach. Ich bin daran gewöhnt, dass sie wie ein Container aussehen, der meine Webanwendungen aufnehmen kann. Wie unterscheidet sich der Node.js-Server vom Nginx/Apache-Server? Stimmt es nicht, dass ein auf Node.js basierender Server (d. H. Code) immer noch in etwas wie Nginx platziert werden kann, um ausgeführt zu werden? Warum werden beide als "Server" bezeichnet, obwohl der Node.js-Code die Anwendung zu sein scheint, die mit Nginx platziert und bereitgestellt werden kann?.

51
Grateful

Es ist ein Server, ja.

Eine node.js-Webanwendung ist wie Nginx oder Apache ein vollwertiger Webserver.

Sie können Ihre node.js-Anwendung tatsächlich bereitstellen, ohne einen anderen Webserver zu verwenden. Ändern Sie einfach Ihren Code in:

app = express();
http.createServer(app).listen(80); // serve HTTP directly

Tatsächlich 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 Entwicklungsstack ist, der dies ausführt. Das tun auch Web-Entwicklungsframeworks in Go, Java und Swift.

Warum?

Am Anfang war der CGI. CGI war in Ordnung und hat gut funktioniert. Apache würde eine Anfrage erhalten, feststellen, dass die URL zum Ausführen einer CGI-App erforderlich ist, diese CGI-App ausführen und Daten als Umgebungsvariablen übergeben, das Standardauslesegerät lesen und die Daten an den Browser zurückgeben.

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 wurde schwer zu warten. Also begannen die Leute, in Skriptsprachen zu schreiben. Dann wurde es schwierig zu warten und die Leute begannen, objektorientierte MVC-Frameworks zu entwickeln. Jetzt haben wir Probleme bekommen - JEDE ANFRAGE muss alle diese Klassen kompilieren und alle diese Objekte erstellen, um HTML zu bedienen, auch wenn nichts dynamisches zu liefern ist (da das Framework herausfinden muss, dass nichts dynamisches ist).

Was ist, wenn wir nicht alle Objekte für jede Anforderung erstellen müssen?

Das dachten die Leute. Aus dem Versuch, dieses Problem zu lösen, kamen mehrere Strategien. Zu den ersten gehörte es, Dolmetscher direkt in Webserver wie mod_php in Apache einzubetten. Kompilierte Klassen und Objekte können in globalen Variablen gespeichert und somit zwischengespeichert werden. Eine andere Strategie war die Vorbereitung vor der Kompilierung. 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 Sie können Ihre App direkt mit einem Webbrowser debuggen (oder auch häufig curl). Sie benötigen keinen modifizierten Webserver, um Ihre App zu unterstützen, sondern nur einen Webserver, der Reverse Proxying oder Weiterleitungen ausfü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. Manche Menschen fühlen sich (zu Recht) nicht wohl dabei.

Wenn Sie eine Ebene aus Apache oder Nginx vor Ihrer node.js-App hinzufügen, bedeutet dies, dass Sie im Live-Internet eine in der Schlacht getestete, sicherheitsgesicherte Software als Schnittstelle zu Ihrer App haben. Dies führt zu einer geringfügigen Latenzzeit (Reverse-Proxying), aber die meisten halten es für wert.

Dies war in den frühen Tagen von node.js die Standardempfehlung. Aber heutzutage gibt es auch Websites und Webservices, die node.js direkt im Internet verfügbar machen. Das http.Server -Modul ist nun im Internet ziemlich gut getestet, um vertrauenswürdig zu sein.

73
slebetman

NodeJs erstellt einen eigenen Server. Wie Sie sehen, ist die Terminologie ziemlich klar: 

http.createServer(app).listen(3000);

Erstellen Sie einen Server und überwachen Sie HTTP-Anforderungen an Port 3000.

Wir haben in einem unserer Projekte nginx verwendet, aber es war mehr ein Loadbalancer für mehrere nodejs-Instanzen.

Nehmen wir an, Sie haben zwei nodejs-Instanzen, die auf Port 3000 und 3001 ausgeführt werden, Jetzt können Sie nginx weiterhin als Server verwenden, um Ihre tatsächlichen http-Aufrufe auf port 80 abzuhören, und möchten möglicherweise Ihre Anfrage an nodejs-Server oder möglicherweise einen anderen Server umleiten eher wie eine loadbalancer. Sie können also weiterhin das verwenden, was nginx mit nodejs bereitstellt.

Eine gute Frage, die hier bereits gestellt wurde.

10
Naeem Shaikh

Angenommen, es gibt ein Hotel namens Apache Hotel, das für jeden Kunden einen Kellner hat.

Sobald der Kunde einen Salat bestellt, geht der Kellner zum Chef und sagt es ihm. Während der Koch das Essen zubereitet, wartet der Kellner. Hier, 

Chef => File System,

Waiter => Thread,

Customer => Event.

Selbst wenn der Kunde Wasser bestellt, bringt der Kellner ihn erst nach dem Servieren mit dem Salat. Der Kellner wartet solange, bis der Koch den Salat zubereitet. Dieser Zustand wird als Sperrzustand bezeichnet. Selbst wenn das Hotel wächst, sollte jeder Kunde verschiedene Kellner haben. Dies erhöht die Blockierung von Threads (Kellnern).

Jetzt, wenn Sie zum Node Hotel kommen, gibt es nur einen Kellner für alle Kunden. Wenn der erste Kunde Suppe bestellt, teilt der Kellner dem Koch mit und geht zum zweiten Kunden. Nachdem das Essen fertig ist, liefert der Kellner den Kunden. Hier wartet der Kunde nicht. Dieser Zustand wird als nicht blockierender Zustand bezeichnet. Der Single-Kellner (Thread) bedient alle Kunden und macht sie glücklich.

Daher ist der Knoten, der eine einzelne Threadanwendung ist, sehr schnell.

1
Vamshi Krishna