如何使用Heroku在同一个子域上托管多个node.js应用程序?

时间:2014-03-14 03:37:17

标签: node.js heroku

我们的基本域名为http://api.mysite.com。这应该是我们所有API的前门。假设我们使用以下url结构访问了两个不同的API:

http://api.mysite.com/launchrockets
http://api.mysite.com/planttrees

这些完全不同。关于在Heroku上运行它,我们似乎有两种选择。

1)将所有内容放在Heroku上的一个应用程序中。这感觉错了(非常错误)并且可能导致更改一个API的机会更多,无意中打破了另一个。

2)有3种不同的Heroku应用程序。第一个作为代理(http://mysite-api-proxy.herokuapp.com),将使用bouncyhttp-proxy等模块查看传入请求并重定向到http://planttrees.herokuapp.comhttp://launchrockets.herokuapp.com。 / p>

我倾向于选项2,但我担心管理代理应用程序的负载。对于具有同步体系结构的Web框架,这种方法将是灾难性的。然而,如果node.js使用cluster module并且是异步的,我认为这可能会扩展正常。

我之前遇到过类似的问题,但大部分与同步框架相关,其中选项2肯定是一个糟糕的选择。此问题特定于节点及其执行方式。

关于建立这个的最佳方法的想法?

3 个答案:

答案 0 :(得分:4)

我实现了简单的演示项目来实现多应用程序结构。

https://github.com/hitokun-s/node-express-multiapp-demo

通过这种结构,您可以轻松地单独设置和维护每个应用程序 我希望这对你有所帮助。

答案 1 :(得分:3)

这是我写的一篇试图回答这个问题的博客文章。有很多选择,但您已经决定什么适合您的应用和架构。

http://www.tehnrd.com/host-multiple-node-js-apps-on-the-same-subdomain-with-heroku/

答案 2 :(得分:1)

与@TehNrd类似,我正在使用代理。但是这种方法不需要多个heroku应用程序,只需要一个:

在您的网络应用上:

var express = require('express')
  , url = require('url')
  , api_app = require('../api/server') //this is your other apps index.js or server.js 
  , app = express()
  , httpProxy = require('http-proxy')
  , apiport = parseInt(process.env.PORT)+100 || 5100 //this works!
  ;

// passes all api requests through the proxy
app.all('/api*', function (req, res, next) {
  api_proxy.web(req, res, {
      target: 'http://localhost:' + apiport
  });
});

在您的API服务器上:

var express  = require('express');
var app      = express();
var port     = parseInt(process.env.PORT)+100 || 5100;

...
...
app.listen(port);