Tengo un servidor raíz ejecutándose con varios proyectos node.js en él. Se supone que se ejecutan por separado en sus propios procesos y directorios. Considere esta estructura de archivos:Compartiendo un puerto entre múltiples procesos node.js HTTP
/home
+-- /node
+-- /someProject | www.some-project.com
| +-- index.js
| +-- anotherFile.img
| +-- ...
+-- /anotherProject | www.another-project.com
| +-- /stuff
| +-- index.js
| +-- ...
+-- /myWebsite | www.my-website.com
| +-- /static
| +-- index.js
| +-- ...
+-- ... | ...
Cada index.js deben iniciarse como un proceso individual con su cwd
conjunto a su padre-carpeta (someProject
, anotherProject
, etc.).
Think ov vHosts. Cada proyecto inicia un servidor web que escucha en su propio dominio. Y ahí está el problema. Solo una secuencia de comandos puede comenzar, ya que todos intentan enlazarse al puerto 80. Indagué en la API node.js y busqué una posible solución: child_process.fork()
.
Lamentablemente, esto no funciona muy bien. Cuando trato de enviar una instancia de servidor al proceso maestro (para emitir una solicitud más tarde) o un objeto que conste de request
y response
del maestro al bálsamo recibo errores. Esto se debe a que node.js intenta internamente convertir estos objetos avanzados a una cadena JSON y luego los reconvierte a su forma original. Esto hace que todos los objetos pierdan su referencia y funcionalidad.
enfoque seccond child.js
var http = require("http");
var server = http.createServer(function(req, res) {
// stuff...
});
server.listen(80);
process.send(server); // Nope
Primera aproximación master.js
var http = require("http"),
cp = require("child_process");
var child = cp.fork("/home/node/someProject/index.js", [], { env: "/home/node/someProject" });
var router = http.createServer(function(req, res) {
// domaincheck, etc...
child.send({ request: req, response: res }); // Nope
});
router.listen(80);
Así que este es un callejón sin salida. ¡Pero hey! Node.js ofrece algún tipo de identificadores, que se pueden enviar. He aquí un ejemplo de la documentación:
master.js
var server = require('net').createServer();
var child = require('child_process').fork(__dirname + '/child.js');
// Open up the server object and send the handle.
server.listen(1337, function() {
child.send({ server: true }, server._handle);
});
child.js
process.on('message', function(m, serverHandle) {
if (serverHandle) {
var server = require('net').createServer();
server.listen(serverHandle);
}
});
Aquí el niño escucha directamente al servidor del maestro. Entonces no hay un chequeo de dominio entre ellos. Así que aquí hay un callejón sin salida para.
También pensé en Cluster
, pero esto usa la misma tecnología que el mango y por lo tanto tiene las mismas limitaciones.
Entonces ... ¿hay alguna buena idea?
Lo que hago actualmente es bastante hack-ish. He hecho un paquete llamado distroy. Se une al puerto 80 y envía un proxy interno de todas las solicitudes a las rutas de socket de dominio de Unix como /tmp/distroy/http/www.example.com
, en las cuales las diferentes aplicaciones escuchan. Esto también (algo así) funciona para HTTPS (vea mi pregunta en SNI). El problema restante es que se pierde la dirección IP original, ya que ahora siempre es 127.0.0.1. Creo que puedo eludir esto pacando el net.Server
para que pueda transmitir la dirección IP antes de abrir la conexión.
Si a alguien se le ocurre una solución de "mejor ajuste" para este problema, marcaré su respuesta como la correcta. – buschtoens
Actualmente estoy trabajando en algo que debería resolver este problema ... – buschtoens
¿Alguien sabe cómo hacer esto mientras ejecuta un nodo dentro de IIS? –