2

У меня есть HTTP-сервер Akka, работающий на AWS EC2 Autoscale cluster. Этот блок автоматической шкалы EC2 имеет балансировщик нагрузки ELB Application спереди. В дополнение к ELB у нас есть распределение облачного фронта, которое настроено на обслуживание статических файлов.Как включить websockets на AWS Cloudfront

Мы сталкиваемся с проблемой, когда все запросы на соединение с веб-сайтами от браузеров до Бэкэнд не выполняются с ошибкой HTTP 400 Expected UpgradeToWebsocket header.

При дальнейших исследованиях мы обнаружили, что клиенты могут напрямую подключаться к балансировщику нагрузки, но любой запрос на соединение с помощью облачного отказа не работает. В конце концов я наткнулся на this page на документацию AWS Cloudfront, в которой говорится, что облачный тариф выделяет все заголовки «обновления», которые могут быть причиной того, что клиенты не могут подключиться.

Чтобы обойти эту проблему, я включил опцию «переадресация заголовка» (которая отключает кеширование), но она все еще не работает. Более того, я не смог найти какой-либо вариант для выборочного отключения кэширования облачных вычислений или обхода облачного режима для определенных URL-адресов.

Как мне решить эту проблему и обеспечить работу веб-сайтов через облачный режим? Или это просто не поддерживается?

ответ

0

В настоящее время CloudFront не поддерживает сетевые сокеты.

Некоторые заголовки удаляются из запросов, даже если вы попытаетесь настроить CloudFront для их пересылки. Они указаны в таблице на page you mentioned на «CloudFront удаляет заголовок» и Caching Based on Header Values Is Supported = «Нет».

От Форумов AWS:

Будьте уверены, что нужные люди знают об этой просьбе особенности.

— Richard @ AWS (2015-06-06)

https://forums.aws.amazon.com/thread.jspa?messageID=723375

3

CloudFront не является правильным решением для веб-сокеты, как он оптимизирован для кэширования статических веб-страниц, в то время как веб-сокеты в основном динамический. ELB, с другой стороны, поддерживает как HTTP-сокеты (ws: //), так и защищенные веб-сокеты (wss: //), и его можно настроить для обработки всего дрожания SSL. однако вам необходимо настроить его с настройками TCP, чтобы поддерживать соединение HTTP/HTTPS открытым во время передачи сервера. Вот как это делается:

  1. Нажмите кнопку "Создать систему балансировки нагрузки" на вкладке EC2 нагрузки Балансировщиках
  2. Выберите "Classic Load Balancer". Вам нужно, что для того, чтобы сделать простой TCP
  3. определяют протоколы источника и назначения (Выберите TCP для обычных веб-сокетов):

enter image description here 4. Если вы делаете делать безопасный веб-сокеты вы должны выберите сертификат, например:

enter image description here 5. Настройте проверки работоспособности, добавьте экземпляры и нажмите «Создать». Определите CNAME и все настроено.

Обратите внимание, что если в качестве исходного протокола вы выбираете «HTTP» или «HTTPS», балансировщик нагрузки в какой-то момент выдает код ошибки 408 (тайм-аут), поскольку он не предназначен для слишком долгого подключения. Именно по этой причине мы выбрали TCP.

Смежные вопросы