web-dev-qa-db-fra.com

Apache et Node.js sur le même serveur

Je veux utiliser Node parce que c'est Swift, qu'il utilise le même langage que j'utilise côté client et que, par définition, il ne bloque pas. Mais le gars que j'ai engagé pour écrire le programme pour la gestion des fichiers (sauvegarde, édition, renommer, télécharger, télécharger des fichiers, etc.), il veut utiliser Apache. Alors, je dois:

  1. Le convaincre d'utiliser Node (il cède peu de terrain à ce sujet)

  2. Découvrez comment télécharger, télécharger, renommer, enregistrer, etc. des fichiers dans un noeud ou

  3. Je dois installer Apache et noeud sur le même serveur.

Quelle est la situation la plus favorable et comment puis-je la mettre en œuvre?

334
Matt

Excellente question!

Il existe de nombreux sites Web et applications Web gratuits implémentés dans PHP et fonctionnant sous Apache. Beaucoup de personnes l'utilisent pour vous permettre de créer quelque chose d'assez simple. De plus, c'est un moyen simple de servir du contenu statique. Node est rapide, puissant, élégant et sexy avec la puissance brute du V8 et une pile plate sans dépendances intégrées.

Je veux aussi la facilité/flexibilité d'Apache et le grognement et l'élégance de Node.JS, , pourquoi ne puis-je pas avoir les deux ?

Heureusement avec la directive ProxyPass dans Apache httpd.conf, il n’est pas trop difficile de diriger toutes les demandes sur une URL particulière de votre application Node.JS.

ProxyPass /node http://localhost:8000

Assurez-vous également que les lignes suivantes ne sont PAS commentées afin d’obtenir le bon proxy et le bon sous-module pour rediriger les requêtes http:

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so

Ensuite, lancez votre application Node sur le port 8000!

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');

Ensuite, vous pouvez accéder à toute la logique de Node.JS en utilisant le chemin /node/ de votre URL. Le reste du site Web peut être laissé à Apache pour héberger vos pages PHP existantes:

enter image description here

Maintenant, il ne reste plus qu'à convaincre votre hébergeur de vous laisser utiliser cette configuration !!!

678
Steven de Salas

Cette question appartient plus à Server Fault mais FWIW je dirais qu'exécuter Apache devant Node.js n'est pas une bonne approche dans la plupart des cas.

ProxyPass d'Apache est génial pour de nombreuses choses (comme exposer les services basés sur Tomcat dans le cadre d'un site) et si votre application Node.js joue seulement un petit rôle spécifique ou est un outil interne qui ne risque que d'avoir un nombre limité d'utilisateurs alors il sera peut-être plus facile de l'utiliser pour pouvoir le faire fonctionner et passer à autre chose, mais cela ne semble pas être le cas ici.

Si vous souhaitez tirer parti des performances et de l’échelle que vous obtiendrez grâce à Node.js - et plus particulièrement si vous souhaitez utiliser quelque chose impliquant le maintien d’une connexion persistante telle que les sockets Web - vous ferez mieux d’exécuter Apache et votre nœud. js sur d’autres ports (par exemple, Apache sur localhost: 8080, Node.js sur localhost: 3000), puis exécuter un serveur tel que nginx, Varnish ou un proxy HA en face avant - et acheminer le trafic de cette manière.

Avec quelque chose comme vernis ou nginx, vous pouvez router le trafic en fonction du chemin et/ou de l'hôte. Ils utilisent tous deux beaucoup moins de ressources système et sont beaucoup plus évolutifs que d’utiliser Apache pour faire la même chose.

58
Iain Collins


Instructions pour exécuter node server le long de Apache2(v2.4.xx) server:

Afin de diriger toutes les demandes sur une URL particulière vers votre application Node.JS, créez le fichier CUSTOM.conf dans le répertoire /etc/Apache2/conf-available et ajoutez la ligne suivante au fichier créé:

ProxyPass /node http://localhost:8000/

Remplacez 8000 par le numéro de port préféré pour node server.
Activer les configurations personnalisées avec la commande suivante:

$> Sudo a2enconf CUSTOM

CUSTOM est votre nom de fichier nouvellement créé, sans extension, puis activez proxy_http avec la commande:

$> Sudo a2enmod proxy_http

il devrait activer les modules proxy et proxy_http. Vous pouvez vérifier si le module est activé ou non avec:

$> Sudo a2query -m MODULE_NAME

Une fois la configuration et les modules activés, vous devrez redémarrer le serveur Apache:

$> Sudo service Apache2 restart

Maintenant, vous pouvez exécuter le serveur de noeud. Toutes les demandes au URL/node seront traitées par le serveur de noeud.

31
krmld

Exécuter Node et Apache sur un serveur est trivial car ils ne sont pas en conflit. NodeJS est juste un moyen d'exécuter le côté serveur JavaScript. Le véritable dilemme vient d’avoir accès à Node et à Apache de l’extérieur. À mon avis, vous avez deux choix:

  1. Configurez Apache pour envoyer par proxy toutes les demandes correspondantes à NodeJS, qui se chargera du téléchargement du fichier et de tout autre élément du nœud.

  2. Utilisez Apache et Node sur différentes combinaisons IP: port (si votre serveur a deux adresses IP, l'une peut être liée à votre écouteur de nœud, l'autre à Apache).

Je commence aussi à penser que cela pourrait ne pas être ce que vous recherchez réellement. Si votre objectif final est d’écrire votre logique d’application dans Nodejs et une partie du "traitement de fichier" que vous transférez à un contractant, c’est vraiment un choix de langue, pas un serveur Web.

15
Yarek T

vous pouvez utiliser une approche différente, telle que l'écriture d'un serveur proxy inverse avec nodejs pour approvisionner à la fois Apache et toutes les autres applications nodejs.

tout d'abord, vous devez faire fonctionner Apache sur un autre port que le port 80. ex: port 8080

alors vous pouvez écrire un script de proxy inverse avec nodejs comme:

var proxy = require('redbird')({port: 80, xfwd: false);

proxy.register("mydomain.me/blog", "http://mydomain.me:8080/blog");
proxy.register("mydomain.me", "http://mydomain.me:3000");

l’article suivant décrit l’ensemble du processus de création.

http://wathmal.xyz/run-Apache-with-node-js-reverse-proxy/

9
wathmal
ProxyPass /node http://localhost:8000/     
  • cela a fonctionné pour moi quand j'ai fait l'entrée ci-dessus dans httpd-vhosts.conf au lieu de httpd.conf
  • J'ai XAMPP installé sur mon environnement et je cherchais à toucher tout le trafic sur Apache sur le port 80 avec l'application NodeJS s'exécutant sur le port 8080, c'est-à-dire http: // localhost/[name_of_the_node_application]
0
rahul shukla