监听主进程的 HTTP 流量,处理子进程的连接?
Posted
技术标签:
【中文标题】监听主进程的 HTTP 流量,处理子进程的连接?【英文标题】:Listening for HTTP traffic on master process, handling connections on child process? 【发布时间】:2013-10-09 09:28:00 【问题描述】:我正在寻找一种方法让套接字在主进程上侦听 HTTP 请求,然后使用 process.send() 将任何传入连接和请求数据传递给子进程并在子进程中处理 HTTP 请求过程。
但是,我无法找到将传递的连接和请求数据附加到子进程中的 HTTP 服务器的方法,而无需通过套接字上的 .listen() 初始化服务器。
那么,是否有可能使用 HTTP 服务器来处理从另一个进程传入的连接?任何非公开的 API 解决方案也可以(但希望是 javascript 方面的)。
我想我可以初始化服务器以侦听某个虚拟套接字,然后将传入的连接从中反弹,但这似乎不是最理想的。在我的情况下,也传递侦听套接字或使用 Cluster 或反向代理也不是最佳选择。
【问题讨论】:
你检查cluster模块了吗? 是的,但如前所述,集群不是我想要的,我不想共享监听套接字。 (我正在尝试做各种虚拟主机。) 【参考方案1】:有可能,但首先您需要了解 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');
;
【讨论】:
这适用于连接传递,但我仍然无法将实际请求数据(与套接字一起传递)传递给 HTTP 服务器。即:function FakeServer() events.EventEmitter.call(this); this.on('connection', http._connectionListener); this.on('connection', function (connection) connection.on('data', function () // is called ); ); this.on('request', function () // never called ); // ... process.on('message', function (reqData, socket) server.emit('connection', socket); socket.emit('data', new Buffer(reqData)); );
哦,伙计,格式看起来很难看,对不起。这里编码迭代的官方方式是什么?
如果你想开始解析主服务器中的请求,然后在你知道主机后将套接字交给从服务器,你应该使用类似 node-http-proxy 的东西,因为主服务器最终会做无论如何,大部分 I/O 工作。否则,您谈论的是滚动您自己的 HTTP 解析器,而这超出了 *** 的问题。
我是否为连接创建 IncomingMessage?我可以以某种方式将它传递给 HTTP 服务器吗?
http._connectionListener
将创建一个 IncomingMessage。但是,如果 master 已经从 socket 消费了数据,它就不会起作用。以上是关于监听主进程的 HTTP 流量,处理子进程的连接?的主要内容,如果未能解决你的问题,请参考以下文章