複数の node.js プロジェクトを実行しているルート サーバーがあります。それらは、独自のプロセスとディレクトリで個別に実行されることになっています。次のファイル構造を検討してください。
/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 はcwd
、親フォルダー ( 、 など) に設定さsomeProject
れanotherProject
た個別のプロセスとして開始する必要があります。
vHosts について考えてみてください。各プロジェクトは、独自のドメインでリッスンする Web サーバーを開始します。そして、問題があります。すべてのスクリプトがポート 80 にバインドしようとするため、開始できるスクリプトは 1 つだけですchild_process.fork()
。
残念ながら、これはうまく機能しません。サーバー インスタンスをマスター プロセス (後で要求を送信するため) に送信しようとしたり、マスターからスレーブに構成されているオブジェクトを送信しようとすると、request
エラーresponse
が発生します。これは、node.js が内部的にこれらの高度なオブジェクトを JSON 文字列に変換し、それを元の形式に再変換しようとするためです。これにより、すべてのオブジェクトの参照と機能が失われます。
2 番目のアプローチ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 にバインドし、すべてのリクエストを のような Unix ドメイン ソケット パスに内部的にプロキシします/tmp/distroy/http/www.example.com
。これは、HTTPS でも (ちょっと) 機能します ( SNIに関する私の質問を参照してください)。残りの問題は、元の IP アドレスが失われ、常に 127.0.0.1 になっていることです。net.Server
接続を開く前に IP アドレスを送信できるようにモンキーパッチを適用することで、これを回避できると思います。