Заставить Node-http-proxy работать с socket.io?

Я пытаюсь использовать node-http-proxy для направления трафика на порт 3000 (мой сервер rails) и порт 8888 (мой сервер nodejs socket.io). Я использую node-http-proxy в качестве обратного прокси-сервера, подключенного к порту 80.

(Я просто копирую README из 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.

Спасибо !


person disappearedng    schedule 09.04.2012    source источник
comment
У меня почти такая же проблема. Вы нашли обходной путь для этого?   -  person Luc    schedule 29.05.2012


Ответы (1)


С socket.io вы сначала выполняете рукопожатие http. Этот шаг не требует подключения к веб-сокету. Приведенный выше код, который вы процитировали из раздела readme на странице http-proxy github, рассказывает, как напрямую прослушивать запросы веб-сокетов. Здесь вам понадобится обычная запись маршрутизации (с использованием ресурсов HTTP) для socket.io, и когда рукопожатие завершится, ваше соединение будет обновлено до websocket, и прокси-сервер автоматически обработает его.

Вот псевдокод. Я использую его в производстве для прокси-сервера на несколько серверов socket-io, которые идентифицируются по реальным физическим ресурсам (ресурсам HTTP).

Предположим, у меня есть два сервера 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);

Некоторые моменты, на которые стоит обратить внимание:

  • Здесь я использую Socket1 и Socket2 в качестве псевдонимов для идентификации первого и второго серверов socket-io соответственно.
  • Вы можете подключиться к любой машине через прокси, если у вас есть к ней доступ. то есть вы можете пинговать эти машины (здесь ip1 и ip2) со своего прокси-сервера (здесь ip3), и нет брандмауэра, блокирующего ваше соединение (вы являетесь частью той же сети).
  • Если у вас есть все вышеперечисленное на одном хосте, вы можете заменить ip1 и ip2 на localhost

Код javascript на стороне клиента для моего текущего примера будет выглядеть примерно так:

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

Все это похоже на то, что нужно сразу переварить. Сообщите мне, если у вас по-прежнему возникают проблемы с этим.

person arunkjn    schedule 28.05.2013