Пример socket.io иногда не подключается к клиентской стороне при использовании обратного прокси-сервера

Используя node-http-proxy, я настроил обратный прокси-сервер для маршрутизации запросов:

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. Чтобы запустить приложение node, я запускаю server.js.

сервер.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

Теперь, когда я обновляю браузер несколько раз, сокет всегда подключается к серверу (то есть всегда регистрируется "Socket connect"), но иногда он не подключается на стороне клиента: console.log(socket.socket.connected) иногда неоднократно печатает "false" после обновления index.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.

ОБНОВЛЕНИЕ

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


person Guido Passage    schedule 22.11.2013    source источник


Ответы (2)


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

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

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

(дополнительная информация)

person robertklep    schedule 22.11.2013
comment
Это действительно заставляет сокет работать стабильно, однако я получаю следующие сообщения каждые +/- 10 секунд (хотя он все еще работает): -xdq5jRtzoK6f9qXi4V debug - xhr-polling закрыт из-за превышения длительности клиент U-xdq5jRtzoK6f9qXi4V - person Guido Passage; 22.11.2013
comment
@GuidoPassage, возможно, этот ответ может дать некоторое представление (хотя мне не совсем понятно, о чем речь :) - person robertklep; 22.11.2013
comment
Это приятно знать. Я буду использовать ваше решение, пока не найду что-то лучше. Мой сайт еще не часто посещают, поэтому разница в производительности не должна иметь большого значения. Спасибо вам за ваши предложения. - person Guido Passage; 22.11.2013

Это действительно была версия узла, которую я использовал. Node-http-proxy не работает для версии узла > 0.8 (см. HTTP-прокси узла с прокси-таблицей и веб-сокетами). Я думал, что использую v0.8.23, но на самом деле я использовал v0.10.21. Используя n, я мог точно заставить узел работать с v0.8.23, и теперь он, похоже, работает. . Очень рекомендую для сброса версии узла.

person Guido Passage    schedule 22.11.2013