Wann sollte ich zu NGinx wechseln?

11

Ich habe einen Server mit mehreren Domänen und Anwendungen, die alle über Apache ausgeführt werden. Im Moment ist alles in Ordnung, aber ich habe vor, eine sehr leistungsintensive Webanwendung (unter Verwendung von C ++ mit CPPCMS) zu entwickeln, beginnend mit meinem Server zum Testen, und möglicherweise erst dann einen separaten Server für diese Anwendung, wenn sie fertig ist.

Wie auch immer, ich habe viel über NGinx gehört, das performanter zu sein scheint als Apache, also habe ich mich gefragt, ob es sich lohnt, für dieses neue Projekt damit zu arbeiten. Es ist mir nicht klar, weil ich nicht weiß, welche Art von Leistungsengpass NGinx genau behebt.

Ich bin kein Apache-Power-User, ich bin ein schlechter Linux-Administrator und ich entwickle nicht viel Web-Apps (aber ich habe Vorstellungen). Ich widme mich hauptsächlich dem Schreiben von Software, daher ist der Webserver-Teil für mich manchmal sehr dunkel. Jedes Mal, wenn ich eine Website über Apach konfigurieren muss, muss ich viel Zeit im Dokument verbringen, um sicherzustellen, dass nicht alles kaputt geht.

Davon abgesehen denke ich, dass ich auf dieser Seite viel besser werde, aber immer noch Rat brauche. Ich habe einige Nginx-Konfigurationsdateien herumgeschickt, und das scheint viel verständlicher zu sein als die Apache-Dateien, aber vielleicht irre ich mich?

Nach den von mir gesammelten Informationen ist NGinx die beste Wahl, wenn Sie einen Lastenausgleich wünschen. Wenn Ihre Anwendung also auf mehrere Computer verteilt ist, oder? Wenn ich über meine Anwendung für Scalling (und Leistung) nachdenke, sieht es so aus, als ob es das ist, was ich brauche, aber vielleicht muss ich mehr darüber wissen, wann es interessant ist, von Apache zu NGinx zu wechseln. Lohnt es sich auch für alle meine aktuellen Apps, auf NGinx zu wechseln? Wie viel kostet es? (Ich meine, ist es rechtzeitig teuer, von einem zum anderen zu wechseln?) Kann ich Apache und NGinx problemlos auf demselben Computer verwenden?

Randnotiz : Bitte fordern Sie mich nicht auf, interpretierte Sprachen anstelle von C ++ zu verwenden, da dies nicht mit der Frage zusammenhängt. Auf der CPPCSM-Begründungsseite erfahren Sie, welche Art von Anwendung davon profitieren kann. Ich verstehe die Nachteile (im Vergleich zu Apps in Ruby und Python, die ich bereits für weniger leistungshungrige Webapps verwende) sehr gut und bin damit einverstanden.

Klaim
quelle

Antworten:

10

Mehrere Punkte:

Der Hauptunterschied zwischen Apache und Nginx oder Lighttpd (den ich persönlich sehr mag) ist die Architektur:

  1. Apache verarbeitet eine Verbindung pro Prozess oder pro Thread (abhängig von mod-XYZ).
  2. Nginx und Lighttpd sind Single-Threaded-Handle für mehrere Verbindungen in einer einzigen Ereignisschleife.

Als Ergebnis:

  1. Nginx und Lighttpd lassen sich bei einer hohen Anzahl gleichzeitiger Verbindungen viel besser skalieren. Nehmen wir an, bei 1000 Verbindungen würde Apache fast sterben, da 1000 Prozesse in Mod-Prefork oder 1000 Threads in Mod-Worker erforderlich wären.

    Wenn Sie Comet-Technologien verwenden möchten, bei denen für jede Verbindung eine lange HTTP-Abfrage erforderlich ist, ist Apache nicht akzeptabel, da es nicht gut skaliert werden kann.

  2. Nginx und Lighttpd verbrauchen weniger Speicher, da jede Verbindung + - zwei Sockets (HTTP und FastCGI), einen Zwischenspeicherpuffer und einen bestimmten Status benötigt, während Apache den gesamten Thread einschließlich Stack und anderen Dingen benötigt.

Aufgrund meiner persönlichen Erfahrung mit Benchmarks habe ich Lighttpd (und ich gehe auch davon aus, dass Nginx) mit FastCGI-Backend etwas schneller als Apache gemacht, aber dies ist für eine geringe Anzahl von Verbindungen.

Ein weiterer Punkt ist, wenn Sie einige Lastausgleiche über FastCGI-Verbindungen durchführen möchten.

In der traditionellen Architektur gibt es

                               |
                              HTTP
                               |
         Balancer (Nginx/Lighttpd/Cherooke/something-else)
            /      |           |            |      \
         HTTP    HTTP         HTTP        HTTP     HTTP
         /         |           |            |         \
 Apache+PHP   Apache+PHP   Apache+PHP   Apache+PHP   Apache+PHP   
  Server 2    Server 3     Server 4      Server 5     Server 6

