Node.js in Apache ausführen?

78

Wir haben einen Apache Webserver auf einem Computer installiert, der auch Seiten mit Perl bedient.

Für ein Projekt habe ich mich entschieden, Node.js anstelle von Perl / Ruby zu verwenden. Sie fragen sich nur, ob es möglich ist, Apache als meinen Webserver zu verwenden (damit es die Seiten bedient) und Node.js zum dynamischen Erstellen der Webseiten zu verwenden (dies ist für eine Web-App, die ich erstelle)?

Mit anderen Worten, können sie Hand in Hand arbeiten, genau wie Apache / Perl oder Apache / PHP usw.

JackSparrow123
quelle

Antworten:

73

Das Hosten einer NodeJS-Site über Apache kann mit dem Apache-Proxy-Modul organisiert werden.

Es ist besser, den nodejs-Server auf localhost mit dem Standardport 1337 zu starten

Aktivieren Sie den Proxy mit einem Befehl:

sudo a2enmod proxy proxy_http

Aktivieren Sie das Proxying mit ProxyRequests erst, wenn Sie Ihren Server gesichert haben. Offene Proxyserver sind sowohl für Ihr Netzwerk als auch für das Internet insgesamt gefährlich. Wenn Sie ProxyRequests auf Off setzen, wird die Verwendung der ProxyPass-Direktive nicht deaktiviert.

Konfigurieren Sie / etc / apche2 / sites-available mit

<VirtualHost *:80>
    ServerAdmin [email protected]
    ServerName site.com
    ServerAlias www.site.com 

    ProxyRequests off

    <Proxy *>
        Order deny,allow
        Allow from all
    </Proxy>

    <Location />
        ProxyPass http://localhost:1337/
        ProxyPassReverse http://localhost:1337/
    </Location>
</VirtualHost>

und starten Sie den Apache2-Dienst neu.

Evgeny Karpov
quelle
3
Erstens - sehr cool. Zweitens - sollte der Standardport für den Knoten wirklich "Elite" sein?
Gerard ONeill
1
Es war nur eine Empfehlung.
Evgeny Karpov
/Ich möchte darauf hinweisen, dass die abschließenden Schrägstriche in den Anweisungen ProxyPass und ProxyPassReverse wichtig sind. Sie erhalten 502 (Proxy Error) Antworten, wenn Sie diese nicht festlegen. Ist einem Freund passiert.
Nicolás Fantone
43

Nein. NodeJS ist nicht wie Mod-Perl und Mod-PHP als Apache-Modul verfügbar, daher ist es nicht möglich, den Knoten "über" Apache auszuführen. Wie Hexist betonte, ist es möglich, den Knoten als separaten Prozess auszuführen und die Kommunikation zwischen den beiden zu arrangieren. Dies unterscheidet sich jedoch erheblich von dem LAMP-Stapel, den Sie bereits verwenden.

Als Ersatz für Apache bietet der Knoten Leistungsvorteile, wenn Sie viele gleichzeitige Verbindungen haben. Es gibt auch ein riesiges Ökosystem von Modulen für fast alles, was Sie sich vorstellen können.

Aus Ihrer Frage geht nicht hervor, ob Sie bei jeder Anforderung Seiten dynamisch generieren müssen oder nur regelmäßig neue Inhalte zum Zwischenspeichern und Bereitstellen generieren müssen. In letzterem Fall können Sie eine separate Knotenaufgabe verwenden, um Inhalte in einem Verzeichnis zu generieren, das Apache bereitstellen würde. Dies unterscheidet sich jedoch erheblich von PHP oder Perl.

Knoten ist nicht der beste Weg, um statische Inhalte bereitzustellen. Nginx und Lack sind dabei effektiver. Sie können statischen Inhalt bereitstellen, während Node die dynamischen Daten verarbeitet.

Wenn Sie in Betracht ziehen, Node überhaupt für eine Webanwendung zu verwenden, sollte Express ganz oben auf Ihrer Liste stehen. Sie könnten eine Webanwendung nur in Node implementieren, aber Express (und ähnliche Frameworks wie Flatiron, Derby und Meteor) sind so konzipiert, dass sie viel Schmerz und Langeweile beseitigen. Obwohl die Express-Dokumentation auf den ersten Blick etwas spärlich wirken kann, sehen Sie sich die hier noch verfügbaren Screenshots an: http://expressjs.com/2x/screencasts.html Sie geben Ihnen einen guten Überblick darüber, was Express anbietet und warum es ist nützlich. Das Github-Repository für ExpressJS enthält auch viele gute Beispiele für alles, von der Authentifizierung bis zur Organisation Ihrer App.

