具有proxytable和websockets的节点http代理

时间:2013-05-12 01:34:25

标签: javascript node.js websocket node-http-proxy

我正在尝试使用websockets来处理node-http-proxy。区别在于我使用的是代理表:

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是否有效显示我从Chrome获取Unexpected response code: 400(如果我直接进行则可以正常工作)

同样做一些检查server.on('upgrade',..不会触发websocket请求

如何让我的代理服务器正确路由websockets?

我也在节点0.8.23以及节点0.10.x上尝试了这一点(节点的更高版本存在内存泄漏问题,但它也无法在0.8.23上运行)

1 个答案:

答案 0 :(得分:2)

当您使用httpProxy.createServer()时,没有必要处理upgrade事件,因为http-proxy会自动处理它。因此,您的server.on('upgrade', ...)永远不会触发,因为http-proxy已在内部处理它。

您需要执行server.on('upgrade')的唯一时间是将中间件功能传递给httpProxy.createServer,或者您使用http.createServer()手动创建服务器。

换句话说,websockets应该“正常”通过配置中的代理。


但是, http-proxy中的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-proxy重写其内部以应对streams2。
  2. 降级到节点v0.8.23和http-proxy 0.10.1。 (至少在#1发生之前。)
  3. (您可以通过运行npm install http-proxy@0.10.1来安装旧版本的npm模块。)