在主进程上侦听HTTP流量,处理子进程上的连接?

时间:2013-10-09 09:28:01

标签: node.js sockets http ipc virtualhost

我正在寻找一种让套接字监听主进程上的HTTP请求,然后使用process.send()将任何传入连接和请求数据传递给子进程并处理子进程中的HTTP请求的方法过程

但是,我无法找到将传递的连接和请求数据附加到子进程中的HTTP服务器的方法,而无需通过套接字上的.listen()初始化服务器。

那么,是否有可能使用HTTP服务器来处理从另一个进程传入的连接?任何非公共API解决方案也会这样做(尽管希望是JavaScript端)。

我想我可以初始化服务器以侦听一些虚拟套接字,然后将传入的连接反弹,但这似乎不是最理想的。在我的情况下,传入侦听套接字或使用Cluster或反向代理也不是最佳选择。

1 个答案:

答案 0 :(得分:3)

这是可能的,但首先你需要了解node.js的工作原理:

  • TCP服务器(来自net.createServer)基本上是EventEmitter,仅发出connection个事件。

  • HTTP服务器(来自http.createServer)是一个带有连接解析器的TCP服务器。

不幸的是,HTTP服务器硬连线到TCP服务器(see source):

function Server(requestListener) {
  if (!(this instanceof Server)) return new Server(requestListener);
  net.Server.call(this, { allowHalfOpen: true });

  ...

  this.addListener('connection', connectionListener);

  ...
}

您需要将套接字传递给http.js中定义的connectionListener。好消息是模块导出它:

exports._connectionListener = connectionListener;

我没有尝试过这段代码,但它应该有一些调整:

var util = require('util'),
    events = require('events'),
    http = require('http'),
    express = require('express'),
    app = express();

function FakeServer() {
  events.EventEmitter.call(this);

  this.on('connection', http._connectionListener);
  this.on('request', app);
}

util.inherits(FakeServer, events.EventEmitter);

var server = new FakeServer();

process.on('message', function ('socket', socket) {
  server.emit('connection', socket);
});

// you can use app as a regular express app
app.get('/hello', function (req, res) {
  res.send('world');
};