Apache gegen Nginx

29

Ich habe kürzlich die Unterschiede zwischen Apache und Nginx untersucht und bin verwirrt, welche ich wählen soll.

Ich habe einige Nachforschungen angestellt, aber es gibt keinen endgültigen Vergleich zwischen den beiden und ich habe mich gefragt, ob jemand hier seine Ansichten zu den Unterschieden zwischen den beiden äußern könnte.

Nach meinem derzeitigen Kenntnisstand verstehe ich, dass mod_php schneller und sicherer als fastcgi ist, Apache jedoch viel schlechter, wenn es um gleichzeitige Verbindungen und den Speicherverbrauch geht.

Meine Website verwendet viel langes Polling, hat aber eine Nicht-AJAX-Webbasis (dh Apache mit langem Polling).

Meine ursprüngliche Lösung für Apaches Speicherprobleme bestand darin, das lange Polling durch node.js zu senden und node.js dann alle 2 Sekunden auf Apache zuzugreifen. In diesem Fall hätte Apache keine offene Verbindung, sondern node.js. Ich bin zu der Erkenntnis gelangt, dass dies möglicherweise nicht gut genug ist, und suche nach unterschiedlichen Lösungen. Ich bin immer noch daran interessiert, ob meine ursprüngliche Idee funktioniert hätte.

Was ist also besser für das moderne Web? Apache oder Nginx?

Update: Alle Vorschläge waren gut und gültig. Ich habe mich für die ursprüngliche zweite Idee entschieden, einen vollständigen Nginx-Server zu verwenden. Ich bin zufrieden, dass ich als dedizierter Server keine Sicherheitsprobleme mit fastcgi haben kann, und da meine langen Abfrageskripten in PHP geschrieben werden müssen, benötige ich einen Server, der mit gleichzeitigen Verbindungen mit hoher Last umgehen kann, und Apache kann das einfach nicht, egal wie viel Ich ändere die Struktur, es wird immer noch speicherhungrig sein.

Ich habe die Antwort von Martin F markiert, da er meine Fragen so klar und vollständig beantwortet hat, dass ich der Meinung bin, dass er die Note verdient. Alle drei Antworten waren jedoch gut und gültig und werden auf jeden Fall die Verwendung von Reverse Proxy für eine andere Website untersuchen, die ich besitze da ich gerade etwas sehr sehr sehr Kooles gefunden habe, das Nginx beim Proxying tun kann.

Vielen Dank,

Sammaye
quelle

Antworten:

28

Sie scheinen ein paar Missverständnisse zu haben, die meines Erachtens angegangen werden müssen.

Erstens ist mod_php nur unwesentlich schneller. Alle meine Tests haben gezeigt, dass der Unterschied so gering ist, dass es sich nicht lohnt, ihn zu berücksichtigen. Ich bezweifle auch, dass der Sicherheitsaspekt für Sie relevant ist, da Sie einen dedizierten Server zu suchen scheinen und mod_php hat wirklich nur einen Vorteil in einer gemeinsam genutzten Umgebung - in einer dedizierten Umgebung hat php-fpm sogar den Vorteil, dass PHP und Ihr Webserver jetzt als unterschiedliche Prozesse ausgeführt werden. Fpm wie Slow Log.

Wenn die Welt schwarz und weiß wäre, würde ich sagen, gehen Sie mit einem reinen Nginx-Setup und kompilieren Sie PHP mit PHP-Fpm. Realistischer, wenn Apache bereits funktioniert, machen Sie nginx zu einem Reverse-Proxy für Apache, und Sie sparen möglicherweise ein paar Stunden Einrichtungszeit, und der Unterschied in der Leistung ist gering.

Aber nehmen wir an, die Welt ist für eine Sekunde schwarz und weiß, weil dies zu weitaus großartigeren Setups führt. Du machst nginx + php-fpm für deinen Webserver. Um die Uploads zu lösen, verwenden Sie das Upload-Modul und das Upload-Fortschrittsmodul für nginx. Dies bedeutet, dass Ihr Webserver den Upload akzeptiert und den Dateipfad an PHP weiterleitet, damit die Datei nicht über das FastCGI-Protokoll zwischen nginx und PHP gestreamt werden muss. (Ich habe dies in einem Live-Setup und es funktioniert großartig, übrigens!)

