2012-02-20 8 views
15

Sto eseguendo Nodejs e Apache uno accanto all'altro.Come utilizzare i vhost al nodo-http-proxy?

node-http-proxy è in ascolto sulla porta 80 e quindi inoltra le richieste a Apache (: 9000) oa Express (: 8000).

mio host virtuali su Apache assomigliano:

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

La mia domanda è, qual è il modo "corretto" per avere vhost come funzionalità sul lato espresso/Nodejs? Io preferirei non dover inserire ogni app Nodejs sul proprio porto come suggerito qui:

https://github.com/nodejitsu/node-http-proxy (sezione intitolata "le richieste di proxy utilizzando un 'nome host Solo' ProxyTable")

ho notato Connect (che come ho capito, viene fornito in bundle in Express) ha alcune funzionalità vhosts. Dovrei usarlo? In tal caso, quale sarebbe il modo corretto di eseguirlo insieme a node-http-proxy?

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

Ho anche notato questo altro modulo chiamato "Cluster", sembra essere correlato, ma io non sono sicuro di come:

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

Pur non volendo sopraffare, ho anche sono imbattuto in uno chiamato "Haibu" sembra essere correlato, ma non sono sicuro se sarebbe solo un sostituto per l'utilizzo di tutti fuori vhosts:

https://github.com/nodejitsu/haibu

Nota: Sono un ragazzo di front-end, quindi non sono molto familiare con un sacco di terminologia server di

risposta

10

Non ho mai capito Haibu o Cluster. Ma ho trovato una buona soluzione che ha affrontato il mio problema. Con mia sorpresa, era in realtà abbastanza semplice. Tuttavia, non ne so molto dei server, quindi mentre funziona, potrebbe non essere ottimale.

ho impostare gli host virtuali come normale su Apache (http://httpd.apache.org/docs/2.0/vhosts/examples.html)

ho installato il seguente sul nodo

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

Poi, per una questione di personale stile, ho messo tutto i miei host virtuali in una directory comune (/ localhost)

Ho quindi cambiato Apache per l'ascolto su una porta diversa dalla porta 80. Mi è capitato di scegliere la porta 9000 perché l'avevo vista utilizzata da qualche parte. (In httpd.conf, cambiato "Ascolta 80" in "Ascolta 9000"). Dovevo anche assicurarmi che tutti i miei host virtuali, come definiti in extra/httpd-vhosts.conf, fossero impostati su un nomeVirtualHost basato su IP (127.0.0.1) invece di usare una porta (*: 80).

Sul lato nodo, ho creato la mia app/server (aka nodo host virtuale) che ha ascoltato sulla porta 8000 (un po 'arbitrariamente scelta del numero di porta) Vedere questo link sulla creazione di un server con espresso: http://expressjs.com/guide.html

In Ho quindi creato un file chiamato "nodeHttpProxy.js"

Utilizzando node-http-proxy, in nodeHttpProxy.js ho quindi creato un server proxy che ascolta sulla porta 80. Utilizzando express, che esegue il wrapping connect (http : //www.senchalabs.org/connect/) Ho creato i miei host virtuali.

I nodeHttpProxy.js di file è simile al seguente:

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

Come potete vedere, dovrò fare due cose ogni volta che creo un nuovo nodo host virtuale:

  1. aggiungere il nome host virtuale per i miei "nodeVhosts" Array
  2. definire un nuovo esprimere host virtuale utilizzando il metodo .set

Ovviamente, dovrò anche creare il percorso/i file host nella mia directory/localhost.

Una volta che tutto questo è fatto Ho solo bisogno di eseguire nodeHttpProxy.js:

node nodeHttpProxy.js 

Si potrebbe ottenere qualche strano errore "eAccess", nel qual caso, basta eseguire come sudo.

Ascolta sulla porta 80 e se l'host corrisponde a uno dei nomi nell'array nodeVhosts inoltrerà la richiesta a quell'host sulla porta 8000, altrimenti inoltrerà la richiesta su quell'host sulla porta 9000.

+0

convertito per la più recente sintassi espressa: https://gist.github.com/4135704 – sgb

5

Sto dando questo qualche pensiero ultimamente come sto affrontando gli stessi problemi sulla mia ambiente di test personale. Non si sarà in grado di aggirare il fatto che ciascuna applicazione del nodo sia in esecuzione sulla propria porta, ma è possibile astrarre il dolore di quel processo. Ecco cosa sto usando ora, ma spero di creare un pacchetto npm attorno a questo per semplificare le cose in futuro.

Ciascuna delle mie applicazioni node.js ha un file di mappa che contiene la porta su cui l'applicazione è in ascolto e una mappa che indica il percorso previsto su cui viene servita l'applicazione. Il contenuto del file di simile a questa:

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

Quando comincio la mia domanda, si leggerà la porta dal file map.json e ascoltare sulla porta specificata.

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

Poi, nel mio setup proxy, ho iterare su ciascuno dei miei directory dell'applicazione Node.js, e controllare per un file map.json che indica la porta 80 il traffico deve essere inoltrato a questa applicazione.

Io uso quasi lo stesso identico metodo per configurare il proxy per le nostre applicazioni apache ospitate. Usiamo una convenzione basata cartella sul PHP siti web che noi serviamo e utilizza la seguente configurazione:

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

Questo ci permette in sostanza di mappare i domini per cartelle utilizzando la seguente struttura.

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

Non è necessaria alcuna configurazione aggiuntiva per aggiungere o rimuovere siti. Questo è molto vicino a quello che sto attualmente usando per proxy sia dei siti apache che dei siti dei nodi. Sono in grado di aggiungere nuovi nodi e nuovi siti Apache senza modificare questa applicazione 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); 

In futuro, io probabilmente disaccoppiare il percorso dalla porta che l'applicazione è in ascolto, ma questa configurazione mi permette di costruire automaticamente la mappa proxy con pochissimo lavoro. Speriamo che questo aiuti.

0

Mi sono ispirato a @uglymunky e ho scritto uno script da chef per farlo su Ubuntu.

Con questo script è possibile installare espresso e apache con supporto vhost su un singolo server utilizzando 1 linea dopo si tira giù il mio progetto chef github

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

Se avete git installato e si tira verso il basso si può cacciare fuori in questo modo ...

sudo ./install.sh configuration.json 

Questo richiede Ubuntu 12.04 o superiore, come ho approfittato di uno script di upstart per iniziare nodo quando si riavvia la macchina

Quando lo script è terminato si avrà un web server ubuntu di lavoro con espresso per eseguire qualsiasi applicazione nodi configurati, insieme apache lato per eseguire qualsiasi applicazione WSGI configurate

0

sto lavorando su un estremamente minimale e al la libreria di punti che può essere completamente separata dai tuoi progetti. Fondamentalmente l'idea sarebbe gestita in modo indipendente sui tuoi server e non ti preoccupare mai di dover raggruppare questo nei tuoi progetti come faresti con la connessione.

Dai un'occhiata al file config.json per vedere quanto è semplice da configurare.

Stavo cercando questo e ho trovato alcune cose ma non hanno supportato tutto ciò di cui avevo bisogno, in particolare HTTPS, WS e WSS!

In questo momento la libreria che ho scritto funziona solo per HTTP. Ma nei prossimi giorni spero di averlo finito e di lavorare anche per HTTPS, WS e WSS.

Problemi correlati