2013-11-22 6 views
0

Использования узла HTTP-прокси, я настроить обратный прокси-сервер для запросов маршрутизации:socket.io примера иногда не подключается на сторону клиента при использовании обратного прокси-сервера

var httpProxy = require('http-proxy'); 
var server = httpProxy.createServer({ 
    hostnameOnly: true, 
    router: { 
     'www.example.com': 'localhost:3002' 
    } 
}).listen(80); 

Теперь, когда я запустить первый пример на http://socket.io/#how-to-use, сокет иногда не соединяется с клиентом. Я создал два файла для проверки этого: server.js и index.html. Чтобы запустить приложение-узел, я запустил server.js.

server.js:

var app = require('http').createServer(handler) 
    , io = require('socket.io').listen(app) 
    , fs = require('fs') 

app.listen(3002); 

function handler (req, res) { 
    fs.readFile(__dirname + '/index.html', 
    function (err, data) { 
     if (err) { 
      res.writeHead(500); 
      return res.end('Error loading index.html'); 
     } 

     res.writeHead(200); 
     res.end(data); 
    }); 
} 

io.sockets.on('connection', function (socket) { 
    console.log("Socket connected"); 
}); 

index.html:

<script src="/socket.io/socket.io.js"></script> 
<script> 
    var socket = io.connect(); 
    setInterval(function() { 
     console.log(socket.socket.connected); 
    }, 1000) 
</script> 

Когда клиент не подключается, после того, как сокет соединяется с сервером, я неоднократно получаю следующее выход с интервалами +/- 10 секунд:

debug - setting request GET /socket.io/1/xhr-polling/Cqcw5xUjQ-B-Hw3FGF7Y?t=1385128607702 
debug - setting poll timeout 
debug - discarding transport 
debug - cleared heartbeat interval for client Cqcw5xUjQ-B-Hw3FGF7Y 

Теперь, когда я обновляю браузер несколько раз, сокет всегда подключается к серверу (то есть он всегда регистрирует «Сокет подключен»), но иногда он не подключается к стороне клиента: console.log(socket.socket.connected) иногда многократно печатает " false " после обновления индекса.html и после повторного обновления страницы он может повторно напечатать " true " или " false " еще раз, если сокет не подключался или не подключался к клиенту.

Пример работает на стороне клиента, когда я не использую обратный прокси-сервер, поэтому, когда я запускаю server.js на порт 80 на www.example.com. Было бы здорово, если бы кто-нибудь мог указать мне, что может быть причиной этой проблемы. Я использую node.js v0.8.23, версию socket.io 0.9.14 и версию-node-http-proxy версии 0.10.1.

UPDATE

Возможно, я на самом деле с помощью узла v0.10.21. Я думал, что использую v0.8.23, переключив версию узла с помощью nvm, но по какой-то причине он продолжает переходить на v0.10. Это known issue, что http-proxy не поддерживает веб-сокеты для версий узлов ниже 0,8, так что это может быть причиной. Я использую решение robertklep, пока не найду что-то лучше.

ответ

1

Это действительно была версия узла я использовал. Node-http-proxy не работает для версии узла> 0.8 (см. Node http proxy with proxytable and websockets). Я думал, что использую v0.8.23, но фактически использовал v0.10.21. Используя n, я мог бы получить узел, работающий для v0.8.23, и теперь он работает. Я настоятельно рекомендую n для сброса версии узла.

+0

Приятно видеть, что ваша проблема решена! :) – robertklep

1

Я думаю, что проблема может заключаться в том, что socket.io изначально пытается использовать WebSockets в качестве транспортного носителя, а когда это не работает (я не знаю, может ли node-http-proxy прокси-соединения WS), он возвращается к транспорту, который делает работу (xhr-polling), но клиент и/или сервер запутываются в этом процессе.

Попробуйте отключить websocket и flashsocket транспортирует, чтобы увидеть, если это делает его более надежным:

io.set('transports', [ 'xhr-polling', 'jsonp-polling', 'htmlfile' ]); 

(more info)

+0

Это действительно делает сокет работать последовательно, однако я получаю следующие сообщения каждые +/- 10 секунд (он все еще работает): debug - очистка тайм-аута опроса debug - xhr-polling writing 8 :: debug - set близкий тайм-аут для клиента U-xdq5jRtzoK6f9qXi4V отладки - XHR-опрос закрыт из-за превышена продолжительность отладки - установка запроса GET /socket.io/1/xhr-polling/U-xdq5jRtzoK6f9qXi4V?t=1385133212017 отладки - настройки опроса таймаут отладки - отбрасывание транспорта debug - очищенный таймаут закрытия для клиента U-xdq5jRtzoK6f9qXi4V –

+0

@GuidoPassage возможно [этот ответ] (http://stackoverflow.com/a/18064892/893780) может дать некоторое представление (хотя мне это не совсем понятно что это о :) – robertklep

+0

Это приятно знать. Я буду использовать ваше решение, пока не найду что-то лучше. Мой сайт часто не посещается, поэтому разница в производительности не должна иметь большого значения. Спасибо вам за ваши предложения. –