複数のnode.jsプロジェクトを実行しているルートサーバーがあります。彼らはそれぞれのプロセスとディレクトリで別々に動作することになっています。このファイル構造を考えてみましょう:複数のnode.js HTTPプロセス間で1つのポートを共有する
/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
| +-- ...
+-- ... | ...
各index.jsは、その親フォルダ(someProject
、anotherProject
など)へのcwd
セットで個別のプロセスとして開始する必要があります。
ov vHostsを考えてください。各プロジェクトは、独自のドメインでリッスンするWebサーバーを開始します。そして、問題があります。私がnode.js APIを掘り下げて、可能な解決策を探しました:child_process.fork()
。
悲しいことに、これはうまくいきません。サーバーインスタンスをマスタープロセス(後でリクエストを発行する)に送信しようとすると、またはrequest
とresponse
のオブジェクトをconsiveに送信してエラーが発生します。これは、node.jsが内部的にこれらの拡張オブジェクトをJSON文字列に変換しようとした後、元の形式に再変換するためです。これにより、すべてのオブジェクトが参照と機能を失います。
Seccondアプローチchild.js
var http = require("http");
var server = http.createServer(function(req, res) {
// stuff...
});
server.listen(80);
process.send(server); // Nope
まずアプローチ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);
だから、これは死んで終わりです。しかし、ちょっと! Node.jsは、送信可能なハンドルを提供しています。ここではドキュメントからの例です:子供が直接マスターのサーバーに耳を傾けここ
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);
}
});
。したがって、その間にドメインチェックはありません。だからここには行き止まりがあります。
私はまたCluster
と考えましたが、これはハンドルと同じ技術を使用しているため、同じ制限があります。
だからいいアイデアはありますか?
私が現在行っていることは、むしろハック・アイです。私はdistroyというパッケージを作った。これはポート80にバインドし、別のアプリケーションがリッスンする/tmp/distroy/http/www.example.com
などのUnixドメインソケットパスへのすべての要求を内部的にプロキシします。これも(ちょっと)HTTPSのために働く(私の質問SNI参照)。 残りの問題は、元のIPアドレスが失われていることです。現在は常に127.0.0.1です。私は接続を開く前にIPアドレスを送信できるように、net.Server
をmonkeypatchingすることでこれを回避できると思います。
誰かがこの問題の解決策を見つけたら、正しい答えとしてマークします。 – buschtoens
私は現在、この問題を解決すべき何かに取り組んでいます... – buschtoens
誰かがIIS内でノードを実行しているときにこれを行う方法を知っていますか? –