Использование Primus.io (веб-сокеты) за AWS Elastic Load Balancer

Я пытаюсь настроить эластичный балансировщик нагрузки для маршрутизации запросов в кластер серверов node.js, на которых работает Primus.io с sockjs для управления коммуникациями в реальном времени.

Я настроил балансировщик нагрузки для прослушивания со следующей конфигурацией:

  • HTTPS 8084 -> HTTPS 8084 (порт, используемый на моих серверах node.js)
  • SSL 443 -> TCP 80

Насколько я понимаю, единственный способ заставить веб-сокеты работать через ELB - это через SSL-> TCP, отсюда и вышеуказанная конфигурация.

Я правильно включил новый протокол прокси для ELB, как описано здесь:

http://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/enable-proxy-protocol.html

При попытке подключиться к серверу от клиента сначала отправляется запрос HTTPS, а затем, насколько я могу судить, его следует обновить до веб-сокетов. Но запрос просто не выполняется, когда я отправляю его на адрес балансировщика нагрузки.

Если я отправлю начальный запрос подключения Primus к IP-адресу одного сервера nodejs, например:

var primus = new Primus('https://ip.address.of.single.server:8084');

Запрос правильно возвращен и правильно обновлен до веб-сокетов.

Когда я переключаю IP-адрес на IP-адрес балансировщика, он терпит неудачу, и первоначальный https-запрос к серверу node.js ничего не возвращает. Я предполагаю, что это означает, что передача через веб-сокет не может быть установлена, но, честно говоря, у меня мало опыта в этой области, поэтому я могу ошибаться.

Кто-нибудь знает, что я делаю не так?

заранее спасибо


person Gordo    schedule 14.11.2013    source источник


Ответы (1)


Вы сгруппировали свои NodeJS-экземпляры? Например, если вы используете SocketIO, вам следует использовать кластерное хранилище сеансов. На самом деле, я сейчас исследую то же самое с SockJS, работающим поверх Vertx.

Проблема заключается в том, что Amazon ELB не будет уважать никакие пересылки в прошлом (в отличие от Sticky Session поверх HTTP), что означает, что соединения через уровень TCP могут быть переадресованы на любом узле кластера. Да, один канал tcp подойдет. Но такие фреймворки, как SocketIO, делают немного больше для поддержки сеансов (не существует в WebSockets) и нескольких транспортных уровней (http, опрос, сокеты и т. Д.).

person knalli    schedule 20.11.2013
comment
Хорошо. У меня та же проблема с кластером из 2 экземпляров Vert.X + SockJS. Вроде все нормально (браузер устанавливает сокетное соединение и получены первые 3-4 пинга). Но тогда связь молчит. - person knalli; 24.11.2013
comment
Спасибо ... Я до сих пор не нашел решения этой проблемы, и мне, вероятно, придется настроить еще один экземпляр EC2 с Haproxy, чтобы обойти это. Фигово. - person Gordo; 02.12.2013
comment
В настоящее время я тестирую стандартный ELB (TCP / SSL) с кластером SockJS на основе Vert.X. Кажется, работает без сеанса. Однако в основном без сохранения состояния я использую самогенерируемый токен с поддержкой приложения для идентификации соединения. - person knalli; 03.12.2013