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 например), то ни с локальной сети, ни с глобальной я подключиться не могу, браузер выдаёт ошибку "connection refused", так она выглядит в хроме:94221b86c9454cf6ac3bdbc7eabdfcd5.png
Было бы идеально как-то исправить ситуацию на этом этапе.

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

НО! это работает только с компьютера, на котором включен сервер, тоесть только так:new WebSocket("ws://localhost/ws/")
Если подставлять вместо localhost мой локальный или глобальный адрес, то подключения не происходит.
Полный код моего единственного хоста:
<VirtualHost *:80>
ServerAdmin admin@diskyp
DocumentRoot "D:/XAMPP/htdocs/site"
ServerName server
ErrorLog "logs/serv-error.log"
CustomLog "logs/serv-access.log" common
<Proxy *>
Options FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
</Proxy>
ProxyPass /ws/ ws://localhost:8080/chat
ProxyPassReverse /ws/ ws://localhost:8080/chat
ProxyRequests Off
ProxyPreserveHost On
ProxyVia On
Header set Connection "upgrade"
Header set Upgrade "websocket"
</VirtualHost>


Далее я перешёл на 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/")
При подключении через ws протокол к серверу я всегда получаю 404 ошибку, в мозилле она выглядит так: c55150a7325d4ce5b6c9b4fe3827cb36.png

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

Что на самом деле нужно, чтобы к моему вебсокету смогли подключаться люди из интернета?
  • Вопрос задан
  • 424 просмотра
Пригласить эксперта
Ответы на вопрос 1
Ну так port forwarding на роутере же надо настроить.
Ответ написан
Ваш ответ на вопрос

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

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