Устранение неполадок Websockets с EC2 на AWS с использованием Django

Я использую Django-Channels, чтобы попытаться получить функции реального времени, такие как чат/обмен сообщениями, уведомления и т.д. Сейчас я получил все, чтобы нормально работать на моем ноутбуке, используя настройки, описанные в документах: http://channels.readthedocs.io/en/latest/. Я использую локальный сервер redis для тестирования.

Однако, когда я развертываю свой сервер Amazon EC2 Elastic Beanstalk (используя AWS ElastiCache Redis), функциональность WebSocket терпит неудачу. Я читал, и я думаю, что это связано с тем, что Amazon HTTPS не поддерживает WebSockets, поэтому мне нужно переключиться на Secure TCP. Я попытался сделать это с помощью: https://blog.jverkamp.com/2015/07/20/configuring-websockets-behind-an-aws-elb/ а также https://medium.com/@Philmod/load-balancing-websockets-on-ec2-1da94584a5e9#.ak2jh5h0q но безрезультатно.

Есть ли у кого-нибудь успех в реализации WebSockets с CentOS/Apache и Django на AWS EB? Пакет Django-Channels довольно новый, поэтому я был удивлен, если кто-то испытал и/или преодолел это препятствие. Спасибо заранее

Ответ 1

AWS запустила новый Балансировщик нагрузки приложений, который поддерживает сетевые сокеты. Измените свой ELB на Балансировщик нагрузки приложения, и это устранит вашу проблему.

https://aws.amazon.com/blogs/aws/new-aws-application-load-balancer/

Ответ 2

Как описано здесь, можно запустить Django Channels на Elastic Beanstalk с помощью балансировки нагрузки приложения.

В упрощенной форме это в основном:

  • Создайте ALB
  • Добавьте 2 целевые группы, которые указывают на порт 80, и один, который указывает на порт Дафни, то есть 8080.
  • Создайте 2 правила пути. Пусть маршрут по умолчанию указывает на целевую группу 1 (порт 80), а второй - на относительный путь, т.е. /ws/ и укажите его на целевую группу 2.
  • Добавьте Дафни и рабочих в супервизор (или другую систему инициализации)
  • СДЕЛАНО! Доступ к Daphne/websockets через относительный url ws://example.com/ws/.

Ответ 4

Я полагаю, что ALB - единственный способ. Причина в том, что с помощью списка протоколов SSL-протокола в классическом LB лиги на сессию и заголовки X-Forwaded не будут перенаправлены и приведут к циклу перенаправления прокси-сервера. Док здесь,

http://docs.aws.amazon.com/elasticloadbalancing/latest/classic/elb-listener-config.html

Я обновлю ответ, если узнаю способ с существующей CLB.