2011-08-25 53 views
2

我有3个node.js应用程序(A,B,C)。 A是一个入口点,我喜欢所有到达此入口点的请求被重定向到B或C(取决于请求中参数的值)。几个node.js进程之间的通信

目前我正在做一个res.redirect在A(我使用expressjs框架)。这工作正常,但它不是真正透明(我可以从外面看到原始请求已被重定向)。

为了解决这个问题,我将B和C监听套接字而不是端口号,但我不知道如何将请求重定向到B或C所使用的套接字。
关于如何拥有2 node.js进程通过套接字进行通信?

**更新**

I have changed the code of A to use node-proxy: 

app.all('/port/path/*', function(req, res){ 

    // Host to proxied to 
    var host = 'localhost'; 

    // Retrieve port and build new URL 
    var arr_url = req.url.split('/'); 
    var port = arr_url[1]; 
    var new_url = '/' + arr_url.slice(2).join('/'); 

    console.log("CURRENT URL:" + req.url); // url is /5000/test/... 
    console.log("NEW URL :" + new_url); // url is /test/... 

    // Change URL 
    req.url = new_url; 

    var proxy = new httpProxy.HttpProxy(); 
    proxy.proxyRequest(req, res, { 
     host: host, 
     port: port, 
     enableXForwarded: false, 
     buffer: proxy.buffer(req) 
    }); 
    console.log("Proxied to " + host + ':' + port + new_url); 

    // For example: the url is localhost:10000/5000/test 
    // the log tells me 'Proxied to localhost:5000/test' => that is correct 
    // But... I do not get any return 
    // If I issue 'curl -XGET http://localhost:5000/test' I get the return I expect 

}); 

在这个任何明显的错误?

+0

A,B和C都是Web服务吗? –

+0

是的,有所有的网络服务,但我不想暴露B和C到外面。 – Luc

+0

Josh有正确的答案:将B和C绑定到'localhost',以便它们不暴露于外部世界,然后将A写为反向代理。 (或者使用nginx,如果A只是一个总机)。 –

回答

1

您正处于正确的轨道上,让其他进程在不同的端口上侦听。你在说什么叫做反向代理。如果它的HTTP,它相当简单的得到这个要与节点HTTP代理:

https://github.com/nodejitsu/node-http-proxy

你想设置的东西像一个代理表:

var options = { 
    router: { 
    'foo.com/baz': '127.0.0.1:8001', 
    'foo.com/buz': '127.0.0.1:8002', 
    'bar.com/buz': '127.0.0.1:8003' 
    } 
}; 
+0

我担心端口映射比unix socket安全性差,你怎么看?从外面看,重定向会被看到吗? – Luc

+0

它不是在http意义上的重定向。重定向将用户代理发送到新地址。反向代理不会,因此它对用户是透明的。假设你的机器上有一个防火墙,除80之外全部拒绝。 – Josh

+0

我现在使用的是节点代理,你说得对,这似乎更好,因为目前我无法使它工作(请参阅我的帖子)。谢谢。 – Luc

0

我只是把一个问题为节点http-rpoxy模块在这里https://github.com/nodejitsu/node-http-proxy/issues/104

显然它确实现在与UNIX插座工作,但像这样(可能会改变)。

var options = { 
    router: { 
     'foo.com/baz': ':/tmp/nodeserver.sock', 
    } 
}; 

所有它需要的是使用套接字路径作为端口值的冒号。