4

我正在尝试使用 node-http-proxy 将流量定向到端口 3000(我的 rails 服务器)和端口 8888(我的 nodejs socket.io 服务器)。我正在使用 node-http-proxy 充当位于端口 80 上的反向代理。

(我几乎只是从 node-http-proxy 复制自述文件)

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 块。

谢谢 !

4

1 回答 1

2

使用 socket.io,您首先执行 http 握手。此步骤不涉及 websocket 连接。您从 http-proxy github 页面的自述文件部分引用的上述代码说明了如何直接侦听 websocket 请求。在这里,您需要一个用于 socket.io 的普通路由条目(使用 HTTP 资源),当握手完成时,您的连接将升级到 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);

这里有几点需要注意——

  • 在这里,我使用Socket1andSocket2作为别名来分别识别第一个和第二个 socket-io 服务器。
  • 只要您有权访问它,您就可以代理到任何机器。即,您可以从您的代理服务器(此处为 ip3)ping 那些机器(此处为 ip1 和 ip2),并且没有防火墙阻止您的连接(您是同一网络的一部分)。
  • 如果您在同一主机上拥有以上所有内容,则可以替换ip1ip2localhost

对于我当前的示例,客户端 javascript 代码看起来像这样 -

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

所有这些看起来都需要一次消化。如果您仍然遇到此问题,请告诉我。

于 2013-05-28T01:38:38.620 回答