Question

J'exécute Nodejs et Apache côte à côte.

node-http-proxy écoute sur le port 80 puis transfère les requêtes vers Apache (: 9000) ou vers Express (: 8000).

Mes hôtes virtuels sur Apache ressemblent à:

<VirtualHost 127.0.0.1>
    DocumentRoot "/localhost/myVhost"
    ServerName myVhost
</VirtualHost>

Ma question est la suivante: quelle est la "bonne" façon d'avoir des fonctionnalités similaires à vhost du côté d'Express / Nodejs? Je préférerais ne pas avoir à placer chaque application Nodejs sur son propre port comme cela est suggéré ici:

https://github.com/nodejitsu/node-http-proxy (Section intitulée "Demandes de proxy utilisant un ProxyTable" Nom d'hôte uniquement ")

J'ai remarqué que Connect (qui, d'après ce que je comprends, est intégré dans Express) a des fonctionnalités vhosts. Dois-je utiliser ça? Si tel est le cas, quelle serait la bonne façon de l'exécuter avec node-http-proxy?

http://www.senchalabs.org/connect/middleware-vhost.html

J'ai également remarqué cet autre module appelé "Cluster", il semble lié mais je ne sais pas comment:

http://learnboost.github.com/cluster/

Tout en ne voulant pas submerger, j'en suis également tombé sur un appelé, "Haibu", il semble être lié, mais je ne suis pas sûr qu'il s'agirait simplement d'un remplacement complet de l'utilisation de vhosts:

https://github.com/nodejitsu/haibu

Remarque: je suis un utilisateur du front-end, donc je ne connais pas beaucoup la terminologie des serveurs

Était-ce utile?

La solution

Je n'ai jamais découvert Haibu ou Cluster. Mais j'ai trouvé une bonne solution pour résoudre mon problème. À ma grande surprise, c'était en fait assez simple. Cependant, je ne connais pas grand chose aux serveurs, donc même si cela fonctionne, ce n'est peut-être pas optimal.

