Kann ich Apache durch Node.js ersetzen?

151

Ich habe eine Website unter CentOS mit den üblichen Verdächtigen (Apache, MySQL und PHP). Seit dem Start dieser Website hat sie sich ziemlich weiterentwickelt und jetzt möchte ich ausgefallenere Dinge damit machen - nämlich Echtzeitbenachrichtigungen. Nach dem, was ich gelesen habe, geht Apache schlecht damit um. Ich frage mich, ob ich nur Apache durch Node.js ersetzen kann (also anstelle von " LAMP " "LNMP").

Ich habe versucht, online nach einer Lösung zu suchen, aber keine gefunden. Wenn ich die Dinge, die ich gelesen habe, richtig interpretiere, scheinen die meisten Leute zu sagen, dass Node.js sowohl Apache als auch PHP zusammen ersetzen kann. Ich habe jedoch viel vorhandenen PHP-Code, daher würde ich ihn lieber behalten.

Falls es nicht schon offensichtlich ist, bin ich ziemlich verwirrt und könnte etwas Erleuchtung gebrauchen. Vielen Dank!

Rick
quelle
Ein Affen-Server könnte einen Blick wert sein.
TryHarder

Antworten:

86

Wenn Sie bereit sind, Ihr PHP in JavaScript neu zu schreiben, kann Node.js Ihren Apache ersetzen.

Wenn Sie eine Apache- oder NGINX-Instanz platzieren, die im Reverse-Proxy-Modus zwischen Ihren Servern und Ihren Clients ausgeführt wird, können Sie einige Anforderungen in JavaScript auf Node.js und einige Anforderungen in Ihrem von Apache gehosteten PHP verarbeiten, bis Sie Ihr gesamtes PHP vollständig ersetzen können mit JavaScript-Code. Dies könnte das glückliche Medium sein: Arbeiten Ihre WebSockets in Node.js, arbeiten Sie profaner in Apache + PHP?

Sarnold
quelle
1
Ich freue mich über die schnelle Antwort! Ist Nginx Apache weit überlegen? Ich habe bereits eine .htaccess-Datei eingerichtet und es wäre schön, sie zu behalten. Außerdem habe ich gelesen, dass es sinnlos ist, Apache-Anfragen an Node.js weiterzuleiten, da Sie dann die Vorteile von Node.js verlieren, da Sie immer noch Apache durchlaufen. Wäre es besser, wenn Node.js auf Port 80 nach etwas in einem Unterordner mit dem Namen "nodejs" sucht und dann alles, was nicht in diesem Unterordner enthalten ist, von Node.js an Apache übergeben werden könnte? Apache könnte auf einem anderen Port wie 8000 lauschen.
Rick
21
@ Rick, ich bin ziemlich nahe daran, meine eigene Antwort zu löschen; Node kann verwendensendfile , und es gibt ein Modul für die FastCGI- Unterstützung, mit dem Sie Ihr PHP möglicherweise auch über Node bereitstellen können. Was Nginx und Apache betrifft, war ich schon immer ein Fan von asynchronen Servern über Thread- oder Multiprozess-Server :), aber ich fand, dass die Apache-Dokumentation leichter zu finden und zu lesen ist. Ich würde diese persönliche Präferenz nennen, es sei denn, Sie müssen auf erstaunliche Zahlen skalieren. :)
Sarnold
3
@Rick Sie möchten Produktionsmaterial nicht auf Node migrieren, bevor Sie verstanden haben, was es ist und wie es funktioniert. Node ist keine magische Pille, um Dinge schneller zu machen. Das ereignisgesteuerte / asynchrone Paradigma ist nicht neu und es gibt Gründe, warum es nicht für alles verwendet wird. en.wikipedia.org/wiki/Asynchronous_I/O
Øyvind Skaar
1
@Rick Anstatt zu denken, dass Sie ersetzen sollten, was Sie haben, ist es vielleicht besser, Node zusätzlich auszuführen. Denken Sie nicht, dass es einen Grund gibt, alles durch den Knoten (?) Zu leiten, das klingt nach einer schlechten Idee. Führen Sie den Knoten einfach auf einem anderen Port oder Host aus.
Øyvind Skaar
2
@ Øyvind Skaar Ich stimme zu. Bei den meisten Websites (z. B. Wordpress) ist der eigentliche Engpass die Datenbank und nicht der Dateizugriff. Und wenn der Dateizugriff ein Problem darstellt, ist der Cache immer eine praktikable Lösung. Für echte Leistung ist PHP-APC ein verdammt billiger Trick.
magallanes
26