Darren
quelle
1
Danke Darren! Zum Glück ist dieses Projekt längst abgeschlossen!
JackSparrow123
Es ist 2015 und ich habe gerade von Express in diesem Beitrag erfahren. Ich habe mich über die Vor- und Nachteile von Express vs. Meteor gewundert. Express ist bei Google Trends größer als Meteor, nimmt jedoch ab und Meteor wächst.
Irina Rapoport
Zu Ihrer Information, die Leute, die Ihnen Express gebracht haben, entwickeln jetzt Koa. Ich benutze es und liebe es. Die asynchrone / warten-Syntax von JavaScript wird hervorragend genutzt. Dies ist der beste Weg, um asynchron zu arbeiten.
John Deighan
26

Obwohl es hier viele gute Tipps gibt, möchte ich die von Ihnen gestellte Frage beantworten:

Mit anderen Worten, können sie Hand in Hand arbeiten, genau wie Apache / Perl oder Apache / PHP usw.

JA , können Sie Node.js auf Apache an der Seite von Perl und PHP laufen WENN Sie es als CGI - Modul ausgeführt werden . Bis jetzt kann ich keinen Mod-Knoten für Apache finden, aber siehe: CGI-Knoten für Apache hier http://www.cgi-node.org/ .

Der interessante Teil über CGI-Knoten ist, dass es JavaScript genau so verwendet, wie Sie PHP verwenden würden, um dynamischen Inhalt zu generieren, statische Seiten zu warten, auf SQL-Datenbanken zuzugreifen usw. Sie können sogar JavaScript-Kernbibliotheken zwischen dem Server und dem Client / Browser freigeben.

Ich denke, die Umstellung auf eine einzige Sprache zwischen Client und Server findet statt und JavaScript scheint ein guter Kandidat zu sein.

Ein kurzes Beispiel von der Website cgi-node.org:

<? include('myJavaScriptFile.js'); ?>
<html>
   <body>
      <? var helloWorld = 'Hello World!'; ?>
      <b><?= helloWorld ?><br/>
      <? for( var index = 0; index < 10; index++) write(index + ' '); ?>
   </body>
</html>

Dies gibt aus:

Hello World!
0 1 2 3 4 5 6 7 8 9

Sie haben auch vollen Zugriff auf die HTTP-Anforderung. Dazu gehören Formulare, hochgeladene Dateien, Header usw.

Ich führe derzeit Node.js über das CGI-Node-Modul auf Godaddy aus.

Auf der CGI-Node.org-Website finden Sie die gesamte Dokumentation für den Einstieg.

Ich weiß, dass ich davon schwärme, aber es ist endlich eine Erleichterung, etwas anderes als PHP zu verwenden. Außerdem, um JavaScript sowohl auf dem Client als auch auf dem Server codieren zu können.

Hoffe das hilft.

Uei Richo
quelle
Es scheint ein paar Node-CGI-Pakete in freier Wildbahn zu geben - ist CGI-Node dasselbe wie: larsjung.de/node-cgi ? Wenn nicht, würden Sie wissen, welche reifer / vollständiger ist?
Daniel Sokolowski
1
Dies ist genau die Lösung, nach der ich gesucht habe, um dynamische Inhalte auf Dreamhost zu verarbeiten und nicht in PHP zu schreiben. Viva la JavaScript!
Sukima
Diese Antwort beantwortet die gestellte Frage direkter. Gibt es andere Webserver, die in der Lage sind, node.js-Skripte auf dieselbe Weise auszuführen, wie Sie ein PHP-Skript ausführen würden?
Lonnie Best
@uei No Man, ich habe ihre Enitre-Tutorials befolgt, in denen NodeJS installiert sind, aber ich kann die Node-Befehle immer noch nicht über Shell / Terminal ausführen. Es heißt, dass der Knotenbefehl nicht gefunden wurde. Wie haben Sie Ihre index.js-Datei von Godaddy-Servern gestartet? Da es keine Möglichkeit gibt, unsere Serverdatei auszuführen und mit dem Listenting für den Port zu beginnen, es sei denn, wir schreiben einen Befehl auf das Terminal
Faizan
CGI erhöht den Aufwand für die Prozesserstellung . Dieser schlechte Effekt kann mit FastCGI oder dem nativen Apache Node.js-Modul (wie mod_php) reduziert werden . In beiden Fällen - dynamische Javascript-Seiten mit Node.js
stecken noch
5

