websockets workerman
Не получается запустить сокет на http на доменном имени, работает только на IP
$tcp_worker = new Worker('websocket://15.15.15.15:2222'); //В таком виде работает
$tcp_worker = new Worker('websocket://mydomain.com:2222'); //В таком виде не работает
Реально ли это или доменное имя только на SSL работает?
Ошибка: Error in connection establishment: net::ERR_CONNECTION_TIMED_OUT
Ответы (1 шт):
- нет, "доменное имя только на SSL работает" - это неправильное утверждение.
Дело в том, что DNS (система доменных имен, отвечающая за буквенные имена) это штука, совершенно отдельная от HTTP и SSL. (ну, SSL применяется в основном на HTTP, но, вообще говоря, им не ограничивается)
Применительно к вебсокетам - SSL влияет на префикс в URL ( ws или wss )
- Почему же не работает?
Проверяйте разрешение имен. Что у Вас mydomain.com означает именно тот IP адрес, на котором вебсокет работает.
делается это примерно так:
> nslookup
Default Server: UnKnown
Address: 192.168.10.250
> it.junecat.ru
Server: UnKnown
Address: 192.168.10.250
Non-authoritative answer:
Name: it.junecat.ru
Address: 77.246.237.74
Когда проверяете - не забудьте, что для локальной машины обычно файл hosts имеет приоритет над DNS - разрешением имен. Надо проверить, что там не прописано что то, что сбивает вашу программу с толку.
Если всё это не помогло - можно вооружиться fiddler'ом или wireshark'ом и посмотреть, в одно и то же место пытается программа пойти, или нет? просто сравнив трафик при этих попытках коннекта
Можно еще один фокус провернуть. Если не работает то, что Вы вписали в конфиг nginx'а - попробуйте mydomain.com вписать в какую то очень простую строчку конфига, типа proxy_redirect. Если редирект заработает - значит, с разрешением имен все хорошо.
И еще, что nginx пговорит на команду sudo nginx -t - это проверка корректности конфига?
Ддополнение
Я написал маленькое дополнение после такого учтонения:
"сам сокет запущен через PHP, а обращения идут с клиента(ноды) по локалке"
Смотрите.
Теперь я полностью потерял нить рассуждений.
вернемся к началу вопроса:
$tcp_worker = new Worker('websocket://15.15.15.15:2222'); //В таком виде работает
$tcp_worker = new Worker('websocket://mydomain.com:2222'); //В таком виде не работает
Вопрос: а в каком месте этот код написан?
я ожидаю вот чего.
У вас есть сервер. Несмотря на все попытки скрыть это, стало понятно, что сервер, скорее всего - это nginx + php-fpm
Затем, у Вас на сервере есть что то, что создаёт серверный web-socket. Этот код нигде в вопросе не написан. Вероятно, это какой то код на php. Причем, опять таки, непонятно, как этот код запущен в режиме сервиса: ведь для того, чтобы клиент мог подключиться к сокету - сервер должен слушать. А все технологии запуска php под nginx - рассчитаны на "дёрнули - отработал - умер!", то есть ни о каких долгоживущих процессах там вроде как речи не идёт.
И наконец, у вас должно быть что то, что пытается с склиента к этому серверному сокету обратиться. И ТОЛЬКО В ЭТОМ МЕСТЕ у вас вообще возникает доменное имя. Или ip. Во всех остальных местах сокет (по умолчанию, если не приложить дополнительных усилий) биндится к IP 0.0.0.0 - то есть, к любому доступному интерфейсу.