Как заставить Amazon ELB с HTTPS / SSL работать с веб-сокетами? - PullRequest
25 голосов
/ 08 февраля 2012

Кажется, сейчас это не работает.Я использую Фэй с NodeJS за Amazon ELB.Когда я включаю HTTPS, соединения больше не могут быть разорваны.Я нашел здесь вопрос без ответа: https://forums.aws.amazon.com/message.jspa?messageID=283293.Кто-нибудь может заставить это работать?Есть ли какая-нибудь работа вне моего собственного экземпляра HAProxy?

Ответы [ 4 ]

42 голосов
/ 09 февраля 2012

Я подтверждаю, основываясь на наших собственных тестах, что настройка ELB на TCP / SSL, а не на HTTP / HTTPS, делает свое дело с WebSockets. Недостатков два:

1) Как уже указывал Артурнт, вы не можете получить липкость.

2) Вы потеряете возможность восстановить личность клиентов. Исходный IP-адрес, видимый вашим сервером WebSocket, всегда будет ELB, и, в отличие от конфигурации HTTP / HTTPS, в запросы не будет добавлен заголовок X-Forwarded-For.

ОБНОВЛЕНИЕ Июль 2013 : Amazon только что добавила поддержку Прокси-протокол , который устраняет недостаток № 2 выше. При использовании протокола Proxy заголовок, содержащий исходный IP-адрес клиента, добавляется даже тогда, когда ELB работает на уровне TCP, а не HTTP. Полная информация: http://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/enable-proxy-protocol.html

ОБНОВЛЕНИЕ Август 2016 : Amazon только что анонсировала новый AWS Application Balancer , который поддерживает WebSocket на уровне 7 (а также HTTP / 2.0 и контент) маршрутизация). Смотри https://aws.amazon.com/it/blogs/aws/new-aws-application-load-balancer/

10 голосов
/ 08 февраля 2012

Это не будет работать, HTTP (S) прокси-сервер ELB не понимает запросы веб-сокетов, по крайней мере, на данный момент, и я не знаю, когда / если это запланировано.

Я не уверен, что HAProxy полностью необходим, хотя. Должна быть возможность поставить терминатор SSL, например, stud / stunnel, в том же экземпляре, что и ваши серверы nodejs, и проходите через этот путь. Затем вы можете сохранить ELB, но перевести его в режим TCP.

Очевидно, что в каждом экземпляре есть издержки SSL, но в долгосрочной перспективе это, вероятно, масштабируется лучше, чем разгрузка SSL в ELB (особенно на основе комментариев пользователей о производительности SSL ELB).

4 голосов
/ 08 февраля 2012

После ответа Джеймса я провел немного больше исследований и в конечном итоге пошел к TCP-маршруту, не будучи уверенным, что у него есть какие-либо недостатки по сравнению с использованием HTTP-туннелирования ELB (учитывая, что мне не нужна липкость).Хорошо, что вам не нужно делать гвоздик / оглушение, так как ELB предоставит это вам.Итак, окончательная настройка ELB, где NodeJS / Faye прослушивают порт 8000:

Secure TCP Forward (443) -> Local (8000)
TCP Forward 80 -> Local(8000)
1 голос
/ 25 августа 2016

Вы можете использовать Application LB для хорошей поддержки websocket.Я только что реализовал эту идею в нашем последнем проекте после того, как реализовал некоторые трюки в ALB:

  1. открытие 80 порта на всех связанных SG *
  2. , чтобы NodeJS работал на 80
  3. NodeJS отвечает на запрос http-80 (NodeJS обновит запрос http до веб-сокета в бэкенде)
  4. заставить целевую группу ALB проверять http-80 и правильный путь пинга
  5. создать прослушиватели на ALB: http80->http80, https443->http80
  6. создание правил прослушивателя на ALB: http80->target group, https443->target group
  7. Включение поддержки липкости http в
...