node.js selbst oder nginx Frontend zum Bereitstellen statischer Dateien?

90

Gibt es einen Benchmark oder Vergleich, der schneller ist: Platzieren Sie nginx vor dem Knoten und lassen Sie es statische Dateien direkt bereitstellen oder verwenden Sie nur den Knoten und stellen Sie statische Dateien damit bereit?

Nginx-Lösung scheint für mich überschaubarer zu sein, irgendwelche Gedanken?

artvolk
quelle
3
Ich würde sagen, es hängt auch von der Menge an Konfiguration und Code ab, die Sie schreiben müssen, um einen Server über dem anderen zu verwenden. Wenn Sie nicht mit einem Börsengang rechnen und Ihr App-Server bereits konfiguriert ist und alles tut, was Sie brauchen, können Sie einfach so lange dabei bleiben, bis es nicht mehr ausreicht.
m33lky

Antworten:

118

Ich muss den Antworten hier nicht zustimmen. Während Node gut funktioniert, ist Nginx bei korrekter Konfiguration definitiv schneller. nginx wird in C effizient nach einem ähnlichen Muster (nur bei Bedarf zu einer Verbindung zurückkehren) mit einem winzigen Speicherbedarf implementiert. Darüber hinaus unterstützt es den sendfile-Systemaufruf , um diese Dateien bereitzustellen , was so schnell wie möglich beim Bereitstellen von Dateien möglich ist, da der Betriebssystemkern selbst die Aufgabe übernimmt .

Mittlerweile ist Nginx als Frontend-Server de facto zum Standard geworden. Sie können es für seine Leistung verwenden, um später statische Dateien, gzip, SSL und sogar den Lastenausgleich bereitzustellen.

PS: Dies setzt voraus, dass die Dateien zum Zeitpunkt der Anforderung wirklich "statisch" sind, da sie sich im Ruhezustand auf der Festplatte befinden.

m33lky
quelle
7
Nur eine kleine Anmerkung: node.js unterstützt auch sendfile- aber es scheint, dass Sie Code schreiben müssen, siehe z. blog.std.in/2010/09/09/using-sendfile-with-nodejs
tuomassalo
Warum ist die Leistung von Nginx außerhalb der Bereitstellung statischer Inhalte besser, als nur den Hauptwebserver (Tomcat / Jetty / IIS usw.) in der öffentlich zugänglichen Domäne verfügbar zu machen?
Raffian
1
Wenn eine Anfrage an Ihre App gestellt wird, wird diese Anfrage nicht auf magische Weise schneller gestellt, indem sie zuerst über nginx geleitet wird (sie kann im besten Fall spürbar schneller sein, wenn nginx statisches CSS und js, gzip und SSL verarbeitet). Nginx ist jedoch auch einer der besten Software-Load-Balancer. Dies kann daher von entscheidender Bedeutung sein, da die meisten Server dafür berüchtigt sind, bei mäßig hohen Lasten auszufallen.
m33lky
Sie können die Dateien jedoch mit Node.js asynchron bedienen. Schaffst du das mit NGINX?
Dragos C.
1
@lwansbrough bringen diese Benchmarks auf den Tisch. Mindestens eine Person in diesem Thema hat selbst experimentiert.
m33lky
73

Ich habe schnell ab -n 10000 -c 100ein statisches 1406-Byte favicon.icobereitgestellt und nginx, Express.js (statische Middleware) und gruppierte Express.js verglichen. Hoffe das hilft:

Geben Sie hier die Bildbeschreibung ein

Leider kann ich nicht 1000 oder sogar 10000 gleichzeitige Anforderungen testen, da nginx auf meinem Computer Fehler auslöst.

BEARBEITEN : Wie von artvolk vorgeschlagen, sind hier die Ergebnisse von Cluster + staticMiddleware (langsamer):

Geben Sie hier die Bildbeschreibung ein

Gremo
quelle
Vielen Dank, sehr hilfreich! Haben Sie diese Middleware für favicon : senchalabs.org/connect/favicon.html verwendet oder nur als statische Datei bereitgestellt ?
Artvolk
@ Artvolk das Favicon ein :)
Gremo
3
Haben Sie NODE_ENV = Produktion für die Tests festgelegt? Denn das würde einen unglaublichen Unterschied machen, da die Caching- staticMiddleware in der Produktion funktioniert.
Ruffrey
19
Für diejenigen unter Ihnen, die kein Italienisch sprechen, ist die x-Achse die Anzahl der Anforderungen, und die Y-Achse ist die Anzahl der ms, die für die Bereitstellung der Datei benötigt wurden. Ich musste das googeln übersetzen, weil ich sicherstellen wollte, dass ich die Daten nicht falsch las. Diese Daten waren unglaublich hilfreich und ich schätze den Benchmark-Test hier sehr. wird immerhin
JL Griffin
1
War NODE_ENV = Produktion eingestellt?
K - Die Toxizität in SO nimmt zu.
11

Ich habe eine andere Interpretation der Diagramme von @ gremo. Es sieht für mich so aus, als ob sowohl die Knoten- als auch die Nginx-Skala bei der gleichen Anzahl von Anforderungen (zwischen 9 und 10 KB) skaliert. Sicher, die Latenz in der Antwort für Nginx ist um konstante 20 ms geringer, aber ich glaube nicht, dass Benutzer diesen Unterschied unbedingt wahrnehmen werden (wenn Ihre App gut erstellt ist). Bei einer festgelegten Anzahl von Maschinen würde es eine beträchtliche Menge an Last erfordern, bevor ich eine Knotenmaschine in Nginx konvertieren würde, wenn man bedenkt, dass an diesem Knoten der größte Teil der Last an erster Stelle auftritt. Der einzige Kontrapunkt dazu ist, wenn Sie Nginx bereits eine Maschine für den Lastausgleich widmen. Wenn dies der Fall ist, können Sie es auch für Ihren statischen Inhalt verwenden.