Zum Herunterladen von Benutzern verwenden Sie die x-send-file-ähnliche Funktion von nginx namens x-accel-redirect. Im Wesentlichen führen Sie Ihre Authentifizierung in PHP durch und setzen einen Header, den nginx aufnimmt und mit der Übertragung dieser Datei beginnt. PHP beendet die Ausführung und Ihr Webserver übernimmt die Übertragung, Süße! (Wieder habe ich dies in einem Live-Setup und es funktioniert großartig)

Für die Verteilung von Dateien über Server oder andere Vorgänge mit langer Laufzeit haben wir festgestellt, dass PHP dafür nicht besonders geeignet ist. Deshalb installieren wir gearman, einen Jobserver, der Jobs zwischen Mitarbeitern auf verschiedenen Servern verteilt. Diese Mitarbeiter können in einer beliebigen Sprache geschrieben werden Sprache. Daher können Sie einen Distribute Worker erstellen und 5 davon mit insgesamt 200 KB Arbeitsspeicher erzeugen, anstatt die 100 MB, die PHP verwenden würde. Süss. (Ich habe das auch live laufen lassen, also ist eigentlich alles möglich)

Falls Sie es noch nicht verstanden haben, denke ich, dass viele Ihrer Probleme überhaupt nicht mit Ihrem Webserver zusammenhängen. Sie denken nur so, weil Apache es aufgrund seiner Struktur zwingt, sich auf Ihren Webserver zu beziehen. Oft gibt es weitaus bessere Tools für den Job als PHP, und PHP ist eine Sprache, die dies weiß und hervorragende Möglichkeiten bietet, die Arbeit zu entladen, ohne PHP jemals zu verlassen.

Ich würde nginx wärmstens empfehlen, aber ich denke, Sie sollten auch andere Optionen für Ihre anderen Probleme in Betracht ziehen. Wenn Sie ein Skalierungs- oder Leistungsproblem haben, können Sie mir gerne schreiben. Ich weiß nicht, ob Sie hier Nachrichten senden können, aber ansonsten schreiben Sie mir an [email protected], da ich keinen Stalk-Server-Fehler für irgendetwas habe, das nicht mit nginx markiert ist. :)

Martin Fjordvald
quelle
1
Verdammt, das hat alles wirklich geklärt :) Danke, das war die Erklärung, nach der ich gesucht habe. Ich denke, ich bin ziemlich begeistert davon, Nginx zu lernen, da Apache über meine Website ersticken und sterben würde. Zum Glück sieht es ganz einfach aus, ihn zu verschieben. Ich meine, die Leute auf node.js haben gesagt, dass sie die meisten Dinge darin schreiben und Ihre PHP-Session-Klasse nur dann abfragen, wenn Sie es wirklich brauchen (was ich tue, es sei denn, es gibt eine Möglichkeit zu erkennen, wenn Benutzer ihre Fenster schließen: P). Ja, ich arbeite auf einer riesigen Serverfarm, daher hilft es Tonnen, zu wissen, dass es keine Sicherheitsbedrohung gibt, danke für die großartige Erklärung :)
Sammaye
Ich habe mir das angeschaut : joeandmotorboat.com/2008/02/28/… und das: blog.webfaction.com/a-little-holiday-present und es hat mich wirklich verrückt gemacht, wenn ich daran dachte, dass ich mich sehnen kann Umfrage nach Herzenslust wirklich. Kein einziges Speicherproblem im Gegensatz zu Apache :)
Sammaye
Warten Sie, damit Sie sagen, ich könnte einen Multithread-Worker in Java machen und PHP kann das perfekt umgehen? Ich meine, das größte Problem, das ich sehe, ist der Server, da ich massive Speicherprobleme mit Apache bekomme, wenn ich langes Polling verwende, was häufig ... von Nginx behoben wird.
Sammaye
1
Im Wesentlichen ja, ich habe Dateiverteilungs-Worker in C geschrieben. Mit der Gearman-Erweiterung für PHP sende ich einen Verteilungsjob an den Gearman-Jobserver und dieser sendet ihn an einen Worker, der in einer beliebigen Sprache geschrieben werden kann. PHP, Java, C usw. Dieser Worker erledigt dann seine Arbeit und meldet den Status an gearman, der ihn an PHP zurückmeldet. (Es sei denn, ein Hintergrundjob wurde ausgewählt. In diesem Fall endet PHP, ohne darauf zu warten.)
Martin Fjordvald
2
Ich weiß, dass dies ein alter Beitrag ist, aber ich muss sagen, dies ist einer der informativsten Beiträge, die ich zum Thema Nginx vs Apache gefunden habe. Vielen Dank an Martin, +1.
Akoi Meexx
5