Die übliche Methode, um das zu tun, was Sie tun möchten, besteht darin, sie nebeneinander auszuführen und entweder Proxy-Anforderungen von Apache an node.js basierend auf Domäne / URL zu senden oder einfach den Inhalt von node.js vom Knoten abzurufen. js port. Diese spätere Methode eignet sich sehr gut für Socket.io-fähige Widgets auf Ihrer Website und dergleichen.


Wenn Sie jedoch die gesamte Generierung dynamischer Inhalte in Node durchführen möchten, können Sie auch node.js als primären Webserver verwenden. Dies ist sehr gut darin, sowohl statische als auch dynamische http-Anforderungen zu bearbeiten.

Sehen:

http://expressjs.com/

https://github.com/joyent/node/wiki/modules

Hexist
quelle
Wenn Sie es neben Apache Node ausführen, sitzt es nicht tatsächlich auf Apache, oder? Wie PHP. Es sind immer noch separate Instanzen. Ist das korrekt? Noch eine Frage ... brauche ich Express, um die dynamischen Seiten zu erstellen, oder kann ich Node.js einfach selbst verwenden? Es scheint nicht viele Informationen über Express zu geben ...
JackSparrow123
Richtig, node.js wird in einem eigenen Prozess ausgeführt. Express kümmert sich um die http-Anfrage, siehe expressjs.com/api.html . Es ist sehr einfach , loszulegen . Diese Hallo-Welt am Anfang der Seite ist alles, was Sie für Ihre erste Seite benötigen. Wenn Sie dynamische Inhalte erstellen möchten, werden Sie wahrscheinlich irgendeine Form von Template - Engine soll den Inhalt erzeugen , dass Sie über Eil zurückkommen werden, finden Sie unter : github.com/joyent/node/wiki/modules#wiki-templating für ein gute Liste von denen.
Hexist
Aber Sie können auch mit reinen Node.js eine Hallo-Welt-Seite erstellen. Hat das Framework Vorteile?
JackSparrow123
Es bietet Ihnen alle Routing-Informationen, die Sie im Wesentlichen von Apache erhalten (obwohl dies etwas flexibler / leistungsfähiger ist).
Hexist
1

Sie können immer etwas Shell-Scripty machen wie:

#!/usr/bin/node

var header = "Content-type: text/plain\n";
var hi = "Hello World from nodetest!";
console.log(header);
console.log(hi);

exit;
Xaphiero
quelle
0

Während ich meine eigenen serverseitigen JS-Experimente durchführte, verwendete ich schließlich teajs . Es entspricht common.js , basiert auf V8 UND ist das einzige mir bekannte Projekt, das das Apache-Servermodul 'mod_teajs' bereitstellt.

Meiner Meinung nach ist der Node.js-Server nicht produktionsbereit und es fehlen zu viele Funktionen - Apache ist kampferprobt und der richtige Weg, um SSJS auszuführen.

Daniel Sokolowski
quelle
0

Wenn Sie PHP verwenden, können Sie Ihre Anforderung über shell_exec an Node-Skripte weiterleiten und Argumente als JSON-Zeichenfolgen in der Befehlszeile an Skripte übergeben. Beispielaufruf:

<?php
    shell_exec("node nodeScript.js"); // without arguments
    shell_exec("node nodeScript.js '{[your JSON here]}'"); //with arguments
?>

Die Einschränkung ist, dass Sie beim Umgang mit Benutzerdaten sehr vorsichtig sein müssen, wenn sie sich in der Nähe einer Befehlszeile befinden. Beispiel Albtraum:

<?php
    $evilUserData = "'; [malicious commands here];";
    shell_exec("node nodeScript.js '{$evilUserData}'");
?>

quelle