3

マスター プロセスで HTTP リクエストをリッスンするソケットを用意し、着信接続とリクエスト データを process.send() を使用して子プロセスに渡し、子プロセスで HTTP リクエストを処理する方法を探しています。

ただし、ソケットで .listen()ing してサーバーを初期化せずに、渡された接続と要求データを子プロセスの HTTP サーバーにアタッチする方法を見つけることができません。

では、HTTP サーバーを使用して、別のプロセスから渡された接続を処理することは何とか可能でしょうか? 公開されていない API ソリューションも同様です (できれば JavaScript 側ですが)。

サーバーを初期化してダミーソケットでリッスンし、そこから着信接続を跳ね返すことができると思いますが、それは最適ではないようです。私の場合、リスニングソケットも渡すか、クラスターまたはリバースプロキシを使用することも最適ではありません。

4

1 に答える 1

3

可能ですが、まず node.js がどのように機能するかを理解する必要があります。

  • TCP サーバー (からnet.createServer) は、基本的にイベントEventEmitterのみを発行するです。connection

  • HTTP サーバー (からhttp.createServer) は、接続パーサーを備えた TCP サーバーです。

残念ながら、HTTP サーバーは TCP サーバーに固定されています (ソースを参照)。

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');
};
于 2013-10-09T10:56:29.607 に答える