Ich würde vorschlagen, Nginx als Reverse-Proxy auszuführen. Es verarbeitet alle Ihre statischen und zwischengespeicherten Dateien (wo es erheblich schneller ist als Apache / weniger Speicheraufwand) und leitet dann alle Anforderungen für dynamischen Inhalt an Apache weiter.

Greg Annandale
quelle
Ja, das ist es, was die meisten Leute zu tun scheinen. Ich muss das auf jeden Fall untersuchen :)
Sammaye
1
Denken Sie daran, mod_rpaf für Apache zu installieren, damit Sie zu Protokollierungszwecken die Client-IP-Adressen durchlaufen können (andernfalls werden in Apache-Protokollen alle Anforderungen ab 127.0.0.1 angezeigt). Fügen Sie Folgendes in die nginx-Konfiguration ein: proxy_set_header X-Forwarded-For $ proxy_add_x_forwarded_for;
Greg Annandale
Ich frage mich, bevor ich das heute Abend versuche. Wenn ich über Nginx zu Apache route, was meinem PHP dient, bedeutet das, dass lange Abfragen immer noch die gleichen Probleme haben wie Apache, oder führt der Aufruf im Reverse Proxy dazu, dass Apache auf irgendeine Weise anders agiert?
Sammaye
1

Ich bin mir nicht sicher, ob mod_php schneller ist als seine Alternativen. Wo hast du das gelesen? Ich habe einige Labortests mit nginx + php-fpm durchgeführt, und was ich gemessen habe, übertrifft jedes andere Setup.

Schauen Sie sich dieses Setup an: http://interfacelab.com/nginx-php-fpm-apc-awesome/

Ich habe es fast gleich eingerichtet, außer dass ich PHP-Pakete von http://www.dotdeb.org/ verwende - die ein PHP-FPM-Paket und ein einsatzbereites Init-Skript enthalten. Ich benutze weder Memecache noch Syck.

pauska
quelle
stackoverflow.com/questions/78108/… habe es von hier bekommen und ich habe das PHP-Handbuch durchgesehen und es besagt, dass php_mod einen signifikanten Vorteil gegenüber CGI-Versionen bietet. Dein Setup sieht gut aus. Es sieht auch sehr einfach aus. Ich werde es untersuchen :)
Sammaye
2
Es besagt, dass CGI viel langsamer ist als ein eingebautes Modul - nicht FastCGI :)
Pause
1
Gut - wenn Sie sich Sorgen über das Absterben von PHP-Prozessen (oder Timeout) machen, ist FastCGI (oder PHP-FPM) der richtige Weg. Es kann tote Kinderprozessoren töten, ohne andere Aktivitäten zu unterbrechen.
Pause
1
Ja. Oder, na ja, es kommt darauf an. Wie viele (maximale) Anzahl langsamer Anfragen werden Sie gleichzeitig bearbeiten? Stellen Sie hier die maximale Anzahl von PHP-FPM-Threads sowie die Anzahl der "schnellen" CGIs ein, die verfügbar sein sollen. Ich habe von Leuten gehört, die 200 PHP-FPM-Childs auf einem Server mit 4 GB RAM ausführen, also würde ich mir darüber keine Sorgen machen, wenn ich Sie wäre. Die nächste Version von PHP (5.3.3) wird standardmäßig PHP-FPM enthalten, wobei auch eine Adpative Engine enthalten ist. Sie wird entsprechend der Anzahl der ausstehenden Anfragen skaliert.
Pause
1
Ich würde leicht über mehrere Server laufen (vielleicht bis zu 10), aber wenn ich 200 Anfragen, die lange auf einem 4-GB-Server abgefragt werden können, unterbringen kann, sollte dies fast die Hälfte der 20 Server sein, die ich für die Ausführung von Apache benötigen würde. hmmmm ... ich muss das heute Abend testen
Sammaye