Node.js ist möglicherweise schneller als Apache, dank seiner ereignisreichen / nicht blockierenden Architektur, aber Sie haben möglicherweise Probleme, Module / Bibliotheken zu finden, die einige der Apache-Funktionen ersetzen.

Node.js selbst ist ein leichtes Low-Level-Framework, mit dem Sie relativ schnell serverseitige Inhalte und Echtzeit-Teile Ihrer Webanwendungen erstellen können. Apache bietet jedoch viel umfassendere Konfigurationsoptionen und "klassische" Webserver-orientierte Funktionen.

Ich würde sagen, wenn Sie PHP nicht durch ein auf node.js basierendes Webanwendungsframework wie express.js ersetzen möchten, sollten Sie bei Apache bleiben (oder über eine Migration auf Nginx nachdenken, wenn Sie Leistungsprobleme haben).

yojimbo87
quelle
11

Ich glaube, Node.js ist die Zukunft im Web-Serving, aber wenn Sie viel vorhandenen PHP-Code haben, sind Apache / MySQL die beste Wahl. Apache kann so konfiguriert werden, dass Anforderungen an Node.js weitergeleitet werden, oder Node.js kann Anforderungen an Apache weiterleiten, aber ich glaube, dass in beiden Fällen einige Leistungseinbußen auftreten, insbesondere im ersten Fall. Keine große Sache, wenn Sie keine sehr stark frequentierte Website betreiben.

Ich habe mich gerade bei stackoverflow registriert und kann die akzeptierte Antwort noch nicht kommentieren. Heute habe ich ein einfaches Node.js-Skript erstellt, das sendfile () verwendet, um Dateien über das HTTP-Protokoll bereitzustellen. (Das vorhandene Beispiel, auf das die akzeptierte Antwort verweist, verwendet nur das reine TCP-Protokoll zum Senden der Datei, und ich konnte kein Beispiel für HTTP finden, also habe ich es selbst geschrieben.)

Also dachte ich, jemand könnte das nützlich finden. Das Bereitstellen von Dateien über den Aufruf des Betriebssystems sendfile () ist nicht unbedingt schneller als beim Kopieren von Daten über "Benutzerland", beansprucht jedoch weniger CPU und RAM und kann somit eine größere Anzahl von Verbindungen als auf herkömmliche Weise verarbeiten.

Der Link: https://gist.github.com/1350901

youurayy
quelle
2
Obwohl es sehr wahr ist, glaube ich immer noch, dass wenn Sie Apache reduzieren, genau das tun, was Sie beschreiben, es genauso schnell und wenn nicht schneller als node.js laufen würde. Apache macht viele Dinge, die die Leute nicht sehen oder wirklich verstehen, und wenn Sie alle Funktionen dieser Webserver zu node.js hinzufügen, läuft es genauso langsam wie sie. Als einfaches Beispiel wäre wahrscheinlich mynode.js / getfile? File = / etc / shadow
Rahly
8

Vorheriger SO-Beitrag, der genau beschreibt, was ich sage (php + socket.io + node)

Ich denke, Sie könnten einen Knotenserver auf somehost einrichten: 8000 mit socket.io und den socket.io-Clientcode in Tags einfügen und mit minimalem Aufwand Ihre vorhandene App mit socket.io (Echtzeit-Baby) ohne jede Menge Arbeit zum Schaukeln bringen.

Während der Knoten Ihr einziger Backend-Server sein kann, denken Sie daran, dass der Knoten seinem Namen gerne gerecht wird und ein Knoten wird. Ich habe vor einiger Zeit einen Vortrag gelesen, den Ryan Dahl einer PHP-Benutzergruppe hielt, und er erwähnte den Namensknoten, der sich auf eine Vision mehrerer Knotenprozesse bezieht, die arbeiten und miteinander sprechen.

Richard Holland
quelle
2

Seine LAMPE versus BEDEUTUNG heutzutage. Für einen direkten Vergleich siehe http://tamas.io/what-is-the-mean-stack .

Natürlich sind M, E und A etwas variabel. Zum Beispiel kann der neuere Koa (E) xpress ersetzen.

Das Ersetzen von Apache durch Node.js ist jedoch wahrscheinlich nicht der richtige Weg, um Ihren Webstack zu modernisieren.

Wolfgang Kühn
quelle