让Node-http-proxy与socket.io一起工作?

我正在尝试使用node-http-proxy将stream量引导到端口3000(我的rails服务器)和端口8888(我的nodejs socket.io服务器)。 我正在使用node-http-proxy作为坐在端口80上的反向代理。

(我几乎只是复制node-http-proxy的README)

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

这是我在浏览器上的client.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集团。

谢谢 !

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

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

假设我有两个socket.io服务器在下面的ip和端口上运行,如下所示 –

  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在这里)并且没有防火墙阻塞你的连接(你是同一个networking的一部分)。
  • 如果在同一台主机上拥有上述所有function,则可以使用localhostreplaceip1ip2

客户端JavaScript代码将看起来像这样的我当前的例子 –

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

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