J'ai configuré des hôtes virtuels comme d'habitude sur Apache (http://httpd.apache.org/docs/2.0/vhosts/examples.html)

J'ai installé ce qui suit sur Node

  • Express (http://expressjs.com/)
  • proxy-node-http (https://github.com/nodejitsu/node-http-proxy)

Ensuite, par souci de style personnel, j'ai placé tous mes hôtes virtuels dans un répertoire commun (/ localhost)

J'ai ensuite basculé Apache pour écouter sur un port autre que le port 80. Il m'est arrivé de choisir le port 9000 parce que j'avais vu cela utilisé quelque part. (Dans httpd.conf, remplacez "Listen 80" par "Listen 9000"). Je devais également m'assurer que tous mes hôtes virtuels, tels que définis dans extra / httpd-vhosts.conf, étaient définis sur un nom basé sur IPVirtualHost (127.0.0.1) au lieu d'utiliser un port (*: 80).

Côté Node, j'ai créé mon application / serveur (aka node virtual host) qui écoutait sur le port 8000 (choix quelque peu arbitraire du numéro de port) Voir ce lien sur la création d'un serveur avec express: http://expressjs.com/guide.html

Dans mon répertoire / localhost, j'ai ensuite créé un fichier appelé "nodeHttpProxy.js"

En utilisant node-http-proxy, dans nodeHttpProxy.js j'ai ensuite créé un serveur proxy qui écoute sur le port 80. En utilisant express, qui encapsule connect (http://www.senchalabs.org/connect/) j'ai créé mon virtuel hôtes.

Le fichier nodeHttpProxy.js ressemble à ceci:

// Module dependancies
var httpProxy = require('/usr/local/lib/node_modules/http-proxy/lib/node-http-proxy')
, express = require('/usr/local/lib/node_modules/express/lib/express');

// Http proxy-server
httpProxy.createServer(function (req, res, proxy) {

    // Array of node host names
    var nodeVhosts = [
        'vhost1'
        , 'vhost2'
    ]
    , host = req.header('host')
    , port = nodeVhosts.indexOf(host) > -1
        ? 8000
        : 9000;

    // Now proxy the request
    proxy.proxyRequest(req, res, {
        host: host
        , port: port
    });
})
.listen(80);

// Vhosts server
express.createServer()
.use(express.vhost('vhost1', require('./vhost1/app')))
.use(express.vhost('vhost2', require('./vhost2/app')))
.app.listen(8000);

Comme vous pouvez le voir, je vais devoir faire deux choses à chaque fois que je crée un nouvel hôte virtuel Node:

  1. ajouter le nom d'hôte virtuel à mon tableau "nodeVhosts"
  2. définir un nouvel hôte virtuel express à l'aide de la méthode .set

Bien sûr, je devrai également créer le chemin / fichiers de l'hôte réel dans mon répertoire / localhost.

Une fois que tout cela est fait, il me suffit d'exécuter nodeHttpProxy.js:

node nodeHttpProxy.js

Vous pourriez obtenir une erreur étrange "EACCESS", auquel cas, exécutez simplement en tant que sudo.

Il écoutera sur le port 80, et si l'hôte correspond à l'un des noms du tableau nodeVhosts, il transmettra la demande à cet hôte sur le port 8000, sinon il la transmettra à cet hôte sur le port 9000.

/ p>

Autres conseils

J'ai réfléchi à cela ces derniers temps alors que j'aborde les mêmes problèmes dans mon environnement de test personnel. Vous n'allez pas pouvoir vous passer de l'exécution de chaque application de nœud sur son propre port, mais vous pouvez éviter la douleur de ce processus. Voici ce que j'utilise actuellement, mais j'espère créer un package npm autour de cela pour simplifier les choses à l'avenir.

Chacune de mes applications node.js a un fichier de carte qui contient le port sur lequel l'application écoute ainsi qu'une carte qui indique le chemin attendu sur lequel l'application est servie. Le contenu du fichier ressemble à ceci:

{"path": "domain.com/path", "port": 3001}

Lorsque je lance mon application, elle lit le port à partir du fichier map.json et écoute sur le port spécifié.

var map = fs.readFileSync('map.json', 'ascii');
app.listen(map.port);

Ensuite, dans ma configuration de proxy, j'itère sur chacun de mes répertoires d'application node.js et je recherche un fichier map.json qui indique que le trafic du port 80 doit être envoyé par proxy à cette application.

J'utilise presque exactement la même méthode pour configurer le proxy pour nos applications hébergées sur Apache. Nous utilisons une convention basée sur les dossiers sur les sites Web PHP que nous servons et elle utilise la configuration suivante:

VirtualDocumentRoot /var/www/%-2.0.%-1/%-3+/
VirtualScriptAlias /var/www/%-2.0.%-1/%-3+/cgi-bin/

Cela nous permet essentiellement de mapper des domaines à des dossiers en utilisant la structure suivante.

http://sub.domain.com/ = /var/www/domain.com/sub/

Aucune configuration supplémentaire n'est requise pour ajouter ou supprimer des sites. C'est très proche de ce que j'utilise actuellement pour proxy à la fois des sites Apache et des nœuds. Je peux ajouter un nouveau nœud et de nouveaux sites Apache sans modifier cette application proxy.

<❯proxy.js

var fs = require('fs');
var httpProxy = require('http-proxy');

var proxyTable = [];

// Map apache proxies
fs.readdirSync('/var/www/').forEach(function(domain) {
    fs.readdirSync('/var/www/' + domain).forEach(function(path) {
        var fqd = domain + '/' + path;
        var port = fs.readFileSync('port', 'ascii');
        proxyTable[fqd] = fqd + ':' + 8080;
    });
});    

// Map node proxies
fs.readdirSync('/var/www-node/').forEach(function(domain) {
        var map = fs.readFileSync('map.json', 'ascii');
        proxyTable.[map.path] = '127.0.0.1:' + map.port;
});

var options = {
    router: proxyTable
};

var proxyServer = httpProxy.createServer(options);
proxyServer.listen(80);

À l'avenir, je découplerai probablement le chemin du port sur lequel l'application écoute, mais cette configuration me permet de créer automatiquement la carte proxy avec très peu de travail. J'espère que cela vous aidera.

Je me suis inspiré de @uglymunky et j'ai écrit un script de chef pour faire cela sur Ubuntu.

https://github.com/toranb/ubuntu-web-server

Si vous avez installé git et que vous le tirez vers le bas, vous pouvez le lancer comme ça ...

sudo ./install.sh configuration.json

Cela nécessite Ubuntu 12.04 ou supérieur car j'ai profité d'un script upstart pour démarrer le nœud lorsque vous redémarrez la machine

Lorsque le script est terminé, vous aurez un serveur Web ubuntu fonctionnel avec express pour exécuter toutes les applications de nœud que vous avez configurées, ainsi qu'apache pour exécuter toutes les applications wsgi que vous avez configurées

Je travaille sur une bibliothèque extrêmement minimale et précise qui peut être totalement séparée de vos projets.En gros, l'idée serait de l'exécuter indépendamment sur vos serveurs et de ne jamais vous inquiéter d'avoir à regrouper cela dans vos projets comme vous le feriez avec vous connecter.

Jetez un œil au fichier config.json pour voir à quel point sa configuration est simple.

Je cherchais ceci et j'ai trouvé quelques éléments, mais ils ne supportaient pas tout ce dont j'avais besoin, à savoir HTTPS, WS et WSS!

Pour le moment, la bibliothèque que j'ai écrite ne fonctionne que pour HTTP.Mais dans les prochains jours, j'espère l'avoir terminé et fonctionner également pour HTTPS, WS et WSS.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top