fred55rus
@fred55rus

Как сделать вебсокет доступным из интернета?

Есть вебсокет на php с использованием библиотеки ratchet, тут наверное интересен только код подключения:
require 'vendor/autoload.php';  
use Ratchet\MessageComponentInterface;  
use Ratchet\ConnectionInterface;
require 'php/process.php';
// Run the server application through the WebSocket protocol on port 8080
$app = new Ratchet\App("localhost", 8080, '0.0.0.0', $loop);
$app->route('/chat', new Chat, array('*'));
$app->run();

Он запущен через командную строку, и подключаюсь я к нему через js: new WebSocket("ws://localhost:8080/chat")
Так всё работает.

Я также могу подключиться с другого компьютера из своей локальной сети, если и в php и в js коде заменю localhost на локальный адрес хоста (192.168.1.63 в моём случае).
Однако если подставить мой внешний ip (2.60.19.4 например), то ни с локальной сети, ни с глобальной я подключиться не могу. Было бы идеально как-то исправить ситуацию на этом этапе.

Дальше я искал альтернативный способ и нашёл его в подключении к вебсокетам через запрос к серверу. Это дало мне, что я могу подключиться к своему вебсокету через apache, благодаря ProxyPass (mod_proxy_wstunnel разблокирован):
ProxyPass /ws/ ws://localhost:8080/chat
ProxyPassReverse /ws/ ws://localhost:8080/chat

НО! это работает только с компьютера, на котором включен сервер, тоесть только так:new WebSocket("ws://localhost/ws/")
Если подставлять вместо localhost мой локальный или глобальный адрес, то подключения не происходит.

Далее я перешёл на nginx и результат улучшился, я мог подключиться не только с хоста, но и с других компьютеров в локальной сети, однако из интернета, по своему внешнему ip, подключиться всёравно нельзя. В nginx у меня для этого был такой конфиг в nginx.conf:
location /chat/ {
	proxy_pass http://localhost:8080/chat;
	proxy_http_version 1.1;
	proxy_set_header Upgrade $http_upgrade;
	proxy_set_header Connection "upgrade";
}

И подключался я соответственно:new WebSocket("ws://192.168.1.63/chat/")

Но ни один из вариантов так и не позволил мне получить доступ к моему вебсокету из интернета.
Тут ещё наверное важно заметить, что к своему серверу я могу подключаться как из локальной сети, так и из интернета, проблема только с вебсокетом.

Что на самом деле нужно, чтобы к моему вебсокету смогли подключаться люди из интернета?

Дополняю
8080 порт открыт на хосте 162580f6ea1f4dc28d85976457bf459a.pngДополняю #2
Если обращаться к серверу, то он возвращает 404 ошибку, в мозилле она выглядит так:c55150a7325d4ce5b6c9b4fe3827cb36.png
Если пытаться обращаться напрямую к сокету, то я получаю ошибку от браузера "connection refused", в хроме она выглядит так:94221b86c9454cf6ac3bdbc7eabdfcd5.png
Соединение я тестирую здесь: www.websocket.org/echo.html
  • Вопрос задан
  • 1628 просмотров
Пригласить эксперта
Ответы на вопрос 1
rassu
@rassu
системный администратор
пробросить порт через роутер, где работает web-socket.

Тогда обращаться к веб-сокету, снаружи, как:
new WebSocket("ws://2.60.19.4/chat/")

где 2.60.19.4 - ваш внешний ip, так же использовать его с порто 8080 или 80, как уже требуется.

Проверьте, что у вас слушает на проброшенном порту 8080 и 80 конфиг апача или nginx, который проксирует web-socket. раз 404, значит запрос попадает не в тот vhost.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы