391 votes

Apache et Node.js sur le même serveur

Je veux utiliser Node parce qu'il est rapide, qu'il utilise le même langage que celui que j'utilise du côté client et qu'il est non bloquant par définition. Mais le gars que j'ai engagé pour écrire le programme pour la gestion des fichiers (sauvegarde, édition, renommage, téléchargement, upload de fichiers, etc.), il veut utiliser apache. Donc, je dois le faire :

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

  2. Découvrez comment charger, télécharger, renommer, sauvegarder, etc. des fichiers dans un nœud ou dans une base de données.

  3. Je dois installer apache et node sur le même serveur.

Quelle est la situation la plus favorable, et comment la mettre en œuvre ?

758voto

Steven de Salas Points 4611

Excellente question !

Il y a beaucoup de sites web et d'applications web libres implémentés en PHP qui tournent sur Apache, beaucoup de gens l'utilisent donc vous pouvez facilement faire un mash up et en plus, c'est une façon simple de servir du contenu statique. Node est rapide, puissant, élégant, et un outil sexy avec la puissance brute de V8 et une pile plate sans dépendances intégrées.

Je souhaite également bénéficier de la facilité et de la souplesse d'Apache, mais aussi de la rigueur et de l'élégance de Node.JS, pourquoi je ne peux pas avoir les deux ?

Heureusement, avec le ProxyPass dans la directive Apache httpd.conf Il n'est pas très difficile de canaliser toutes les demandes sur une URL particulière vers 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 submodule pour rerouter les requêtes http :

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

Ensuite, exécutez 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 Node.JS en utilisant l'option /node/ sur votre url, le reste du site 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 fonctionner avec cette configuration ! !!

6 votes

C'était une excellente réponse, je voulais juste ajouter un lien avec un peu plus d'informations sur le proxy pass que j'ai utilisé pour que cela fonctionne. Consultez également les commentaires. boriskuzmanovic.wordpress.com/2006/10/20/

1 votes

@Steven Je n'ai jamais pensé que nous pourrions utiliser le module Proxy pour fournir une solution aussi élégante !

12 votes

J'ai testé en mettant "ProxyPass / 127.0.0.1:8000 "à l'intérieur d'un conteneur d'hôte virtuel et j'ai pu rediriger avec succès un groupe de domaines entier vers une instance de nœud. J'ai également testé avec "time wget..." pour comparer la vitesse d'accès au nœud directement à celle de l'accès via Apache. Sur 30 paires d'essais, la différence moyenne était d'environ 0,56ms. Le temps de chargement le plus bas était de 120ms pour les deux accès directs et via Apache. Le temps de chargement le plus élevé était de 154 ms pour l'accès direct et de 164 ms pour l'accès via Apache. La différence n'est pas significative. Si j'avais le luxe d'avoir deux IPs, je ne routerais pas via Apache, mais pour l'instant je vais rester avec Proxypass.

82voto

Iain Collins Points 2296

Cette question relève plutôt de Défaut du serveur mais 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 beaucoup de choses (comme l'exposition de services basés sur Tomcat dans le cadre d'un site) et si votre application Node.js ne joue qu'un petit rôle spécifique ou s'il s'agit d'un outil interne qui n'est susceptible d'avoir qu'un nombre limité d'utilisateurs, il peut être plus facile de l'utiliser pour le faire fonctionner et passer à autre chose, mais cela ne semble pas être le cas ici.

Si vous voulez profiter des performances et de l'échelle que vous obtiendrez en utilisant Node.js - et surtout si vous voulez utiliser quelque chose qui implique le maintien d'une connexion persistante comme les sockets web - il vaut mieux faire tourner Apache et votre Node.js sur d'autres ports (par exemple Apache sur localhost:8080, Node.js sur localhost:3000) et ensuite faire tourner quelque chose comme nginx, Varnish ou HA proxy devant - et acheminer le trafic de cette façon.

Avec quelque chose comme varnish ou nginx, vous pouvez acheminer 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 qu'Apache pour faire la même chose.

16 votes

Cette réponse devrait avoir plus de votes positifs. c'est définitivement une meilleure approche d'utiliser le proxy nginx que celui d'apache.

0 votes

Oui, mais cela demande beaucoup de ressources

1 votes

Avez-vous des chiffres à l'appui de votre affirmation selon laquelle nginx serait moins gourmand en ressources que httpd ?

17voto

Yarek T Points 3105

Faire tourner Node et Apache sur un serveur est trivial car ils ne sont pas en conflit. NodeJS est juste un moyen d'exécuter JavaScript côté serveur. Le vrai dilemme vient de l'accès à la fois à Node et Apache de l'extérieur. Comme je le vois, vous avez deux choix :

  1. Configurez Apache pour qu'il envoie toutes les requêtes correspondantes à NodeJS, qui se chargera du téléchargement des fichiers et de tout le reste dans node.

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

