Используя 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, пока не найду что-то лучше.