Nodeでホストごとに起動するアプリケーションを分ける
だいたいnodejs-jpのレスに書いたことと同じだけどメモ代わりに。
ピュアな感じで書く
とりあえずNodeのピュアなAPIだけでやる
まずはサーバをたてる
server.js
var http = require('http'); http.createServer(function(req, res) { }).listen(3000);
ホストごとのアプリケーションのコードをかく
app1.js, app2.js
var http = require("http") , server ; server = http.createServer(function (req, res) { res.writeHead(200); res.end("<html><body><p>hi i am nazomikan</p></body></html>"); }); module.exports = server;
ポイントとしてはここでサーバーをエクスポートするだけでlisten
しないこと
server.js側でホストごとにサーバーわけてrequestを擬似的に発火させる
server.jsの続き
require('http').createServer(function(req, res) { var hostname , server1 = require('path/to/app1') , server2 = require('path/to/app2') ; // host無しならnot-found行き if(!req.headers.host) { return sendNotFound(res); } // ホスト名とポートを分けてホスト名だけ取得 hostname = req.headers.host.split(":")[0]; // ホスト名ごとのサーバーにrequestイベントを擬似的に発火 switch (hostname) { case "hoge-iam-hidakaya.xxx.com": server1.emit('request', req, res); // requestイベントを擬似的に発火 break; case "hoge-iam-nazomikan.xxx.com": server2.emit('request', req, res); // requestイベントを擬似的に発火 break; default: // 指定したホストじゃない場合もnot-found行き sendNotFound(res); break; } }).listen(3050); /** * 404かえす */ function sendNotFound(res) { res.writeHead(404); res.end(); }
ピュアな方のコードまとめ
https://gist.github.com/nazomikan/8270802
適当でごめんなさい
expressとかconnectでやる
connect-middlewareにconnect-vhostという便利なやつがあります
var foo = express(); ... var bar = express(); ... var baz = express(); ... express() .use(express.vhost('foo.com', foo)) .use(express.vhost('bar.com', bar)) .use(express.vhost('baz.com', baz)) .listen(80)
connectを生で使う場合は:%s/express/connect/g
で。
たしかこっちはホスト名に正規表現もいけたはず(簡単なんだけど)