Frage Apache vs Nginx


Ich habe kürzlich die Unterschiede zwischen Apache und Nginx untersucht und bin verwirrt darüber, was ich wählen sollte.

Ich habe ein wenig gesucht, aber es gibt keinen definitiven Vergleich zwischen den beiden und ich frage mich, ob jemand hier zu den Unterschieden zwischen den beiden Stellung nehmen könnte.

Mein aktuelles Wissen erlaubt mir zu verstehen, dass mod_php schneller und sicherer ist als fastcgi, aber Apache ist viel schlechter, wenn es um gleichzeitige Verbindungen und Speicherverbrauch geht.

Meine Website verwendet eine Menge lange Abfragen, hat aber eine nicht-AJAX-Web-Basis (d. H. Apache mit langen Abfragen über die Spitze).

Meine ursprüngliche Lösung für Apaches-Speicherprobleme bestand darin, die lange Abfrage durch node.js zu schicken und dann node.js alle 2 Sekunden auf den Apache zugreifen zu lassen. In diesem Fall hätte Apache keine offene Verbindung, sondern stattdessen node.js. Ich bin zu der Erkenntnis gekommen, dass dies möglicherweise nicht gut genug ist und ich sehe verschiedene Lösungen an. 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 bin mit der ursprünglichen zweiten Idee gegangen, die einen vollen Nginx-Server verwenden soll. Ich bin zufrieden, dass ich als dedizierter Server keine Sicherheitsprobleme von fastcgi erleiden kann und da meine langen Polling-Skripte in PHP geschrieben werden müssen, benötige ich einen Server, der gleichzeitig mit hoher Last umgehen kann und Apache kann das nicht, egal wie viel Ich ändere die Struktur, es wird immer noch Speicher hungrig sein.

Ich habe die Antwort von Martin F markiert, da er eine so klare und vollständige Antwort auf meine Fragen gegeben hat, dass ich denke, dass er das Zeichen verdient, aber alle drei Antworten waren gut und gültig und werden definitiv den Reverse-Proxy für eine andere Seite verwenden seit ich gerade etwas sehr, sehr sehr kool gefunden habe, das Nginx im Proxying tun kann.

Vielen Dank,


29
2017-07-05 08:51


Ursprung




Antworten:


Sie scheinen ein paar Missverständnisse zu haben, die meiner Ansicht nach angegangen werden müssen.

Zunächst einmal ist mod_php nur marginal schneller, alle meine Tests haben gezeigt, dass der Unterschied so gering ist, dass es sich nicht lohnt einzugreifen. Ich bezweifle auch, dass der Sicherheitsaspekt für Sie relevant ist, da Sie auf einen dedizierten Server schauen mod_php hat wirklich nur einen Vorteil in einer gemeinsamen Umgebung - in der Tat, in einer dedizierten Umgebung wird php-fpm den Vorteil haben wie PHP und Ihr Webserver läuft jetzt als verschiedene Prozesse, und das ist nicht einmal die fantastischen Logging-Optionen in php- fpm wie langsames Protokoll.

Wenn die Welt schwarz und weiß wäre, würde ich sagen, mit einem reinen Nginx-Setup gehen und PHP mit php-fpm kompilieren. Realistischer, wenn Apache bereits funktioniert, machen Sie nginx zu einem Reverse-Proxy für Apache, und Sie sparen vielleicht ein paar Stunden Setup-Zeit und der Unterschied in der Leistung wird winzig sein.

Aber nehmen wir an, die Welt ist für eine Sekunde schwarz und weiß, denn das macht weit mehr tolle Setups. Sie tun nginx + php-fpm für Ihren Webserver. Um die Uploads zu lösen, verwenden Sie das Upload-Modul und laden das Fortschrittsmodul für nginx hoch. Dies bedeutet, dass Ihr Webserver den Upload akzeptiert und den Dateipfad an PHP weiterleitet, so dass die Datei nicht zwischen nginx und PHP per Fastcgi-Protokoll gestreamt werden muss. (Ich habe das in einem Live-Setup und es funktioniert super, übrigens!)

