【问题标题】:Node http proxy with proxytable and websockets具有 proxytable 和 websockets 的节点 http 代理
【发布时间】:2013-05-12 01:34:24
【问题描述】:

我正在尝试让 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 请求上触发

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

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

【问题讨论】:

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


    【解决方案1】:

    当您使用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 重写其内部以应对流 2。
    2. 降级到节点 v0.8.23 和 http-proxy 0.10.1。 (至少在 #1 发生之前。)

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

    【讨论】:

    • 我已经尝试过了,无论有没有升级都没有任何反应,我什至也没有出错,最终它崩溃了。我正在使用代理表示例,只是将主机名修改为其他主机名,没有其他编辑
    • @Akshat:进一步的研究表明它实际上与节点 0.10 不兼容。查看更新。
    • 我明白了,最近更新的 0.8.2 也有问题。没有解决方法吗?
    • @Akshat:在 http-proxy 的最新版本中有一个 patch 旨在修复这个问题(至少是暂时的),但这不是一个完整的修复;这就是为什么 socket.io 不起作用以及为什么该版本在节点 v0.8 中不起作用的原因。尝试安装以前版本的 http-proxy 0.10.1。
    • 我尝试降级到节点 0.8.23 但 websocket 仍然无法连接(我在 chrome 中收到 400 错误),但是内存泄漏错误确实消失了。
    猜你喜欢
    • 2023-03-15
    • 2012-03-25
    • 2012-04-22
    • 1970-01-01
    • 2013-05-04
    • 2012-04-27
    • 1970-01-01
    • 1970-01-01
    • 2019-07-15
    相关资源
    最近更新 更多