Есть вебсокет на 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 порт открыт на хосте
Дополняю #2
Если обращаться к серверу, то он возвращает 404 ошибку, в мозилле она выглядит так:
Если пытаться обращаться напрямую к сокету, то я получаю ошибку от браузера "connection refused", в хроме она выглядит так:
Соединение я тестирую здесь:
www.websocket.org/echo.html