heroku:route子目录到第二个node.js app?

时间:2014-01-24 22:25:58

标签: node.js heroku express

我在域foo.com下运行了一个heroku node.js应用。我想将所有以foo.com/bar/开头的网址代理到第二个node.js进程 - 但我希望在同一个heroku应用程序中控制进程。这可能吗?

如果没有,是否可以将子目录代理到第二个heroku应用程序?我无法找到很多控制如何在Web应用程序的入口点之外进行路由。也就是说,我可以使用Express轻松控制node.js中的路由,但这不能让我代理到其他应用程序。

我的最后一招只是使用子域而不是子目录,但我想先看看子目录是否可行。谢谢!

编辑:我必须使用http-proxy解决我的问题。我有两个快速服务器在不同的端口上侦听,然后是第三个面向外部的服务器,它根据url路由到两个中的任何一个。当然不理想,但我无法得到任何其他工作。下面描述的wrap-app2方法有一些我无法弄清楚的网址问题。

2 个答案:

答案 0 :(得分:0)

只需创建一个新的快速服务器,并在主要服务器中放置一个中间件,以便在请求到您所需的路径时重定向到辅助服务器:

  var app2 = express();

  app2.use(function(req, res){
      res.send('Hey, I\'m another express server');
  });

  app.use('/foo', app2);

我还没有在Heroku中尝试过它,但它是相同的过程,并没有创建任何新的TCP绑定或进程,所以它会工作。供参考,a modified plain express template

如果确实希望其他快速流程处理连接,则需要使用群集。查看worker.send utility

  app.use('/foo', function(req,res){
        //You can send req too if you want.
        worker.send('foo', res);
  });

答案 1 :(得分:0)

这是可能的。我能想到的最优雅的方式是使用聚类。 1 Heroku Dyno包含四个核心。因此,您可以将四个工作线程运行到节点进程。

这是introduction to clustering

你正在看的是初始化两个明确的app(假设你正在使用快递)并在两个工作线程中提供这两个。

if (cluster.isMaster) {
    //  let's make four child processes
    for (var i = 0; i < 4; i++) {
        if (i%2 == 0) {
           cluster.fork(envForApp1);
        } else {
           cluster.fork(envForApp2);
        }
    }
} else {
    // refer to NODE_ENV and see whether this should be your app1 or app2
    // which should be started. This is passed from the fork() before.

    app.listen(8080);
}