2013-05-12 158 views
8

我试图让websockets也可以使用node-http-proxy。所不同的是我使用的是proxytable:节点带代理服务器和websockets的http代理

var options = { 
router: { 
    'a.websterten.com': '127.0.0.1:150', 
    'b.websterten.com' : '127.0.0.1:151', 
} 
}; 

var server = httpProxy.createServer(options); 

我想:

server.on('upgrade', function (req, socket, head) { 
    server.proxy.proxyWebSocketRequest(req, socket, head); 
}); 

但它似乎并没有工作。快速检查,看WebSockets的工作是否显示我得到Unexpected response code: 400从Chrome中(工作正常,如果我直接去)

还做了几个检查的server.on('upgrade',..不上的WebSocket请求

我怎样才能得到我的火代理服务器正确路由websockets?

我也试过这个节点0.8.23以及节点0.10.x(节点的后续版本有内存泄漏问题,但它在0.8.23不会工作要么)

回答

2

当你使用httpProxy.createServer(),因为http-proxy自动处理它,所以不需要处理upgrade事件。因此,您的server.on('upgrade', ...)从不会触发,因为http-proxy已在内部处理它。

当您将中间件功能传递到httpProxy.createServer或者您已经手动创建服务器http.createServer()时,唯一需要执行的操作是server.on('upgrade')

换句话说,websockets应该“通过你的配置中的代理工作”。


然而,在HTTP代理 WebSocket的支持是currently broken on node v0.10.x因为streams2(在节点芯were completely rewritten in 0.10流的API)的。 还有,http-proxy(0.10.2)的最新版本在节点v0.8中中断,因为stream2问题的botched fix

所以,你有两个选择:

  1. 等待HTTP代理重写它的内部有streams2应付。
  2. 降级到节点v0.8.23和http-proxy 0.10.1。 (至少要等到1号发生的。)

(您可以通过运行npm install [email protected]安装的NPM模块的旧版本。)

+0

我曾经尝试这样做,有和没有升级什么也没有发生,我不甚至得到错误最终它崩溃。我正在使用代理表示例,只是将主机名修改为其他名称,没有其他编辑 – Akshat 2013-05-15 21:02:42

+0

@Akshat:进一步的研究表明它实际上与节点0.10不兼容。查看更新。 – josh3736 2013-05-16 01:42:09

+0

我明白了,我最近的更新也遇到了0.8.2的问题。有没有解决方法? – Akshat 2013-05-16 16:39:33