Недавно я установил экземпляр EC2 (в VPC без балансировки нагрузки), и, по общему признанию, конфигурация немного нечетна, но это то, что требуется для используемого веб-приложения.
Веб-сервер (в Haskell) работает на порту 4433 (стандартные порты зарезервированы для экземпляра Apache) и принимает пакеты UDP, транслируемые из другой системы. У меня много открытых портов (только во время тестирования), как показано здесь (из групп безопасности):
Custom TCP Rule 4433 tcp 0.0.0.0/0 ✔
Custom TCP Rule 8080 tcp 0.0.0.0/0 ✔
SSH 22 tcp 0.0.0.0/0 ✔
HTTP 80 tcp 0.0.0.0/0 ✔
HTTPS 443 tcp 0.0.0.0/0 ✔
Custom UDP Rule 30090 udp 0.0.0.0/0 ✔
Custom UDP Rule 30089 udp 0.0.0.0/0 ✔
JavaScript для сокета TCP делает запрос на настройку сокета на этом же порту (с использованием URL-адреса, присвоенного общедоступному IP-адресу AWS), и здесь запрос возвращает ошибку:
Соединение с WebSocket с 'wss://[URL]: 4433/projects/socket' не удалось: сообщение подтверждения открытия WebSocket было отменено.
Привязка сокета к 0.0.0.0 приводит к той же ошибке.
Чтобы запустить веб-сервер Haskell, мне пришлось ссылаться на внутренний IP-адрес, предоставляемый AWS, поскольку он не будет работать при ссылке на публичный IP-адрес, предоставляемый гибким IP-сервисом. Думаю, в этом проблема возникла, я изменил запрос на сокет на это...
wss://[internal ip]:4433/projects/socket
Это изменяет ошибку:
Соединение с WebSocket с 'wss://[внутренний IP]: 4433/projects/socket' не удалось: ошибка в установлении соединения: net:: ERR_CONNECTION_REFUSED
Эта ошибка имеет смысл для меня, поскольку внутренний IP недоступен для внешнего мира.
Все, что я прочитал в websockets на AWS, включает ELB (Elastic Load Balancer), и я не нуждаюсь ни в одном из них. Я пробовал все вещи во всех опубликованных в настоящее время ответах (некоторые из вопросов даже не получили ответов) на SO безрезультатно. Я также установил случай поддержки с Amazon (почти 24 часа назад), который не получил ответа.
Дополнительная информация
Переход на http://[URL]:4433/projects/socket
дает "Доступный WebSocket", где URL-адрес тот, который мы хотим использовать, а также Public DNS, предоставленный AWS.
Запуск netstat -plunt
показывает следующее:
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN -
tcp 0 0 [internal IP]:8080 0.0.0.0:* LISTEN -
tcp 0 0 [internal IP]:4433 0.0.0.0:* LISTEN -
tcp6 0 0 :::22 :::* LISTEN -
tcp6 0 0 :::443 :::* LISTEN -
tcp6 0 0 :::80 :::* LISTEN -
udp 0 0 [internal IP]:30089 0.0.0.0:* -
udp 0 0 0.0.0.0:30090 0.0.0.0:* -
udp 0 0 0.0.0.0:11950 0.0.0.0:* -
udp 0 0 0.0.0.0:68 0.0.0.0:* -
udp6 0 0 :::38450 :::* -
У кого-то была аналогичная проблема с websockets на AWS? Если да, то как вы решили проблему?