1つのサーバーで複数のアプリを立ち上げる方法はあるのでしょうか?

3,597 views
Skip to first unread message

hidakaya

unread,
Jan 4, 2014, 9:50:45 PM1/4/14
to node...@googlegroups.com
はじめまして、hidakayaと申します。node.jsは勉強し始めたばかりです。

表題の件ですが、勉強がてらにデモを作っている時に疑問に思いました。

例えば静的なページのデモサイトを作るときは
http://mydomain.com/demo2/
http://mydomain.com/demo3/

みたいに単純にフォルダ別にサーバーにファイルをアップロードすれば
それがそのままURLになるので複数のデモを同時に公開できます。

手元にある参考書「Nodeクックブック」だと1つのserver.jsを上書きするように
ステップアップしていくので問題はないのですが、試しにデモ別に保存・実行すると
ポートが共存してエラーが出るようです。

皆さんはテスト環境ではアプリ別にポートを開放して作業を行ってらっしゃるのでしょうか?
node.jsの初心者というかサーバー自体もよくわかってない部分もあるので疑問に思いました。

お分かりの方がいらっしゃいましたら、よろしくお願い致します。

nazomikan

unread,
Jan 5, 2014, 12:14:09 PM1/5/14
to node...@googlegroups.com
こんばんは、nazomikanです。

> 手元にある参考書「Nodeクックブック」だと1つのserver.jsを上書きするように
> ステップアップしていくので問題はないのですが、試しにデモ別に保存・実行すると
> ポートが共存してエラーが出るようです。

server.jsの中身は分かりませんがserver.listen(port)としているのであればそのアプリケーションは
指定したポートをlistenしてるわけなので、このポートは使用中になっていて他の
アプリケーションからは利用できません。

> 皆さんはテスト環境ではアプリ別にポートを開放して作業を行ってらっしゃるのでしょうか?
僕はローカルでやるときはだいたいそうしてます。

もしくはホストを分けるとかどうでしょうか
適当ですがサンプルコードかきました。

実際にポートをlistenしてるのはserver.jsで、そこにくるリクエストのホスト名を確認して
それぞれのアプリケーションサーバにreq,resをセットしてリクエストイベントを発火させてあげるという方法です。
これなら一つのポートで複数アプリケーションたてれます。

expressとかを利用していらっしゃるのであれば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)
```

みたいな感じで。




2014年1月5日日曜日 11時50分45秒 UTC+9 hidakaya:

hidakaya

unread,
Jan 5, 2014, 12:52:01 PM1/5/14
to node...@googlegroups.com
nazomikan様


早速のお返事有り難うございます。
しかもわかり易いコードまで書いていただいて、大変ありがたいです。

ご指摘のとおり、server.listen(port)で同じportを使用していました。
できたデモを1つずつ公開してブログにしようかなと考えていたのですが、
結構な数のポートを開けなければならないので悩んでいました。
ブログにはコードを載せるまでにしようかと思ってます。

ホストを分ける方法を教えていただけて大変感謝しています。
今はまだ勉強中ですが、いずれ仕事で使うことも出てくると思うので。

expressもNodeクックブックの6章に出てくるので頑張って読み進めます。
(まだ1章です)

このたびは本当にありがとうございました。
今後とも宜しくお願い致します。



2014年1月6日月曜日 2時14分09秒 UTC+9 nazomikan:

nazomikan

unread,
Jan 5, 2014, 2:14:35 PM1/5/14
to node...@googlegroups.com
蛇足ですが、質問の意図が汲めた気がしたので追記します。

> できたデモを1つずつ公開してブログにしようかなと考えていたのですが

ということならホスト名いちいちかくのもポートわけるのも面倒ですね。
パスごとにアプリケーションを変更するのならさっきのコードのhostnameでの処理分岐をpathnameでの分岐にかえればいいです。
(アプリケーションごとのルーティングかくときは注意しないといけないけど)

```
var http = require('http')
  , url = require('url')
  ;

http.createServer(function(req, res) {
  var path
    , server1 = require('./app1')
    , server2 = require('./app2')
    ;

  path = url.parse(req.url).pathname;

  // define routing
  if (/^\/demo1\//.test(path)) {
    server1.emit('request', req, res);
    return;
  }

  if (/^\/demo2\//.test(path)) {
    server2.emit('request', req, res);
    return;
  }

  // no-match
  sendNotFound(res);
}).listen(3050);

function sendNotFound(res) {
  res.writeHead(404);
  res.end();
}
```

2014年1月6日月曜日 2時52分01秒 UTC+9 hidakaya:
Reply all
Reply to author
Forward
0 new messages