具有proxytable和websockets的节点http代理

Aks*_*hat 8 javascript websocket node.js node-http-proxy

我正在尝试使用websockets node-http-proxy.区别在于我使用的是proxytable:

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

var server = httpProxy.createServer(options);
Run Code Online (Sandbox Code Playgroud)

我试过了:

server.on('upgrade', function (req, socket, head) {
    server.proxy.proxyWebSocketRequest(req, socket, head);
});
Run Code Online (Sandbox Code Playgroud)

但它似乎没有用.快速检查一下websockets是否可以显示我Unexpected response code: 400从Chrome 获取的信息(如果我直接使用,则可以正常工作)

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

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

我也在节点0.8.23以及节点0.10.x上尝试了这个(节点的更高版本有内存泄漏问题,但它也不能在0.8.23上工作)

jos*_*736 2

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

您唯一需要做的server.on('upgrade')就是当您将中间件函数传递给httpProxy.createServer或如果您使用http.createServer().

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


然而,由于 Streams2,http-proxy 中的 WebSocket 支持目前在节点 v0.10.x 上被破坏(节点核心中的流 API在 0.10 中被完全重写)。 此外,最新版本的 http-proxy (0.10.2) 在节点 v0.8 中被破坏,因为对streams2问题的修复不善。

所以你有两个选择:

  1. 等待http-proxy重写其内部结构以应对streams2。
  2. 降级到节点 v0.8.23 和 http-proxy 0.10.1。(至少在#1 发生之前。)

(您可以通过运行安装旧版本的 npm 模块npm install http-proxy@0.10.1。)