4

node-http-proxy を使用してトラフィックをポート 3000 (私の rails サーバー) とポート 8888 (私の nodejs socket.io サーバー) に転送しようとしています。node-http-proxy を使用して、ポート 80 にあるリバース プロキシとして機能しています。

(node-http-proxy から README をコピーするだけです)

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> 

nodejsサーバーに接続するためにio.connectを取得する方法はありますか? io.connect をトリガーして server.upgrade ブロックにアクセスする方法がわかりません。

ありがとう !

4

1 に答える 1

2

socket.io では、最初に http ハンドシェイクを実行します。この手順には WebSocket 接続は含まれません。http-proxy github ページの readme セクションから引用した上記のコードは、websocket リクエストを直接リッスンする方法を示しています。ここでは、socket.io の通常のルーティング エントリ (HTTP リソースを使用) が必要です。ハンドシェイクが完了すると、接続が websocket にアップグレードされ、プロキシが自動的に処理します。

ここに疑似コードがあります。実際の物理リソース(HTTPリソース)で識別される複数のsocket-ioサーバーにプロキシするために、本番環境で使用しています。

次のように、次のIPとポートで実行されている2つのsocket.ioサーバーがあるとします-

  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);

ここで注意すべき点-

  • ここでは、1 番目と 2 番目の socket-io サーバーをそれぞれ識別するためのエイリアスとしてSocket1andを使用しています。Socket2
  • アクセスできる限り、任意のマシンにプロキシできます。つまり、これらのマシン (ここでは ip1 と ip2) をプロキシ サーバー (ここでは ip3) から ping でき、接続をブロックするファイアウォールはありません (同じネットワークの一部です)。
  • 上記のすべてが同じホストにある場合は、ip1ip2を置き換えることができますlocalhost

クライアント側の 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 に答える