Da Apache Pools von Prozessen verarbeitet, auf denen jeweils Mod-PHP (oder andere Modi) ausgeführt wird

Wenn Sie CppCMS verwenden, das Pools selbst verwaltet, können Sie etwas anderes tun:

                               |
                              HTTP
                               |
         Balancer (Nginx/Lighttpd/Cherooke/something-else)    
                           Server 1
            /      |           |            |      \
         FCGI    FCGI         FCGI        FCGI     FCGI
         /         |           |            |         \
    CppCMS App  CppCMS App  CppCMS App    CppCMS App  CppCMS App
     Server 2    Server 3     Server 4      Server 5     Server 6

Grundsätzlich benötigen Sie keine weitere Indirektionsebene, da CppCMS den Prozess-, Thread- und Verbindungspool für Sie verwaltet. Während PHP / Ruby / Perl etwas Apache mod-XYZ benötigen oder einen eigenen FastCGI-Connector handhaben.

Artyom
quelle
+1 Schöne vollständige Erklärung des Autors von CppCMS;) Ok, jetzt sehe ich das Gesamtproblem besser. Wenn Sie also zunächst nur einen Server haben, ist HTTP-> Balancer-> FCGI-> CPPCMS, wenn ich das richtig verstehe? Was halten Sie von dem Rat von Jesper Mortensens Kommentar, dass FastCGI nicht schnell ist?
Klaim
@Klaim: Sehen Sie sich die hervorragenden Zeichnungen oben an. In dieser Architektur wird FastCGI als Verbindung zwischen mehreren Servern verwendet, auf denen jeweils eine Multithread-CppCMS-Instanz ausgeführt wird. Die relative Geschwindigkeit von FastCGI ist in diesem Fall viel weniger wichtig. Ihre Alternativen wären HTTP, AJP und andere netzwerkfähige Protokolle, die ebenfalls nicht "schnell" sind. Diese Antwort sollte wahrscheinlich als akzeptiert markiert und Ihre Frage bearbeitet werden, da es nicht wirklich darum geht, wann sich Nginx lohnt.
Jesper M
@Jesper Mortensen> Ich stimme zu, aber welche Änderung der Frage schlagen Sie genau vor?
Klaim
6

Nginx spricht sehr ( sehr ) können in der Regel erhalten viel höheren Durchsatz als Apache dank einem anderen architektonischen Ansatz für das Problem der Seiten an den Web - Serving. Nginx wurde auch hauptsächlich als Reverse-Proxy entwickelt und erfüllt diese Rolle außerordentlich gut (dies ist das Lastausgleichsbit, auf das Sie angespielt haben). Apache hingegen wurde für die Bereitstellung von Webseiten entwickelt und erhielt später die Möglichkeit zum Proxy.

Es gibt jedoch mit ziemlicher Sicherheit Bereiche, in denen Apache Nginx konstant übertreffen wird, während es andere gibt, in denen Nginx Apache ebenso konsequent übertreffen wird.

Die kurze Antwort lautet: Wenn Apache für Sie arbeitet, müssen Sie nicht wechseln. (Und ich sage dies als ehemaliger Apache-Benutzer, der ein vollständig konvertierter Nginx-Schüler geworden ist.) Erst wenn der Datenverkehr zu Ihrem Server ein Niveau erreicht, in dem Apache zu Ihrem Engpass wird (dies liegt in der Größenordnung von einigen Tausend gleichzeitigen Verbindungen). Dies hängt jedoch stark von Ihren Serverspezifikationen und anderen Serverlasten ab. Wenn Sie versuchen, Apache in einer ressourcenarmen Umgebung auszuführen, in der es kaum passt, bietet Ihnen der Wechsel zu Nginx einen soliden Vorteil.

Das heißt, wenn Sie zu Nginx wechseln möchten (was ich ermutige!), Dann machen Sie es. Wirst du irgendeinen Nutzen sehen? 9 mal von 10: Nein, das wirst du nicht. Sie haben jedoch erwähnt, dass Ihnen die Konfigurationsdateisprache von Nginx besser gefällt. Wenn Sie sich also wohler fühlen, Nginx als Apache zu konfigurieren, ist dies ein Vorteil für Sie! (Ich persönlich finde Apache-Konfigurationen im Allgemeinen einfacher zu lesen, aber das könnte daran liegen, dass ich viele, viele Jahre damit verbracht habe, sie zu lesen, und nur wenige Monate für Nginx aufgewendet wurden!)