Für Benutzer herunterladen Sie nginxs x-sendendatei-ähnliche Funktion namens x-accel-redirect, im Wesentlichen tun Sie Ihre Authentifizierung in PHP und setzen Sie eine Kopfzeile, die nginx nimmt auf und startet die Übertragung dieser Datei. PHP beendet die Ausführung und Ihr Webserver kümmert sich um die Übertragung, Süße! (Wieder habe ich das in einem Live-Setup und es funktioniert super)

Für die Verteilung von Dateien über Server oder andere lang andauernde Operationen stellen wir fest, dass PHP nicht wirklich dafür geeignet ist. Deshalb installieren wir gearman, einen Jobserver, der Jobs zwischen Arbeitern auf verschiedenen Servern verteilen kann, in die diese Worker geschrieben werden können irgendein Sprache. Daher können Sie einen verteilten Worker erstellen und 5 von ihnen spawnen, indem Sie insgesamt 200 KB Speicher anstelle der 100 MB verwenden, die PHP verwenden würde. Süss. (Ich habe das auch live laufen, also ist es 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 einfach so, weil Apache es aufgrund seiner Struktur zwingt, mit Ihrem Webserver in Verbindung zu stehen, oft gibt es viel bessere Tools für den Job als PHP und PHP ist eine Sprache, die das weiß und hervorragende Möglichkeiten bietet, um Arbeit zu entlasten, ohne jemals PHP zu verlassen.

Ich würde nginx wärmstens empfehlen, aber ich denke auch, dass Sie sich andere Optionen für Ihre anderen Probleme ansehen sollten. Wenn Sie ein Skalierungs- oder Leistungsproblem haben, können Sie mir gerne schreiben. Ich weiß nicht, ob du hier Nachrichten verschicken kannst, aber schreibe mir sonst bitte an martin@bbtn.us, da ich keinen Serverfehler für irgendetwas begehe, das nicht mit nginx getaggt ist. :)


28
2017-07-05 18:06



Verdammt, das hat wirklich alles geklärt :) Danke, das war die Erklärung, nach der ich gesucht habe. Ich denke, ich bin jetzt ziemlich begeistert davon, Nginx zu lernen, seit Apache erstickt und auf meiner Seite stirbt. Zum Glück sieht es wirklich ziemlich einfach aus, es zu verschieben. Ich meine, Leute auf node.js haben gesagt, schreibe die meisten Dinge in das und frage nur deine php session-Klasse, wenn du wirklich musst (was ich tue, es sei denn, es gibt eine Möglichkeit, zu erkennen, wenn Benutzer ihre Fenster schließen: P). Ja, ich laufe auf einer riesigen Serverfarm und weiß, dass es keine Sicherheitsbedrohung gibt, das hilft Tonnen, danke für die großartige Erklärung :) - Sammaye
Ich habe mir das angesehen: joeandmotorboot.com/2008/02/28/...und das: blog.webfaction.com/a-little-holiday-present und es hat mich wirklich auf den Gedanken gebracht, wirklich nach Herzenslust zu pollen. Kein einziges Speicherproblem im Gegensatz zu Apache :) - Sammaye
Warte, dass du sagst, ich könnte einen Multithread-Arbeiter 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 mit Long Polling bekomme, was häufig von Nginx behoben wird. - Sammaye
Im Grunde ja, ich habe Dateivertriebsmitarbeiter in C geschrieben, benutze die gearman-Erweiterung für PHP. Ich sende einen Verteilungsjob an den Jobserver von gearman und sende es an einen Arbeiter, der in welcher Sprache auch immer geschrieben werden kann; PHP, Java, C usw. Dieser Mitarbeiter erledigt seine Aufgabe und meldet den Status an gearman zurück, der an PHP zurückmelden kann. (es sei denn, es wurde ein Hintergrundjob gewählt, in diesem Fall endet PHP ohne darauf zu warten) - Martin Fjordvald
Ich weiß, dass dies ein altes Posting ist, aber ich muss sagen, dies ist einer der informativsten Beiträge, die ich zum Thema nginx vs apache gefunden habe. Thans Martin, +1. - Akoi Meexx


