2012-02-20 19 views
15

Estoy ejecutando Nodejs y Apache uno junto al otro.Cómo usar los fantasmas junto con el nodo-http-proxy?

node-http-proxy está escuchando en el puerto 80 y luego enviando solicitudes a Apache (: 9000) o a Express (: 8000).

Mis anfitriones virtuales en Apache se parecen:

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

Mi pregunta es, ¿cuál es la manera "correcta" para tener host virtual como la funcionalidad en el lado expreso/nodejs? Yo preferiría no tener que colocar cada aplicación nodejs en su propio puerto como se sugiere aquí:

https://github.com/nodejitsu/node-http-proxy (Sección titulada "peticiones de proxy que utiliza un 'nombre de host Sólo' ProxyTable")

Noté Connect (el cual como yo lo entiendo, se incluye en Express) tiene alguna funcionalidad de vhosts. Debería estar usando eso? Si es así, ¿cuál sería la forma correcta de ejecutarlo junto con node-http-proxy?

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

También me di cuenta este otro módulo denominado "Cluster", parece estar relacionado, pero no estoy seguro de cómo:

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

Aunque no se desea abrumar, también encontré uno llamado, "Haibu", parece estar relacionado, pero no estoy seguro de si sería un reemplazo total para usar los fantasmas:

https://github.com/nodejitsu/haibu

Nota: Soy un tipo front-end, así que no estoy muy familiarizado con mucha terminología servidor

Respuesta

10

Nunca me di cuenta de Haibu o Clúster. Pero encontré una buena solución que abordó mi problema. Para mi sorpresa, en realidad fue bastante simple. Sin embargo, no sé mucho sobre los servidores, así que mientras esto funcione, puede que no sea óptimo.

que configure los equipos virtuales como normales en Apache (http://httpd.apache.org/docs/2.0/vhosts/examples.html)

He instalado el siguiente en el nodo

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

Entonces, como una cuestión de personal estilo, puse todo mis servidores virtuales en un directorio común (/ localhost)

Luego cambié Apache para escuchar en un puerto que no sea el puerto 80. Simplemente escogí el puerto 9000 porque lo había visto en alguna parte. (En httpd.conf, cambió "Listen 80" a "Listen 9000"). También tuve que asegurarme de que todos mis hosts virtuales, como se define en extra/httpd-vhosts.conf, se configuraron en un nombre basado en IPVirtualHost (127.0.0.1) en lugar de usar un puerto (*: 80).

En el lado de nodo, creé mi aplicación/servidor (también conocido como nodo de host virtual) que se escuchó en el puerto 8000 (algo arbitrariamente elección del número de puerto) Ver este enlace en la creación de un servidor con expreso: http://expressjs.com/guide.html

En mi directorio/localhost Luego creé un archivo llamado "nodeHttpProxy.js"

Utilizando node-http-proxy, en nodeHttpProxy.js Luego creé un servidor proxy que escucha en el puerto 80. Usando express, que se ajusta connect (http : //www.senchalabs.org/connect/) Creé mis servidores virtuales.

Los nodeHttpProxy.js archivo es como sigue:

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

Como se puede ver, voy a tener que hacer dos cosas cada vez que crear un nuevo nodo de host virtual:

  1. añadir el nombre de host virtual para mis "nodeVhosts" matriz
  2. definir una nueva expresar máquina virtual usando el método .set

Por supuesto, también tendré que crear la ruta/archivos de host reales en mi directorio/localhost.

Una vez que todo esto se hace sólo necesito para funcionar nodeHttpProxy.js:

node nodeHttpProxy.js 

Es posible obtener un error raro "EACCESS", en cuyo caso, basta con ejecutar como sudo.

Escuchará en el puerto 80, y si el host coincide con uno de los nombres en la matriz nodeVhosts reenviará la solicitud a ese host en el puerto 8000, de lo contrario enviará la solicitud a ese host en el puerto 9000.

+0

convertido para la sintaxis expresa más nueva: https://gist.github.com/4135704 – sgb

5

He estado dando últimamente a esto algún pensamiento que a mí hacer frente a los mismos problemas en mi entorno de prueba personal. No podrá desplazarse para que cada aplicación de nodo se ejecute en su propio puerto, pero puede abstraer el dolor de ese proceso. Esto es lo que estoy usando ahora, pero espero construir un paquete de npm alrededor de esto para simplificar las cosas en el futuro.

Cada una de mis aplicaciones node.js tiene un archivo de mapa que contiene el puerto en el que la aplicación está escuchando, así como un mapa que indica la ruta esperada en la que se está sirviendo la aplicación. El contenido del archivo se ven así:

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

Cuando comienzo mi solicitud, se leerá el puerto desde el archivo map.json y escuchar en el puerto especificado.

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

Luego, en mi configuración de proxy, que iterar sobre cada uno de mis directorios de aplicación Node.js, y compruebe si hay un archivo que indica map.json tráfico del puerto 80 debe ser un servidor proxy para esta aplicación.

Uso casi el mismo método para configurar el proxy para nuestras aplicaciones alojadas de apache. Utilizamos una convención basada en carpetas en los sitios web PHP que estamos sirviendo y utiliza la siguiente configuración:

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

Esto nos permite esencialmente para mapear dominios de carpetas usando la siguiente estructura.

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

No se necesita configuración adicional para agregar o eliminar sitios. Esto está muy cerca de lo que estoy usando actualmente para proxy tanto en los sitios apache como en los nodos. Puedo agregar un nuevo nodo y nuevos sitios de Apache sin modificar esta aplicación 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); 

En el futuro, es probable que desacoplar el camino desde el puerto que la aplicación está escuchando, pero esta configuración me permite construir el mapa proxy automáticamente con muy poco trabajo. Espero que esto ayude.

0

Me inspiré en @uglymunky y escribí un guión de cocinero para hacer esto en Ubuntu.

Con este script puede instalar expresa y Apache con soporte de host virtual en un único servidor usando 1 línea después de que tire hacia abajo mi proyecto chef de github

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

Si ha instalado Git y tirar de él abajo se puede expulsar si fuera así ...

sudo ./install.sh configuration.json 

Esto requiere Ubuntu 12.04 o mayor a medida que me aproveché de una secuencia de comandos para iniciar el nodo recién llegado al reiniciar la máquina

Cuando el guión está terminado tendrá un servidor web ubuntu de trabajo con expreso para ejecutar cualquier aplicación de nodos configurados, a lo largo de Apache lado para ejecutar cualquier aplicación WSGI ha configurado

0

que estoy trabajando en una muy mínima y la biblioteca de puntos que puede ser totalmente segregada de sus proyectos. Básicamente, la idea se ejecutará de forma independiente en sus servidores y no se preocupe de tener que agrupar esto en sus proyectos como lo haría con la conexión.

Eche un vistazo al archivo config.json para ver qué tan simple es realmente configurarlo.

Estaba buscando esto y encontré algunas cosas pero no admitían todo lo que necesitaba, ¡específicamente HTTPS, WS y WSS!

En este momento la biblioteca que escribí solo funciona para HTTP. Pero en los próximos días espero tenerlo terminado y trabajando para HTTPS, WS y WSS también.

Cuestiones relacionadas