Comment utiliser vhosts en parallèle de node-http-proxy?

je dirige Nodejs et Apache ensemble.

noeud-mandataire http-écoute sur le port 80 et transmet ensuite les requêtes à Apache(:9000) ou à Express(:8000).

mes hôtes virtuels sur Apache ressemblent à:

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

ma question Est, Quelle est la" bonne " façon d'avoir la fonctionnalité vhost like du côté Express/Nodejs? Je préfère ne pas avoir à placer chaque Nodejs application sur son propre port est suggéré ici:

https://github.com/nodejitsu/node-http-proxy (Section intitulée "requêtes par procuration utilisant un 'nom D'hôte seulement' ProxyTable")

J'ai remarqué que Connect (qui d'après ce que j'ai compris, est livré en Express) a quelques fonctionnalités vhosts. Dois-je utiliser? Si oui, quelle serait la bonne façon de l'utiliser avec nœud-http-proxy?

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

j'ai aussi remarqué cet autre module appelé "Cluster", il semble être lié mais je ne sais pas comment:

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

bien que ne voulant pas accabler, je suis aussi tombé sur un appelé, "Haibu" il semble être lié, mais je ne suis pas sûr que ce serait juste un remplacement tout dehors pour l'utilisation vhosts:

https://github.com/nodejitsu/haibu

Note: je suis un gars du devant, donc je ne suis pas très familier avec beaucoup de terminologie de serveur

16
demandé sur uglymunky 2012-02-21 01:38:59

4 réponses

Je n'ai jamais compris Haibu ou Cluster. Mais j'ai trouvé une bonne solution adressé ma question. À ma grande surprise, c'était en fait assez simple. Cependant, je ne sais pas grand chose sur les serveurs, donc bien que cela fonctionne, il se peut que ce ne soit pas optimal.

j'ai configuré des serveurs virtuels comme normal sur Apache (http://httpd.apache.org/docs/2.0/vhosts/examples.html)

j'ai installé ce qui suit sur le noeud

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

alors, pour une question de style personnel, j'ai placé tous mes hôtes virtuels dans un répertoire commun (/localhost)

J'ai ensuite commuté Apache pour écouter sur un port autre que le port 80. J'ai juste choisi le port 9000 parce que j'avais vu qu'il était utilisé quelque part. (In httpd.conf, remplacé "Listen 80" par "Listen 9000"). J'ai également eu à assurez-vous que tous mes hôtes virtuels, tels que définis dans extra/httpd-vhosts.conf ont été définis à un nameVirtualHost basé sur IP (127.0.0.1) au lieu d'utiliser un port (*: 80).

du côté du noeud, j'ai créé mon app / server (alias noeud 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 créé un fichier appelé "nodeHttpProxy.js"

l'Aide d'un noeud-http-proxy, dans nodeHttpProxy.js I a alors créé un serveur proxy qui écoute sur le port 80. En utilisant express, qui se connecte (http://www.senchalabs.org/connect/) j'ai créé mes hôtes virtuels.

the nodeHttpProxy.le fichier 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 nouveau noeud hôte virtuel:

  1. ajouter le nom d'hôte virtuel à mon tableau" nodeVhosts
  2. définir un nouveau express hôte virtuel à l'aide de l' .méthode des séries

bien sûr, je vais aussi créer l'hôte réel chemin/fichiers dans mon /localhost répertoire.

une fois que tout cela est fait, je dois juste exécuter nodeHttpProxy.js:

node nodeHttpProxy.js

vous pourriez avoir une erreur "EACCESS" bizarre, dans ce cas, juste exécuter comme sudo.

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

11
répondu uglymunky 2012-03-15 03:59:42

j'y ai réfléchi ces derniers temps, car je m'attaque aux mêmes problèmes dans mon environnement d'essai personnel. Vous n'allez pas être en mesure de vous déplacer en ayant chaque application de noeud tournant sur son propre port, mais vous pouvez abstraire la douleur de ce processus. Voici ce que j'utilise maintenant, mais j'espère construire un paquet npm autour de cela pour simplifier les choses à l'avenir.

chacun de mes noeuds.applications js a un fichier de map qui contient le port que le l'application est à l'écoute ainsi qu'une carte qui indique la trajectoire prévue de laquelle la demande est servi sur. Le contenu du fichier ressemble à ceci:

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

quand je commence mon application, il lira le port de la carte.JSON et écouter sur le port spécifié.

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

puis dans ma configuration de proxy, j'itère sur chacun de mes noeuds.js répertoires d'application, et de vérifier pour une carte.fichier json indiquant le trafic du port 80 doit être comparé à cette application.

j'utilise presque la même méthode pour configurer le proxy pour nos applications hébergées 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 vers des dossiers en utilisant la structure suivante.

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

il n'y a pas de configuration supplémentaire nécessaire pour ajouter ou supprimer des sites. C'est très proche de ce que j'utilise actuellement pour proxy les sites apache et node. Je suis capable d'ajouter de nouveaux noeuds et de nouveaux sites apache sans modifier cette application de 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);

dans le futur, je vais probablement découpler le chemin du port sur lequel l'application écoute, mais cette configuration me permet de construire la carte proxy automatiquement avec très peu de travail. Espérons que cela aide.

6
répondu Timothy Strimple 2012-02-20 23:53:32

j'ai pris un peu d'inspiration de @uglymunky et j'ai écrit un script de chef pour le faire sur Ubuntu.

avec ce script, vous pouvez installer express et apache avec support vhost sur un seul serveur en utilisant 1 ligne après avoir retiré mon projet chef de github

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

si vous avez git installé et que vous le tirez vers le bas, vous pouvez le démarrer comme ça ...

sudo ./install.sh configuration.json

cela ne nécessite Ubuntu 12.04 ou plus car j'ai profité d'un script de démarrage pour démarrer le noeud lorsque vous redémarrez la machine""

lorsque le script est terminé, vous aurez un serveur web ubuntu avec express pour exécuter toutes les applications de noeud que vous avez configurées, le long du côté apache pour exécuter toutes les applications wsgi que vous avez configurées ""

0
répondu Toran Billups 2012-07-26 10:59:23

je travaille sur une bibliothèque extrêmement minime et vers le point qui peut être totalement séparé de vos projets. Fondamentalement, l'idée serait exécuté de manière indépendante sur vos serveurs et ne vous inquiétez pas d'avoir à regrouper cela dans vos projets comment vous le feriez avec Se connecter.

regardez la config.fichier json pour voir à quel point il est simple de se configurer.

je cherchais ceci et j'ai trouvé quelques choses mais ils n'ont pas soutenu tout ce dont j'avais besoin, en particulier HTTPS, WS et WSS!

en ce moment, la bibliothèque que j'ai écrite ne fonctionne que pour HTTP. Mais dans les prochains jours, j'espère qu'il sera terminé et que je travaillerai aussi pour HTTPS, WS et WSS.

0
répondu sgarbesi 2015-06-12 08:37:50