我在域foo.com下运行了一个heroku node.js应用。我想将所有以foo.com/bar/开头的网址代理到第二个node.js进程 - 但我希望在同一个heroku应用程序中控制进程。这可能吗?
如果没有,是否可以将子目录代理到第二个heroku应用程序?我无法找到很多控制如何在Web应用程序的入口点之外进行路由。也就是说,我可以使用Express轻松控制node.js中的路由,但这不能让我代理到其他应用程序。
我的最后一招只是使用子域而不是子目录,但我想先看看子目录是否可行。谢谢!
编辑:我必须使用http-proxy解决我的问题。我有两个快速服务器在不同的端口上侦听,然后是第三个面向外部的服务器,它根据url路由到两个中的任何一个。当然不理想,但我无法得到任何其他工作。下面描述的wrap-app2方法有一些我无法弄清楚的网址问题。
答案 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包含四个核心。因此,您可以将四个工作线程运行到节点进程。
你正在看的是初始化两个明确的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);
}