Je commence également à penser que ce n'est peut-être pas ce que vous recherchez. Si votre objectif final est d'écrire la logique de votre application en Nodejs et de confier une partie de la "gestion des fichiers" à un sous-traitant, alors il s'agit vraiment d'un choix de langage, pas d'un serveur web.

-1voto

pd1980 Points 19

J'étais à la recherche de la même information. J'ai finalement trouvé la réponse à partir du lien sur la réponse ci-dessus par @Straseus

http://arguments.callee.info/2010/04/20/running-apache-and-node-js-together/

Voici la solution finale pour exécuter le site web apache sur le port 80, le service node js sur le port 8080 et utiliser .htaccess RewriteRule

Dans le DocumentRoot du site web d'apache, ajoutez ce qui suit :

Options +FollowSymLinks -MultiViews

<IfModule mod_rewrite.c>

RewriteEngine on

# Simple URL redirect:
RewriteRule ^test.html$ http://arguments.callee.info:8000/test/ [P]

# More complicated (the user sees only "benchmark.html" in their address bar)
RewriteRule ^benchmark.html$ http://arguments.callee.info:8000/node?action=benchmark [P]

# Redirect a whole subdirectory:
RewriteRule ^node/(.*) http://arguments.callee.info:8000/$1 [P]

Pour la redirection au niveau du répertoire, le lien ci-dessus suggère la règle (.+), qui nécessite un ou plusieurs caractères après le 'node/'. J'ai dû la convertir en (.*) qui est zéro ou plus pour que mon truc fonctionne.

Merci beaucoup pour le lien @Straseus

3 votes

Notez que l'option [P] nécessite l'utilisation de l'option d'Apache mod_proxy pour être activé.

0 votes

C'est inefficace. Pourquoi invoquer le moteur Rewrite sur un simple ProxyPass ?

-4voto

RHT Points 2022

Je suppose que vous créez une application web car vous faites référence à Apache et Node. Réponse rapide - Est-ce possible - OUI. Est-ce recommandé - NON. Node intègre son propre serveur web et la plupart des sites web fonctionnent sur le port 80. Je suppose également qu'il n'y a pas actuellement de plugin Apache qui est pris en charge par Nodejs et je ne suis pas sûr que la création d'un hôte virtuel est la meilleure façon de mettre en œuvre cela. Ce sont les questions qui devraient être répondues par les développeurs qui maintiennent Nodejs comme les bonnes gens de Joyent.

Au lieu des ports, il serait préférable d'évaluer la pile technologique de Node qui est complètement différente de la plupart des autres et qui est la raison pour laquelle je l'aime mais elle implique également quelques compromis dont vous devez être conscient à l'avance.

Votre exemple ressemble à un CMS ou à une application web de partage et il existe des centaines d'applications prêtes à l'emploi qui fonctionnent parfaitement avec Apache. Même si vous n'aimez pas les solutions prêtes à l'emploi, vous pouvez écrire une application web en PHP / Java / Python ou la combiner avec quelques applications prêtes à l'emploi, et elles sont toutes conçues et supportées pour fonctionner derrière une seule instance d'Apache.

Il est temps de faire une pause et de réfléchir à ce que je viens de dire.

Vous êtes maintenant prêt à décider de la techstack que vous allez utiliser. Si votre site web n'utilisera jamais aucune des milliers d'applications prêtes à l'emploi qui nécessitent Apache, alors optez pour Node, sinon vous devez d'abord éliminer les hypothèses que j'ai énoncées précédemment.

En fin de compte, le choix de votre techstack est bien plus important que n'importe quel composant individuel.

Je suis tout à fait d'accord avec @Straseus sur le fait qu'il est relativement trivial d'utiliser l'api du système de fichiers node.js pour gérer les chargements et les téléchargements, mais réfléchissez davantage à ce que vous attendez de votre site Web à long terme et choisissez ensuite votre technologie.

Apprendre le cadre de Node est plus facile que d'apprendre d'autres cadres, mais ce n'est pas une panacée. Avec un peu plus d'effort (ce qui peut être un effort valable en soi), vous pouvez aussi apprendre n'importe quel autre framework. Nous apprenons tous les uns des autres et vous serez plus productif si vous travaillez en petite équipe que si vous travaillez seul et vos compétences techniques backend se développeront également plus rapidement. Par conséquent, ne sous-estimez pas les compétences des autres membres de votre équipe.

Ce post date d'environ un an et il y a de fortes chances que vous ayez déjà pris votre décision, mais j'espère que mon coup de gueule aidera la prochaine personne qui doit prendre une décision similaire.

Merci de votre lecture.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X