web-dev-qa-db-fra.com

Exécuter Node.js dans Apache?

Nous avons un serveur Web Apache installé sur une machine qui sert également des pages utilisant Perl.

Pour un projet, j'ai décidé d'utiliser Node.js au lieu de Perl/Ruby. Je me demandais simplement s'il était possible d'utiliser Apache comme serveur Web (afin de servir les pages) et d'utiliser Node.js pour créer dynamiquement les pages Web (ceci est pour une application Web que je crée)?

En d'autres termes, peuvent-ils travailler main dans la main, tout comme Apache/Perl ou Apache/PHP, etc.

66
JackSparrow123

L'hébergement d'un site nodejs via Apache peut être organisé avec le module proxy Apache.

Il est préférable de démarrer le serveur nodejs sur localhost avec le port par défaut 1337

Activer le proxy avec une commande:

Sudo a2enmod proxy proxy_http

N'activez pas le proxy avec ProxyRequests tant que votre serveur n'est pas sécurisé. Les serveurs proxy ouverts sont dangereux pour votre réseau et pour Internet. Définir ProxyRequests sur Off ne désactive pas l'utilisation de la directive ProxyPass.

Configurez/etc/apche2/sites-disponible avec

<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>

et redémarrez le service Apache2.

63
Evgeny Karpov

Non. NodeJS n’est pas disponible en tant que module Apache à l’instar de mod-Perl et de mod-php. Il n’est donc pas possible d’exécuter un nœud "au-dessus de" Apache. Comme hexist l'a fait remarquer, il est possible d'exécuter un noeud en tant que processus séparé et d'organiser la communication entre les deux, mais cela est assez différent de la pile LAMP que vous utilisez déjà.

En remplacement d'Apache, node offre des avantages en termes de performances si vous avez plusieurs connexions simultanées. Il existe également un vaste écosystème de modules pour presque tout ce que vous pouvez penser.

D'après votre question, il n'est pas clair si vous devez générer de manière dynamique des pages pour chaque demande ou simplement générer du nouveau contenu périodiquement pour la mise en cache et la diffusion. Si c'est le dernier cas, vous pouvez utiliser une tâche de noeud distincte pour générer du contenu dans un répertoire qu'Apache servirait, mais là encore, c'est assez différent de PHP ou de Perl.

Le nœud n'est pas le meilleur moyen de servir du contenu statique. Nginx et Varnish sont plus efficaces à cela. Ils peuvent servir du contenu statique tandis que Node gère les données dynamiques.

Si vous envisagez d'utiliser un nœud pour une application Web, Express devrait figurer en bonne place sur votre liste. Vous pouvez implémenter une application Web uniquement dans Node, mais Express (et des frameworks similaires tels que Flatiron, Derby et Meteor) sont conçus pour soulager une bonne partie de la douleur et de l’ennui. Bien que la documentation d’Express puisse sembler un peu maigre au début, jetez un œil aux projections d’écrans qui sont toujours disponibles ici: http://expressjs.com/2x/screencasts.html Elles vous en donneront une bonne sens de ce que propose Express et pourquoi il est utile. Le référentiel github pour ExpressJS contient également de nombreux bons exemples, de l'authentification à l'organisation de votre application.

41
Darren

Bien qu'il y ait beaucoup de bons conseils ici, j'aimerais répondre à la question que vous avez posée:

En d'autres termes, peuvent-ils travailler main dans la main, tout comme Apache/Perl ou Apache/PHP, etc.

[~ # ~] yes [~ # ~] , vous pouvez exécuter Node.js sur Apache aux côtés de Perl et PHP [~ # ~] si [~ # ~] vous l'exécutez en tant que module CGI. Pour l'instant, je ne parviens pas à trouver de nœud de modification pour Apache, mais vérifiez: CGI-Node pour Apache ici http: //www.cgi-node.org/ .

La partie intéressante à propos de cgi-node est qu’il utilise JavaScript exactement comme vous le feriez avec PHP pour générer du contenu dynamique, gérer des pages statiques, accéder à une base de données SQL, etc. Vous pouvez même partager bibliothèques JavaScript essentielles entre le serveur et le client/navigateur.

Je pense que le passage à une langue unique entre le client et le serveur est en cours et que JavaScript semble être un bon candidat.

Un exemple rapide tiré du site 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>

Cela génère:

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

Vous avez également un accès complet à la requête HTTP. Cela inclut les formulaires, les fichiers téléchargés, les en-têtes, etc.

J'exécute actuellement Node.js via le module cgi-node de Godaddy.

Le site CGI-Node.org a toute la documentation pour commencer.

Je sais que je délire à ce sujet, mais le fait d’utiliser autre chose que PHP est enfin un soulagement. En outre, pour pouvoir coder JavaScript sur le client et le serveur.

J'espère que cela t'aides.

22
Uei Richo

La méthode habituelle pour faire ce que vous cherchez à faire est de les exécuter côte à côte et de demander proxy à Apache vers node.js en fonction de domain/url, ou simplement de faire extraire votre contenu de node.js du nœud. port js. Cette dernière méthode fonctionne très bien pour avoir des choses comme des widgets alimentés par socket.io sur votre site, etc.


Cependant, si vous envisagez de créer toute la génération de contenu dynamique dans node, vous pouvez également utiliser node.js comme serveur Web principal. Il est très efficace pour répondre aux demandes http statiques et dynamiques.

Voir:

http://expressjs.com/

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

4
hexist

En faisant mes propres expériences JS côté serveur, j'ai fini par utiliser teajs . Il est conforme à common.js , est basé sur V8 AND est le seul projet que je connaisse qui fournit le module serveur Apache 'mod_teajs'.

À mon avis, le serveur Node.js n’est pas prêt pour la production et manque de fonctionnalités - Apache est testé pour le combat et la bonne façon de réaliser SSJS.

0
Daniel Sokolowski

Vous pouvez toujours faire quelque chose comme Shell-script comme:

#!/usr/bin/node

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

exit;
0
Xaphiero