Подтвердить что ты не робот

Неожиданный код ответа: ошибка 502 при использовании socket.io с AppFog

Ошибка

Когда пользователь открывает http://sync.aws.af.cm/, консоль Google Chrome JavaScript показывает (в течение нескольких секунд):

Unexpected response code: 502 error

Приложение должно помнить содержимое текстовой области даже после того, как пользователь обновит страницу. Приложение работает локально, но не тогда, когда я загружаю его в AppFog, и я подозреваю, что проблема связана с ошибкой 502.

Знаете ли вы, что может вызвать эту ошибку в этом случае?

Что я пробовал

Я попытался изменить путь script src=<path_to_socket_io> в моем клиенте от /socket.io/socket.io.js до node_modules/socket.io/node_modules/socket.io-client/dist/socket.io.js, как описано здесь, но это не помогло.

Я также пробовал использовать приложение в Heroku вместо AppFog, но в этом случае я продолжал сталкиваться с проблемой, описанной здесь, хотя я указал socket.io версии 0.9 0,6.

Я также рассмотрел следующие вопросы, но комментарии пока не помогают мне.

socket.io создает 502 Bad Gateway при подключении /websocket недействителен

Socket.IO node.js. Неверный порт 808 веб-соединения

socket.io с node.js не работает как ожидалось

Соответствующий код сервера

Вот соответствующий код сервера:

var server = http.createServer(function (req, res) {
  ...
});

var io = require('socket.io').listen(server);

// Define events that can be triggered by the client
io.sockets.on('connection', function (socket) {
  socket.on('setServerVariable', function (value) {
    ...
  });
  ...
});

server.listen(process.env.VCAPP_APP_PORT || 3000);

Соответствующий код клиента

<script src="/socket.io/socket.io.js"></script>

<script>
  window.onload = function () {
    ...
    var socket = io.connect(window.location.hostname);
    socket.emit('getServerVariable');
    ...
  };
...

Журнал сервера

$ af logs sync

====> /logs/stdout.log <====

info: socket.io started
debug: served static content /socket.io.js
debug: client authorized
info: handshake authorized veNnUVtoDTIz-oudG7Pa
debug: setting request GET /socket.io/1/websocket/veNnUVtoDTIz-oudG7Pa
debug: set heartbeat interval for client veNnUVtoDTIz-oudG7Pa
warn: websocket connection invalid
info: transport end (undefined)
debug: set close timeout for client veNnUVtoDTIz-oudG7Pa
debug: cleared close timeout for client veNnUVtoDTIz-oudG7Pa
debug: cleared heartbeat interval for client veNnUVtoDTIz-oudG7Pa
debug: served static content /socket.io.js
debug: client authorized
info: handshake authorized 6AKyhROUNjqujk_uG7Pb
debug: setting request GET /socket.io/1/websocket/6AKyhROUNjqujk_uG7Pb
debug: set heartbeat interval for client 6AKyhROUNjqujk_uG7Pb
warn: websocket connection invalid
info: transport end (undefined)
debug: set close timeout for client 6AKyhROUNjqujk_uG7Pb
debug: cleared close timeout for client 6AKyhROUNjqujk_uG7Pb
debug: cleared heartbeat interval for client 6AKyhROUNjqujk_uG7Pb
debug: setting request GET /socket.io/1/xhr-polling/6AKyhROUNjqujk_uG7Pb?t=1348504130465
debug: setting poll timeout
debug: client authorized for 
debug: clearing poll timeout
debug: xhr-polling writing 1::
debug: set close timeout for client 6AKyhROUNjqujk_uG7Pb
debug: setting request GET /socket.io/1/xhr-polling/6AKyhROUNjqujk_uG7Pb?t=1348504130724
debug: setting poll timeout
debug: discarding transport
debug: cleared close timeout for client 6AKyhROUNjqujk_uG7Pb
debug: xhr-polling received data packet 5:::{"name":"getServerVariable"}
debug: clearing poll timeout
debug: xhr-polling writing 5:::{"name":"printLog"}
debug: set close timeout for client 6AKyhROUNjqujk_uG7Pb
server.js: getServerVariable: 
debug: setting request GET /socket.io/1/xhr-polling/6AKyhROUNjqujk_uG7Pb?t=1348504130980
debug: setting poll timeout
debug: clearing poll timeout
debug: xhr-polling writing ���23���5:::{"name":"printLog"}���39���5:::{"name":"setItemValue","args":[""]}���23���5:::{"name":"printLog"}
debug: set close timeout for client 6AKyhROUNjqujk_uG7Pb
debug: discarding transport
debug: cleared close timeout for client 6AKyhROUNjqujk_uG7Pb
debug: setting request GET /socket.io/1/xhr-polling/6AKyhROUNjqujk_uG7Pb?t=1348504131261
debug: setting poll timeout
debug: discarding transport
debug: cleared close timeout for client 6AKyhROUNjqujk_uG7Pb
debug: clearing poll timeout
debug: xhr-polling writing 8::
debug: set close timeout for client 6AKyhROUNjqujk_uG7Pb
debug: xhr-polling closed due to exceeded duration
debug: setting request GET /socket.io/1/xhr-polling/6AKyhROUNjqujk_uG7Pb?t=1348504151659
debug: setting poll timeout
debug: discarding transport
debug: cleared close timeout for client 6AKyhROUNjqujk_uG7Pb
4b9b3361

Ответ 1

AppFog еще не поддерживает websockets. После их недавнего приобретения Nodester они объявили, что они придут через несколько месяцев.

Добавив io.set('transports', ['xhr-polling']);, вы просто устанавливаете транспорт для длинного опроса ajax. По умолчанию Socket.io определяет лучший транспорт на основе возможностей браузера и текущего соединения. Websockets идеально, когда он доступен, но если он не Socket.io не вернется к xhr-опросу среди других транспортов.

Я сам получил ту же ошибку 502 unexpected response / bad gateway при использовании CloudFlare, которая также не может подключаться через прокси-сервер через свою инфраструктуру на основе nginx (обратите внимание, что с 2014 года Cloudflare может использовать прокси-серверы, если вы находитесь в премиальном плане).