2017-02-17 6 views
0

испытывающих трудности Перефразируя мой вопрос, так что я не мог найти много информации о нем, так что я поясню:Mutliple HTTP маршруты на Elastic Beanstalk балансировки нагрузки для приложения узла с несколькими серверами

У меня есть Node.js приложение, которое хозяйничает a restify/express api на порту 8081. В этом же api размещен сервер websocket на порту 8083.

Все это прекрасно работает на локальном хосте, указав порты, но в размещенной среде его необходимо запустить на порт 80 http. (для простоты опущено 443).

Я использую AWS Elastic Beanstalk (сервер nginx). Когда я развернул свое приложение, он создает экземпляр EC2 и ELB (балансировка нагрузки). Затем у ELB есть общедоступные dns, которые я использую для доступа к api на порту 80. Нет специальных настроек для прослушивателей (только 80 и 443). Так что я не знаю, как он попадет в апи на порт 8081. Экземпляр EC2 также позволяет только 80 и 443.

АНЯ прекрасно работает, используя его с общественным днсом УДРЫ на порт 80.

Теперь я добавили сервер websocket.

Моя проблема - мне нужно другое публичное dns на порту 80, чтобы перейти на сервер сокета на порт 8083 того же приложения Beanstalk. Как я подхожу к этому?

Буду признателен за любые мысли и идеи.

ответ

2

Оказывается, что ..

  1. Elastic Beanstalk создает классические балансировки нагрузки, которая не поддерживает WebSockets.
  2. По умолчанию установка nginx на AWS не разрешает Upgrade заголовки.

Однако, я получил это работает следующим образом:

  • По умолчанию EB установки (с классическим УДР) служит API, как это обычно делал.
  • Затем я создал ALB (балансировщик нагрузки приложения) с панели управления EC2.
  • Я добавил цель, которая маршрутизируется к моему экземпляру EC2 (созданному ЭБ) на порту 8083 (мой прослушиватель веб-рассылки). Мой API работает на порту 8081. Затем добавьте цель в новый ALB на вкладке «Слушатели».

Это позволит трафику, попадающему в новый ALB на порт 80, маршрутизировать в порт 8083 сервера, на котором размещено мое приложение.

  • В моем .ebextensions файла в проекте, я добавил следующее, что будет обновлять настройки Nginx, чтобы позволить Upgrade заголовок, который необходим для WebSockets:

Добавить в .ebextensions

container_commands: 
    enable_websockets: 
    command: | 
     sed -i '/\s*proxy_set_header\s*Connection/c \ 
       proxy_set_header Upgrade $http_upgrade;\ 
       proxy_set_header Connection "upgrade";\ 
       ' /tmp/deployment/config/#etc#nginx#conf.d#00_elastic_beanstalk_proxy.conf 

Поэтому в основном у меня два балансира нагрузки. По умолчанию используется маршрут от 80 до 8081, а другой (ALB), который маршрутизирует от 80 до 8083.

Это отнюдь не идеально.Автоматическое масштабирование/балансировка нагрузки, вероятно, не сработают. Но пока это сервер API и веб-сервер из того же приложения.

+0

Просто добавьте - это то, что должен был сделать ALB. Мне нужно прочитать и посмотреть, как правильно настроить его. –

+1

Эта проблема с сетевыми сокетами в значительной степени связана с плохой (или сложной) документацией AWS. Ты поставил меня на правильный путь. ** Ключевым аспектом является то, что экземпляры beanstalk, созданные с консоли, не поддерживают Application ELB **. Вам необходимо создать его из EB CLI, когда его спросят: Выберите тип балансировки нагрузки 1) классический 2) приложение Выберите приложение. [AWS Docs] (https://aws.amazon.com/about-aws/whats-new/2016/08/aws-elastic-beanstalk-supports-application-load-balancer/) – Lisandro

+0

Вы когда-нибудь работали с только ALB? – KBeckers