servidor reverso nodejs node httpd apache node.js proxy vhosts express

nodejs - proxy reverso apache node



¿Cómo usar vhosts junto a node-http-proxy? (4)

Estoy trabajando en una biblioteca extremadamente mínima y puntual que puede ser totalmente separada de sus proyectos. Básicamente, la idea sería ejecutar esto de forma independiente en sus servidores y nunca se preocupe por 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 la configuración.

Estaba buscando esto y encontré algunas cosas, pero no eran compatibles con 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.

Estoy corriendo Nodejs y Apache uno junto al otro.

node-http-proxy escucha en el puerto 80 y luego reenvía las solicitudes a Apache (: 9000) o Express (: 8000).

Mis hosts virtuales en Apache se parecen a:

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

Mi pregunta es, ¿cuál es la forma "correcta" de tener una funcionalidad similar a vhost en el lado de Express / Nodejs? 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 "Solicitudes de proxy utilizando una tabla de proxy de ''Sólo nombre de host''")

Noté que Connect (que, como lo entiendo, se incluye en Express) tiene algunas funciones de vhosts. ¿Debo usar eso? Si es así, ¿cuál sería la forma correcta de ejecutarlo junto con el nodo-http-proxy?

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

También noté que este otro módulo llamado "Cluster", parece estar relacionado pero no estoy seguro de cómo:

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

Aunque no quería abrumarme, también encontré uno llamado "Haibu" que parece estar relacionado, pero no estoy seguro de que sea un reemplazo total para el uso de vhosts:

https://github.com/nodejitsu/haibu

Nota: soy un tipo de front-end, por lo que no estoy muy familiarizado con la terminología de muchos servidores


He estado pensando en esto últimamente mientras estoy abordando los mismos problemas en mi entorno de prueba personal. No va a poder evitar que cada aplicación de nodo se ejecute en su propio puerto, pero puede abstraerse del dolor de ese proceso. Esto es lo que estoy usando ahora, pero espero construir un paquete 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 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 ve así:

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

Cuando inicie mi aplicación, leerá el puerto del archivo map.json y escuchará en el puerto especificado.

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

Luego, en la configuración de mi proxy, recorro cada uno de los directorios de mi aplicación node.js y busco un archivo map.json que indique que el tráfico del puerto 80 debe ser enviado a esta aplicación.

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

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

Básicamente, esto nos permite asignar dominios a carpetas utilizando 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 para apache como para sitios de nodos. Puedo agregar nuevos nodos 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, probablemente desacoplaré la ruta del puerto que la aplicación está escuchando, pero esta configuración me permite crear el mapa proxy automáticamente con muy poco trabajo. Esperemos que esto ayude.


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

Con este script puede instalar Express y Apache con el soporte de vhost en un solo servidor usando 1 línea después de que saque el proyecto de mi chef de github

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

Si tienes git instalado y lo bajas, puedes hacerlo como ...

sudo ./install.sh configuration.json

Esto requiere Ubuntu 12.04 o superior, ya que aproveché un script upstart para iniciar el nodo al reiniciar la máquina.

Cuando finalice el script, tendrá un servidor web ubuntu en funcionamiento con Express para ejecutar cualquier aplicación de nodo que haya configurado, junto con apache para ejecutar cualquier aplicación de wsgi que haya configurado.


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

Configuré hosts virtuales como normales en Apache (http://httpd.apache.org/docs/2.0/vhosts/examples.html)

Instalé lo siguiente en Nodo

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

Luego, como cuestión de estilo personal, coloqué todos mis hosts virtuales en un directorio común (/ localhost)

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

En el lado del nodo, creé mi aplicación / servidor (también conocido como host virtual del nodo) que escuchaba en el puerto 8000 (elección arbitraria del número de puerto). Vea este enlace para crear un servidor con express: http://expressjs.com/guide.html

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

Usando node-http-proxy, en nodeHttpProxy.js, creé un servidor proxy que escucha en el puerto 80. Usando express, que se conecta con (http://www.senchalabs.org/connect/), creé mis hosts virtuales.

El archivo nodeHttpProxy.js se ve así:

// 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 puede ver, tendré que hacer dos cosas cada vez que cree un nuevo host virtual de Node:

  1. agregar el nombre de host virtual a mi matriz "nodeVhosts"
  2. define un nuevo host virtual expreso usando el método .set

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

Una vez hecho todo esto, solo necesito ejecutar nodeHttpProxy.js:

node nodeHttpProxy.js

Podría obtener algún error extraño "EACCESS", en cuyo caso, simplemente ejecute como sudo.

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