Nebenbei bemerkt: Sie haben Ihren Wunsch erwähnt, eine Web-App in C ++ zu erstellen. Aus Gründen Ihrer Vernunft empfehle ich Ihnen dringend, stattdessen eine höhere Sprache wie PHP, Python oder sogar Java zu verwenden. Profilieren Sie dann Ihren Code und überlegen Sie, C ++ - basierte Module zu erstellen, um bestimmte Engpässe zu beheben (Python und PHP ermöglichen dies beide recht einfach; Sie wissen nichts über Java). Wenn Sie sich Sorgen um die Gesamtleistung machen, beachten Sie Folgendes: EVE Online, das größte nicht gehärtete MMORPG der Welt, basiert auf einer Python-Variante (Stackless Python), bei der nur Schlüsselkomponenten (z. B. die Grafikbibliotheken) in C ++ geschrieben sind. Wenn Python damit umgehen kann, kann es sicherlich auch mit Ihrer Web-App umgehen?

Kromey
quelle
+1 Danke. Zu C ++ siehe meinen Kommentar zur Antwort von Jesper Mortensen. Auch wenn Python auf der Serverseite von Eve Online (ich weiß viel darüber) AFAIK verwendet wird, verwaltet es nur Gameplay-Code (der groß ist), und einige andere Teile sind tatsächlich in C ++. Der Grafikcode befindet sich auf der Clientseite, daher ist C ++ für solche Arten der Grafikleistung ebenfalls nicht obligatorisch. Wie gesagt, lesen Sie auf der CPPCMS-Begründungsseite nach, warum ich mich dafür entschieden habe. Wenn ich Ihrem Rat folgen würde, müsste ich meine Bewerbung zweimal schreiben, obwohl ich bereits weiß, dass sie sehr machtgierig ist. Außerdem verstehe ich die Nachteile und bin damit einverstanden.
Klaim
3

Niemand kann den Teil "Wann sollte ich wechseln?" Wirklich beantworten - dies hängt von Ihrer Auslastung, der Leistung Ihres eigenen Anwendungscodes usw. ab.

NGinx, das scheint performanter zu sein als Apache

nginx verwendet einen einzelnen Prozess (oder eine sehr kleine Anzahl von Arbeitsprozessen), um alle Clientverbindungen mithilfe von Ereignis-E / A zu verarbeiten. Apache verfügt über mehrere "Multi-Processing-Module" , die sich jedoch alle eher auf viele, viele Prozesse / viele Threads konzentrieren. Infolgedessen verbraucht Apache im Allgemeinen mehr RAM und CPU als Nginx für die grundlegende Handhabung von HTTP-Verbindungen. Auf der C10K-Seite von Kegel erhalten Sie einen Überblick über die verschiedenen Ansätze zur Verbindungsabwicklung .

sehr leistungsintensive Webanwendung (mit C ++ mit CPPCMS)

Ich würde dringend empfehlen, die grundlegende Webanwendung in einer höheren Sprache (Python oder vielleicht Ruby, Scala) auszuführen und eine Nachrichtenwarteschlange zu verwenden, um Arbeitstickets an Arbeitsmaschinen zu senden, die die "leistungsintensiven" Aufgaben asynchron erledigen.

NGinx ist die beste Wahl, wenn Sie einen Lastausgleich wünschen.

Nginx ist ein guter Load Balancer. Aber es gibt viele Möglichkeiten in diesem Bereich .

Kann ich Apache und NGinx problemlos auf demselben Computer verwenden?

Ja. Führen Sie sie einfach auf verschiedenen IP-Portnummern und / oder IP-Adressen aus.

Jesper M.
quelle
"Ich würde dringend empfehlen, die grundlegende Webanwendung in einer höheren Sprache zu erstellen."> Ich habe nicht gesagt, dass es sich um eine grundlegende Webanwendung handelt - es ist nicht einmal trivial. Wenn Sie die Gründe für die Verwendung von CPPCMS sehen, gibt der Autor die wenigen Punkte an, in denen dies nützlich sein könnte, und ich bin in diesen Fällen. Ich habe andere Alternativen in Betracht gezogen, fand sie aber teurer als C ++, zumindest in der Art von Webapp, die ich schreibe. Es ist also nicht Teil der Frage. Aber ich verstehe Ihren Rat und gebe den Leuten, die mich fragen, ob sie C ++ für Web-Apps verwenden sollen, das Gleiche. Ich plane auch, Python für eine andere einfachere App zu verwenden.
Klaim
Wie auch immer, +1 für die Details.
Klaim
@Klaim: Wenn Sie die behauptete Leistungsverbesserung in der Größenordnung gegenüber einer gut abgestimmten C # / Java-Implementierung realisieren möchten, prüfen Sie, ob Sie CppCMS- und Anwendungscode in Bearbeitung mit Ihrem Webserver ausführen können - dh als Plugin für Nginx / Apache. Die CppCMS-Seiten scheinen FastCGI als Verbindung zwischen Webserver und CppCMS anzuzeigen. und tatsächlich ist FastCGI nicht ... schnell.
Jesper M
> Interessante Idee. Die meisten Ratschläge lauten, dass Sie fastcgi verwenden sollten, da es schneller als die Alternativen ist. Ich werde prüfen, ob ich das kann, vielleicht mit dem CPPCMS-Autor sehen, warum er denkt, dass es das schnellste ist.
Klaim