Websocket с sails.io.js и AWS (балансировщик нагрузки приложения)

В течение пары дней я пытался заставить мое приложение sails v0.12.14 (используя sails & sails.io.js) работать с ALB на AWS. Я просмотрел всю документацию и несколько постов, но мне не повезло.

На моих машинах разработки приложение работает без проблем. Однако, когда мы запускаем производство, у нас происходят странные вещи. Наше приложение sails запускается в Docker как локально, так и в prod (где мы используем ECS и приложение развернуто на каждом экземпляре).

Сначала сокет подключен к парусу, и я могу войти в систему и нормально использовать свое приложение. Но через несколько минут я замечаю, что Socket показывает, что он был отключен. Затем говорит, что Socket пытается повторно подключиться к Sails, он подключается через ~5 секунд, а затем продолжает отключаться.

Затем отображается ошибка:

Соединение WebSocket с 'wss://url.com/socket.io/?__Sails_io_sdk_version=0.14.0&__sails_io_sdk_platform= узел &__sails_io_sdk_language=javascript&EIO=3&transport=websocket' не удалось: ошибка при ответе на код ошибки: ошибка 506: ошибка при ответе WebSocket

Я следовал документации по парусу и включил только websocket в config / sockets.js

transports: ["websocket"]

Затем внутри views / layout.ejs я добавил следующее:

<script src="/assets/js/dependencies/sails.io.js" transports="websocket"></script>

Я включил липкие сеансы (1 день) для целевой группы, связанной с балансировщиком нагрузки приложения в AWS. И задержка отмены регистрации 300 секунд. Кроме того, необходимо создать правило ALB для маршрутизации шаблона пути /socket.io к целевой группе, связанной с приложением:

Ниже приведены экраны из моей группы безопасности, где я открыл порт 80 и 443 трафика:

И вот мой слушатель, связанный с ALB:

Что-то, что я заметил, это то, что sailsIOClient, который мы используем во внешнем интерфейсе, идет в sails.io.js из каталога node_modules, а не в /assets/js/dependencies/sails.io.js - но не вижу, как это может вызвать соединение проблемы.

Я также создал sailsIOClient и установил транспорт ("websocket") непосредственно в переменную io, и мы получили тот же результат.

Я в значительной степени в недоумении, что делать. Любая помощь будет оценена.


ОБНОВЛЕНИЕ с 6 января 2018 года

Так что есть некоторые обновления, но до сих пор не удалось взломать это..

В основном я заметил нечто странное, что я не видел сессий внутри моего Redis. Я установил "connect-redis" и теперь вижу, что эти сессии появляются внутри redis db (Elasticache).

Еще одно замечание, что websockets отлично работает за AWS ALB в случае, если у меня есть только один экземпляр. Как только я масштабирую второй экземпляр (или больше), я замечаю сообщение:

[Ошибка] Соединение WebSocket с 'wss://url.com/socket.io/?__Sails_io_sdk_version=0.14.0&__sails_io_sdk_platform= узел & __ sails_io_sdk_language = javascript & EIO = 3 & transport = код веб-сокета' завершилось неудачно: неожиданный ответ 502: не получен

Думая, что он все еще пытается использовать длинный опрос, я убедился, что на стороне клиента есть:

io.sails.transports = ['websocket'];

В частности, на стороне клиента это то, что у меня есть:

const io = sailsIOClient(socketIOClient);
io.sails.url = config.sioUrl;
io.sails.transports = ['websocket'];
io.sails.useCORSRouteToGetCookie = false;
io.sails.headers = {"x-csrf-token": store.session('token')};

Я нашел здесь кое-что интересное, в котором говорится о выполнении http_upgrade, но я понятия не имею, как это сделать или есть ли какой-то путь в коде. Так как я использую docker с парусами, у меня фактически нет прокси nginx... может быть, это недостающий элемент?

0 ответов

Другие вопросы по тегам