2014-01-24 57 views
0

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

如果没有,是否有可能代理一个子目录到第二个heroku应用程序?我一直无法控制如何在Web应用程序入口点之外进行路由。也就是说,我可以很容易地使用Express来控制node.js中的路由,但这不会让我代理不同的应用。

我最后的手段是简单地使用子域而不是子目录,但我想看看是否有可能的第一个子目录。谢谢!

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

回答

0

只需创建一个新的Express服务器,并把中间件的主要一个重定向到二级时,涉及到你想要的路径的请求:

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); 
    }); 
+0

这实际上并没有工作,因为一些奇怪的行为,当它被app2处理时,路径被重复。无法准确记住这种行为,但app2会看到像'/ foo/foo/...'这样的网址,而不是'/ foo/...'。 –

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); 
} 
相关问题