ssotangkur
quelle
1
"Sicher, die Latenz in der Antwort für Nginx ist um konstante 20 ms niedriger, aber ich glaube nicht, dass Benutzer diesen Unterschied unbedingt wahrnehmen werden"? Ich hoffe ernsthaft, dass ihr das nicht tut. Es gibt Hinweise darauf, dass Benutzer einen Unterschied von 1 ms wahrnehmen!
Navin
4
Zitat benötigt
David Burrows
9

In beiden Fällen würde ich Nginx so einrichten, dass die statischen Dateien zwischengespeichert werden einrichten, dass werden. Dort sehen Sie einen RIESIGEN Unterschied. Unabhängig davon, ob Sie sie vom Knoten aus bedienen oder nicht, erhalten Sie im Grunde die gleiche Leistung und Entlastung für Ihre Knoten-App.

Ich persönlich mag die Idee nicht, dass mein Nginx-Frontend in den meisten Fällen statische Assets bereitstellt

1) Das Projekt muss sich jetzt auf demselben Computer befinden - oder in Assets (auf einem Nginx-Computer) und einer Web-App (auf mehreren Computern zur Skalierung) aufgeteilt werden.

2) Die Nginx-Konfiguration muss jetzt die Pfadpositionen für statische Assets pflegen / neu laden, wenn sie sich ändern.

Will Stern
quelle
1

Das ist eine schwierige Frage. Wenn Sie einen wirklich leichten Knotenserver geschrieben haben, der nur statische Dateien bereitstellt, ist die Leistung wahrscheinlich besser als bei Nginx, aber so einfach ist das nicht. ( Hier ist ein "Benchmark" zum Vergleichen eines NodeJS-Dateiservers und von LightTPD - ähnlich wie Ngingx beim Bereitstellen statischer Dateien).

Die Leistung beim Bereitstellen statischer Dateien hängt häufig von mehr als nur dem Webserver ab, der die Arbeit erledigt. Wenn Sie die höchstmögliche Leistung erzielen möchten, verwenden Sie ein CDN, um Ihre Dateien bereitzustellen, um die Latenz für Endbenutzer zu verringern und vom Edge-Caching zu profitieren.

Wenn Sie sich darüber keine Sorgen machen, kann der Knoten in den meisten Situationen statische Dateien bereitstellen. Der Knoten eignet sich für asynchronen Code, auf den er sich auch stützt, da er Single-Threaded ist und blockierende E / A den gesamten Prozess blockieren und die Leistung Ihrer Anwendungen beeinträchtigen können. Höchstwahrscheinlich schreiben Sie Ihren Code nicht blockierend. Wenn Sie jedoch etwas synchron ausführen, kann dies zu Blockierungen führen, die die Geschwindigkeit beeinträchtigen, mit der andere Clients ihre statischen Dateien bereitstellen können. Die einfache Lösung besteht darin, keinen blockierenden Code zu schreiben, aber manchmal ist dies nicht möglich, oder Sie können ihn nicht immer durchsetzen.

Brad Harris
quelle
8
Das ist alles Unsinn. Diese Frage bezieht sich auf Nginx, nicht auf Apache. Sowohl nginx als auch node verwenden libev für ihre Ereignisschleife. Nginx wird um ein Vielfaches schneller sein als der Knoten. Einer von ihnen hat nicht den Overhead einer VM und wurde speziell für diesen Vorgang in Ihrem Dateisystem geschrieben.
Evan Carroll
1
libev war früher Knoten. Libuv hat diese Rolle übernommen, damit der Knoten plattformübergreifend ausgeführt werden kann.
tsturzl
1
Ich sehe nicht, wie asynchroner Code dazu beiträgt. Die Leistung von Node ist weitaus schlechter als die von Nginx und wahrscheinlich auf die Blockierung von E / A zurückzuführen, auf die Sie stoßen würden, wenn mehrere Clients Sie auffordern, Dateien von der Festplatte zu lesen. Es wird empfohlen, Nginx immer für statische Assets zu verwenden, damit Ihre Node-App die Anwendungslogik verarbeiten kann. Wir könnten über theoretische Szenarien sprechen, in denen Node besser
abschneiden
-10

Ich bin sicher, dass rein node.js Nginx in vielerlei Hinsicht übertreffen kann.

Alles in allem muss ich bleiben NginX hat einen eingebauten Cache, während node.js nicht werkseitig installiert ist (SIE MÜSSEN IHREN EIGENEN DATEI-CACHE ERSTELLEN). Der benutzerdefinierte Dateicache übertrifft Nginx und jeden anderen Server auf dem Markt, da er sehr einfach ist.

Auch Nginx läuft auf mehreren Kernen. Um das volle Potenzial von Node auszuschöpfen, müssen Sie Knotenserver gruppieren. Wenn Sie interessiert sind, wie dann bitte pm.

Sie müssen tief graben, um Leistungsnirvana mit Knoten zu erreichen, das ist das einzige Problem. Einmal fertig, ja ... es schlägt Nginx.

user2379441
quelle
1
Sie müssen einige Fakten mitbringen, da ich glauben möchte, was Sie sagen, aber Benchmarks benötigen, wenn sie auf der realen Welt basieren, großartig! aber keine
Randfälle
5
Das Lustige ist, dass diese Antwort so viele Fakten enthält wie die gewählte Antwort mit den meisten Stimmen. Ich denke, die Leute bevorzugen einfach einen Webserver im Vordergrund, weil ihnen so beigebracht wurde, dies in [andere Webanwendungstechnologien einfügen] zu tun. Dies ist keine gute Antwort, aber +1 aus Mitleid.