2012-04-09 7 views
4

포트 3000 (내 레일 서버)과 포트 8888 (내 nodejs socket.io 서버)에 트래픽을 연결하기 위해 node-http-proxy를 사용하려고합니다. 나는 리버스 프록시 포트에 앉아 역할을하는 노드가-HTTP 프록시 사용하고 80Node-http-proxy를 socket.io와 함께 사용하려면?

var proxy = new httpProxy.HttpProxy({ 
    target: { 
    host: 'localhost', 
    port: CONFIG.RAILS_PORT, 
    } 
}); 

var server = http.createServer(function(req, res) { 
    // 
    // Proxy normal HTTP requests 
    // 
    proxy.proxyRequest(req, res); 
}); 

server.on('upgrade', function(req, socket, head) { 
    // 
    // Proxy websocket request to another port 
    // 
    console.log('inside upgrade'); 
    proxy.proxyWebSocketRequest(req, socket, head, { 
    host: 'localhost', 
    port: CONFIG.NODEJS_PORT 
    }); 
}); 

server.listen(80); 

var WrappedServer = require('./wrappedServer').WrappedServer 
var singleton = new WrappedServer(); 
singleton.run(CONFIG.NODEJS_PORT, {'log level': 2}); 

(나는 거의 단지 노드-HTTP 프록시에서 README를 복사) 그리고이 내 클라이언트입니다 .js 브라우저에서.

var socket = io.connect('http://localhost', {'sync disconnect on unload': false}); 

아무 래도 io.connect가 nodejs 서버에 연결할 수 없습니다. 나는 io.connect에서이 반응을 얻고있다 :

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="utf-8" /> 
    <title>Action Controller: Exception caught</title> 
    <style> 
    body { background-color: #fff; color: #333; } 

    body, p, ol, ul, td { 
     font-family: helvetica, verdana, arial, sans-serif; 
     font-size: 13px; 
     line-height: 18px; 
    } 

    pre { 
     background-color: #eee; 
     padding: 10px; 
     font-size: 11px; 
    } 

    a { color: #000; } 
    a:visited { color: #666; } 
    a:hover { color: #fff; background-color:#000; } 
    </style> 
</head> 
<body> 

<h1>Routing Error</h1> 
<p><pre>No route matches [GET] &quot;/socket.io/1&quot;</pre></p> 
</body> 
</html> 

내가 io.connect가 nodejs 서버에 연결을 얻을 수있는 방법 어떤 생각? 나는 io.connect를 트리거하여 서버에 도착하는 방법을 모른다. 업그레이드 블록.

감사합니다. !

+0

나는 거의 같은 문제가있다. 이 문제에 대한 해결 방법을 찾았습니까? – Luc

답변

1

socket.io를 사용하면 먼저 http 핸드 셰이크를 수행합니다. 이 단계는 websocket 연결을 포함하지 않습니다. http-proxy github 페이지의 readme 섹션에서 인용 한 위의 코드는 websocket 요청을 직접 수신하는 방법을 알려줍니다. 여기서는 socket.io에 대해 (HTTP 리소스를 사용하는) 일반적인 라우팅 항목이 필요하며 핸드 셰이크가 완료되면 연결이 websocket으로 업그레이드되고 프록시가 자동으로 처리합니다.

여기에 의사 코드가 있습니다. 실제 실제 리소스 (HTTP 리소스)로 식별되는 여러 소켓 -io 서버에 프록시로 프로덕션 환경에서 사용하고 있습니다.

나는 두 socket.io 서버가 follows-로 다음과 같은 IP 및 포트에서 실행 있다고 가정

  1. IP1 : 3000
  2. IP2 : 3001

이제 우리 프록시의 코드 (IP를 IP3와) 여기 -

012을주의하는 것이

var options = { 
    "ip3/Socket1/socket.io" : "ip1:3000/socket.io", 
    "ip3/Socket2/socket.io" : "ip2:3001/socket.io" 
} 

proxy = require('http-proxy').createServer(options).listen(80); 

몇 가지 포인트로 삼았 볼 것이다

  • 여기서는 각각 첫 번째 및 두 번째 소켓 -io 서버를 식별하는 별명으로 Socket1Socket2을 사용하고 있습니다.
  • 액세스 할 수있는 한 모든 컴퓨터를 프록시 할 수 있습니다. 즉, 프록시 서버 (여기의 ip3)에서 해당 컴퓨터 (여기에서 ip1 및 ip2)를 핑 (ping) 할 수 있으며 연결을 차단하는 방화벽이 없습니다 (동일한 네트워크의 일부 임). 당신이 동일한 호스트에 위의 모든 사항이 있으면 내 현재 예 -에 대해 다음과 같이 보일 것입니다 자바 스크립트 코드
  • , 당신은 localhost

클라이언트 측 ip1ip2을 대체 할 수

var socket1 = io.connect('http://ip3:80', {'resource': 'Socket1/socket.io'}); 
var socket2 = io.connect('http://ip3:80', {'resource': 'Socket2/socket.io'}); 

이 모든 것이 한 번에 소화하기에 많은 것 같습니다. 그래도 문제가 계속되면 알려주세요.

관련 문제