2012-04-09 60 views
4

我正在尝试使用node-http-proxy将流量引导到端口3000(我的rails服务器)和端口8888(我的nodejs socket.io服务器)。我使用节点HTTP代理充当反向代理坐在端口80让Node-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代理复制),这是我的客户.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到达server.upgrade集团。

谢谢 !

+0

我有几乎相同的问题。你有没有找到这个解决方法? – Luc 2012-05-29 13:38:32

回答

1

使用socket.io,您首先执行一次http握手。这一步不涉及websocket连接。你从http-proxy github页面的readme部分引用的上面的代码告诉如何直接监听websocket请求。在这里,你需要一个普通的路由条目(使用HTTP资源)来处理socket.io,当握手完成时,你的连接将升级到websocket,代理将自动处理它。

这里是一个伪代码。我在生产中使用它来代理多个由实际物理资源(HTTP资源)标识的socket-io服务器。

假设我有以下的IP和端口运行如下 - 2个socket.io服务器

  1. IP1:3000
  2. IP2:3001

现在我们代理的代码(与IP IP3)看起来喜欢 -

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); 

几点这里 - 注意

  • 这里我使用Socket1Socket2作为分别标识第一个和第二个socket-io服务器的别名。
  • 只要您有权访问它,您就可以代理任何机器。即您可以从代理服务器(此处为ip3)ping那些机器(ip1和ip2在这里),并且没有防火墙阻止您的连接(您是同一网络的一部分)。
  • 如果你有上述所有的同一台主机上,你可以用localhost

客户端替换ip1ip2 JavaScript代码会是这个样子我目前的示例 -

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

所有这一切看起来像很多消化立即。让我知道你是否仍然面临这个问题。