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?
Antworten:
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.
quelle
sendfile
- aber es scheint, dass Sie Code schreiben müssen, siehe z. blog.std.in/2010/09/09/using-sendfile-with-nodejsIch habe schnell
ab -n 10000 -c 100
ein statisches 1406-Bytefavicon.ico
bereitgestellt und nginx, Express.js (statische Middleware) und gruppierte Express.js verglichen. Hoffe das hilft: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 +
static
Middleware (langsamer):quelle
static
Middleware in der Produktion funktioniert.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.
quelle
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.
quelle
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.
quelle
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.
quelle