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 шт):

Автор решения: S.H.
  1. нет, "доменное имя только на SSL работает" - это неправильное утверждение.

Дело в том, что DNS (система доменных имен, отвечающая за буквенные имена) это штука, совершенно отдельная от HTTP и SSL. (ну, SSL применяется в основном на HTTP, но, вообще говоря, им не ограничивается)

Применительно к вебсокетам - SSL влияет на префикс в URL ( ws или wss )

  1. Почему же не работает?

Проверяйте разрешение имен. Что у Вас 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 - то есть, к любому доступному интерфейсу.

→ Ссылка