2011-08-25 8 views
2

node.js 응용 프로그램 (A, B, C)이 3 개 있습니다. A는 진입 점이며 요청시 매개 변수 값에 따라 B 또는 C 방향으로 리디렉션되도록이 진입 점에 도달하는 모든 요청을 좋아합니다.여러 node.js 프로세스 간 통신

현재 res.redirect를 A (expressjs 프레임 워크를 사용하고 있습니다.)에서 사용하고 있습니다. 그것은 실제로 투명하지 않다는 점을 제외하고는 정상적으로 작동합니다 (외부에서 원래 요청이 리다이렉트되었음을 ​​알 수 있습니다).

이 문제를 해결하기 위해, 나는 B를하고 C 대신 포트 번호의 소켓에서 수신 대기하지만 A가 B 또는 C
이하는 방법에 대한 아이디어가 사용하는 소켓에 요청을 리디렉션해야하는 방법을 모른다 2 node.js 소켓을 통한 통신 프로세스?

** UPDATE **

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는 모두 웹 서비스입니까? –

+0

예, 모든 웹 서비스가 있지만 B와 C를 외부에 노출하고 싶지 않습니다. – Luc

+0

Josh는 바른 대답을 가지고 있습니다 : B와 C를'localhost'에 바인드하여 외부 세계에 노출되지 않도록 한 다음 A를 역방향 프록시로 씁니다. (또는 A가 단지 스위치 보드 인 경우 nginx를 사용하십시오.) –

답변

1

다른 프로세스가 다른 포트에서 수신 대기하는 중입니다. 당신이 말하는 것은 역방향 프록시라고합니다. 그 매우 간단는 HTTP가, 얻을 경우,이 노드 HTTP 프록시로가는 : 난 그냥 넣어

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

포트 매핑이 유닉스 소켓보다 덜 안전하다는 것에 대해 사과했습니다. 어떻게 생각하십니까? 외부에서 리디렉션이 표시됩니까? – Luc

+0

HTTP 의미에서 리디렉션되지 않습니다. 리디렉션은 사용자 에이전트를 새 주소로 보냅니다. 역방향 프록시는 사용자에게 보이지 않으므로 역방향 프록시가 아닙니다. 아마도 당신은 당신의 컴퓨터에 방화벽을 가지고 있지만 80을 제외한 모든 것을 거부 할 것입니다. – Josh

+0

지금은 node-proxy를 사용하고 있습니다. 내 게시물). 감사. – Luc

0

:

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

당신은 프록시 테이블 같은 것을 설정하려면 여기에 node-http-rpoxy 모듈에 대한 문제가 있습니다. https://github.com/nodejitsu/node-http-proxy/issues/104

실제로 유닉스 소켓에서 작동하지만 외관상으로는 변경 될 수 있습니다.

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

포트 값으로 소켓 경로를 사용하려면 콜론이 필요합니다.