Ich würde vorschlagen, Nginx als Reverse-Proxy laufen zu lassen. Es verarbeitet all Ihre statischen und gecachten Dateien (wo es wesentlich schneller ist als Apache / weniger Speicheraufwand) und leitet dann alle Anfragen für dynamischen Inhalt an Apache weiter.


5
2017-07-05 09:08



Ja, das ist es, was die meisten Leute anscheinend tun. Ich werde das unbedingt sehen müssen :) - Sammaye
Denken Sie daran, mod_rpaf für Apache zu installieren, damit Sie Client-IP-Adressen für Protokollierungszwecke weitergeben können (sonst werden Apache-Protokolle alle Anfragen als 127.0.0.1 anzeigen), fügen Sie Folgendes in nginx config ein: proxy_set_header X-Forwarded-For $ proxy_add_x_forwarded_for; - Greg Annandale
Ich frage mich, bevor ich es heute Abend versuche. Wenn ich durch Nginx zu Apache führe, das mein PHP dient, bedeutet das, dass langes Polling immer noch die gleichen Probleme wie Apache haben würde oder macht der Aufruf von Reverse Proxy etwas anderes in Apache? - Sammaye


Ich bin mir nicht so sicher, dass mod_php schneller ist als seine Alternativen, wo hast du das gelesen? Ich habe ein paar Labortests mit nginx + php-fpm gemacht, und von dem, was ich gemessen habe, schlägt es jedes andere Setup.

Schau dir dieses Setup an: http://interfacelab.com/nginx-php-fpm-apc-wesome/

Ich habe es fast gleich eingerichtet, nur dass ich PHP-Pakete von benutze http://www.dotdeb.org/ - enthält ein php-fpm-Paket und ein init-Skript, das sofort verwendet werden kann. Ich benutze Memecache oder syck nicht.


1
2017-07-05 09:38



stackoverflow.com/questions/78108/... habe es von hier und ich habe das php-Handbuch überprüft und es sagt, dass php_mod einen signifikanten Vorteil gegenüber cgi-Versionen bietet. Dein Setup sieht gut aus. Es sieht auch sehr einfach aus. Ich schaue hinein :) - Sammaye
Es besagt, dass CGI viel langsamer ist als ein eingebautes Modul - nicht FastCGI :) - pauska
Nun, wenn Sie sich Sorgen machen, dass PHP-Prozesse absterben (oder auslaufen), dann ist FastCGI (oder PHP-FPM) der richtige Weg. Es kann tote Kinderprozesse töten, ohne andere Aktivitäten zu unterbrechen. - pauska
Ja. Oder, nun, es kommt darauf an. Wie viele (maximale) Anzahl langsamer Anfragen bearbeiten Sie gleichzeitig? Setzen Sie max. PHP FPM-Threads darauf, zuzüglich der Anzahl der "schnellen" CGIs, die Sie haben möchten. Ich habe von Leuten gehört, die 200 PHP-FPM-Kinder auf einem Server mit 4GB RAM laufen lassen, also würde ich mir nicht zu viele Sorgen darüber machen, wenn ich Sie wäre. Die nächste Version von PHP (5.3.3) wird standardmäßig PHP-FPM enthalten, wo es auch eine adpative Engine gibt - sie wird entsprechend der Anzahl der ausstehenden Anfragen skaliert. - pauska
Ich würde leicht über mehrere Server (vielleicht bis zu 10) laufen, aber wenn ich 200 Anfragen, die lange auf einem 4GB Server abgefragt werden können passen sollte, würde dies fast die Hälfte der 20 Server würde ich Apache ausführen müssen. hmmmm ... Ich werde das heute Abend testen müssen - Sammaye