Gute Frage!
Es gibt viele Websites und kostenlose Web-Apps, die in PHP implementiert sind und auf Apache ausgeführt werden. Viele Leute verwenden es, damit Sie etwas ziemlich Einfaches zusammenstellen können. Außerdem ist es eine einfache Möglichkeit, statische Inhalte bereitzustellen. Node ist schnell, leistungsstark, elegant und ein sexy Tool mit der rohen Leistung von V8 und einem flachen Stack ohne eingebaute Abhängigkeiten.
Ich möchte auch die Leichtigkeit / Flexibilität von Apache und dennoch das Grunzen und die Eleganz von Node.JS. Warum kann ich nicht beides haben ?
Glücklicherweise ist es mit der ProxyPass- Direktive im Apache httpd.conf
nicht allzu schwierig, alle Anforderungen an eine bestimmte URL an Ihre Node.JS-Anwendung weiterzuleiten.
ProxyPass /node http://localhost:8000
Stellen Sie außerdem sicher, dass die folgenden Zeilen NICHT auskommentiert sind, damit Sie den richtigen Proxy und das richtige Submodul zum Umleiten von http-Anforderungen erhalten:
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
Führen Sie dann Ihre Node-App auf Port 8000 aus!
var http = require('http');
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello Apache!\n');
}).listen(8000, '127.0.0.1');
Anschließend können Sie über den /node/
Pfad in Ihrer URL auf die gesamte Node.JS-Logik zugreifen. Der Rest der Website kann Apache überlassen werden, um Ihre vorhandenen PHP-Seiten zu hosten:
Jetzt müssen Sie nur noch davon überzeugen, dass Ihr Hosting-Unternehmen Sie mit dieser Konfiguration laufen lässt !!!
mod_proxy_wstunnel
. Ich sehe, Sie haben jetzt Ihre Antwort gefunden. Für andere mit demselben Problem siehe: serverfault.com/questions/616370/…Diese Frage gehört eher zu Server Fault, aber FWIW Ich würde sagen, dass das Ausführen von Apache vor Node.js in den meisten Fällen kein guter Ansatz ist.
Der ProxyPass von Apache eignet sich hervorragend für viele Dinge (z. B. das Bereitstellen von Tomcat-basierten Diensten als Teil einer Website) und wenn Ihre Node.js-App nur eine bestimmte, kleine Rolle spielt oder ein internes Tool ist, das wahrscheinlich nur eine begrenzte Anzahl von Benutzern hat dann ist es vielleicht einfacher, es einfach zu benutzen, damit Sie es zum Laufen bringen und weitermachen können, aber das klingt hier nicht so.
Wenn Sie die Leistung und Skalierbarkeit nutzen möchten, die Sie durch die Verwendung von Node.js erhalten - und insbesondere, wenn Sie eine dauerhafte Verbindung wie Web-Sockets aufrechterhalten möchten -, sollten Sie sowohl Apache als auch Ihren Node ausführen. js auf anderen Ports (z. B. Apache auf localhost: 8080, Node.js auf localhost: 3000) und dann etwas wie nginx, Varnish oder HA-Proxy vor sich ausführen - und den Verkehr auf diese Weise weiterleiten.
Mit etwas wie Lack oder Nginx können Sie den Verkehr basierend auf Pfad und / oder Host weiterleiten. Beide verbrauchen viel weniger Systemressourcen und sind viel skalierbarer als die Verwendung von Apache, um dasselbe zu tun.
quelle
Anweisungen zu laufen
node server
entlangapache2(v2.4.xx) server
:Um Rohr alle Anfragen auf einer bestimmte URL zu Ihrer Node.JS Anwendung erstellen
CUSTOM.conf
Datei im/etc/apache2/conf-available
Verzeichnis, und fügen Sie die erstellten Datei folgende Zeile:Ändern Sie 8000 in die bevorzugte Portnummer für
node server
.Aktivieren Sie benutzerdefinierte Konfigurationen mit folgendem Befehl:
CUSTOM ist Ihr neu erstellter Dateiname ohne Erweiterung. Aktivieren Sie ihn dann
proxy_http
mit dem folgenden Befehl:es sollte sowohl
proxy
als auchproxy_http
Module aktivieren . Sie können überprüfen, ob das Modul aktiviert ist oder nicht mit:Nachdem Konfiguration und Module aktiviert wurden, müssen Sie den Apache-Server neu starten:
Jetzt können Sie den Knotenserver ausführen. Alle Anfragen an
URL/node
werden vom Knotenserver bearbeitet.quelle
Das Ausführen von Node und Apache auf einem Server ist trivial, da sie keine Konflikte verursachen. NodeJS ist nur eine Möglichkeit, die JavaScript-Serverseite auszuführen. Das eigentliche Dilemma besteht darin, von außen auf Node und Apache zuzugreifen. Aus meiner Sicht haben Sie zwei Möglichkeiten:
Richten Sie Apache so ein, dass alle übereinstimmenden Anforderungen an NodeJS weitergeleitet werden, wodurch die Datei hochgeladen wird und was auch immer im Knoten vorhanden ist.
Haben Sie Apache und Node auf unterschiedlichen IP: Port-Kombinationen (wenn Ihr Server zwei IPs hat, kann eine an Ihren Node Listener gebunden sein, die andere an Apache).
Ich fange auch an zu vermuten, dass dies möglicherweise nicht das ist, wonach Sie tatsächlich suchen. Wenn Ihr Endziel darin besteht, dass Sie Ihre Anwendungslogik in Nodejs und einen Teil der "Dateiverwaltung" schreiben, den Sie an einen Auftragnehmer abladen, dann ist es wirklich eine Wahl der Sprache, kein Webserver.
quelle
Sie können einen anderen Ansatz verwenden, z. B. das Schreiben eines Reverse-Proxy-Servers mit NodeJS, um sowohl Apache- als auch alle anderen NodeJS-Apps zu vertreten.
Zuerst müssen Sie Apache auf einem anderen Port als Port 80 ausführen lassen. Beispiel: Port 8080
Anschließend können Sie ein Reverse-Proxy-Skript mit nodejs wie folgt schreiben:
Der folgende Artikel beschreibt den gesamten Herstellungsprozess.
RUN APACHE MIT NODE JS REVERSE PROXY - MIT REDBIRD
quelle
quelle
Ich habe die obige Antwort mit Certbot-SSL-Zertifikaten und CORS-Headern für die Zugriffskontrolle kombiniert und sie zum Laufen gebracht, sodass ich dachte, ich würde die Ergebnisse teilen.
Apache httpd.conf am Ende der Datei hinzugefügt:
Apache VirtualHost-Einstellungen (doc root für PHP befindet sich unter Apache und SSL mit Certbot, während die Site node.js / socket.io auf Port 3000 ausgeführt wird - und das SSL-Zertifikat von Apache verwendet). Beachten Sie auch, dass die Site node.js den Proxy für den Ordner verwendet / nodejs, socket.io und ws (websockets):
Dann meine node.js App (app.js):
Ich erzwinge einen IP4-Listener, aber das ist optional - Sie können ersetzen:
Der App-Code von node.js (app.js) wird fortgesetzt mit:
Schließlich auf der Clientseite (erstellt als nodejs.js):
In diesem Beispiel sendet der JS beim Laden ein "Named-Event" an den Socket, das die Daten in JSON an den Server node.js / socket.io sendet.
Empfängt die Daten unter Verwendung von io und Socket auf dem Server unter path / nodejs (vom Client verbunden) und sendet sie dann erneut als Broadcast. Alle anderen Benutzer im Socket würden die Daten mit ihrem Listener "Named-Event-Broadcast" empfangen. Beachten Sie, dass der Absender keine eigene Sendung empfängt.
quelle
Ich bin kürzlich auf dieses Problem gestoßen, bei dem ich mithilfe von Websocket in einem PHP-basierten Codeigniter-Projekt zwischen Client und Server kommunizieren muss.
Ich habe dieses Problem behoben, indem ich meinen Port (auf dem die Knoten-App ausgeführt wird) zu
Allow incoming TCP ports
&Allow outgoing TCP ports
list hinzugefügt habe .Sie finden diese Konfigurationen im
Firewall Configurations
WHM-Bereich Ihres Servers.quelle
Ich suchte nach den gleichen Informationen. Schließlich fand die Antwort von dem Link auf die Antwort oben von @Straseus
http://arguments.callee.info/2010/04/20/running-apache-and-node-js-together/
Hier ist die endgültige Lösung, um die Apache-Website auf Port 80, den Knoten-JS-Dienst auf Port 8080 auszuführen und .htaccess RewriteRule zu verwenden
Fügen Sie im DocumentRoot der Apache-Website Folgendes hinzu:
Für die Umleitung auf Verzeichnisebene schlug der Link oben die (. +) Regel vor, die ein oder mehrere Zeichen nach dem 'Knoten /' erfordert. Ich musste es in (. *) Konvertieren, was null oder mehr ist, damit meine Sachen funktionieren.
Vielen Dank für den Link @Straseus
quelle
mod_proxy
aktiviert sein muss.ProxyPass
?Ich gehe davon aus, dass Sie eine Web-App erstellen, weil Sie sich auf Apache und Node beziehen. Schnelle Antwort - Ist es möglich - JA. Wird es empfohlen - NEIN. Node bündelt seinen eigenen Webserver und die meisten Websites laufen auf Port 80. Ich gehe auch davon aus, dass es derzeit kein Apache-Plugin gibt, das von Nodejs unterstützt wird, und ich bin nicht sicher, ob das Erstellen eines virtuellen Hosts der beste Weg ist, dies zu implementieren. Dies sind die Fragen, die von Entwicklern beantwortet werden sollten, die Nodejs wie die guten Leute bei Joyent pflegen.
Anstelle von Ports ist es besser, den Tech-Stack von Node zu bewerten, der sich von den meisten anderen völlig unterscheidet. Deshalb liebe ich ihn, aber er beinhaltet auch einige Kompromisse, die Sie im Voraus kennen sollten.
Ihr Beispiel ähnelt einem CMS oder einer Freigabe-Webanwendung, und es stehen Hunderte von sofort einsatzbereiten Apps zur Verfügung, die unter Apache problemlos ausgeführt werden können. Selbst wenn Sie keine vorgefertigte Lösung mögen, können Sie eine Webanwendung in PHP / Java / Python schreiben oder sie mit einigen vorgefertigten Apps kombinieren, die alle so konzipiert und unterstützt werden, dass sie hinter einer einzelnen Instanz von Apache ausgeführt werden.
Es ist Zeit innezuhalten und darüber nachzudenken, was ich gerade gesagt habe.
Jetzt können Sie entscheiden, welchen Techstack Sie verwenden möchten. Wenn Ihre Website niemals eine der Tausenden von vorgefertigten Apps verwendet, für die Apache erforderlich ist, wählen Sie Node. Andernfalls müssen Sie zuerst die zuvor genannten Annahmen beseitigen.
Am Ende ist Ihre Wahl des Techstacks viel wichtiger als jede einzelne Komponente.
Ich stimme @Straseus voll und ganz zu, dass es relativ trivial ist, die Dateisystem-API von node.js für die Verarbeitung von Uploads und Downloads zu verwenden, aber überlegen Sie sich auf lange Sicht mehr, was Sie von Ihrer Website erwarten, und wählen Sie dann Ihren Techstack aus.
Das Lernen des Node-Frameworks ist einfacher als das Erlernen anderer Frameworks, aber kein Allheilmittel. Mit etwas mehr Aufwand (was an sich schon ein lohnendes Unterfangen sein kann) können Sie auch jedes andere Framework lernen. Wir alle lernen voneinander und Sie werden produktiver, wenn Sie als kleines Team arbeiten, als wenn Sie alleine arbeiten, und Ihre technischen Fähigkeiten im Backend werden sich auch schneller entwickeln. Reduzieren Sie daher die Fähigkeiten anderer Mitglieder Ihres Teams nicht so billig.
Dieser Beitrag ist ungefähr ein Jahr alt und es besteht die Möglichkeit, dass Sie sich bereits entschieden haben, aber ich hoffe, dass mein Schimpfen der nächsten Person hilft, die eine ähnliche Entscheidung trifft.
Danke fürs Lesen.
quelle