Так что я уже довольно давно искал это и пробовал много вещей, но просто не мог понять, как заставить это работать. Я создал сервер PHP WebSocket (храповик) на моем локальном компьютере, используя XAMPP и интерфейс angular (v5), работал без каких-либо проблем.
Затем я попытался развернуть оба экземпляра DigitalOcean, где запущен стек LAMP, потому что приложение - это больше, чем просто чат WebSocket, а все остальное (RESTful API) работает нормально, но когда JavaScript пытается подключиться к WS, я получаю
WebSocket connection to 'ws://<ip-address>:8888/chat' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED
Итак, что я сделал, так это включил моды apache2 proxy и proxy_wstunnel и создал запись для vhost
<VirtualHost *:8080>
DocumentRoot /var/www/html_backend/web
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
<Directory "/var/www/html_backend/web">
AllowOverride All
Allow from All
</Directory>
ProxyRequests Off
ProxyPass "/chat/" "ws://localhost:8888/"
# also tried 0.0.0.0 and 127.0.0.1 instead of localhost
</VirtualHost>
Серверный сокет PHP запускается так
public function actionStart() {
$app = new App('localhost', 8888, '0.0.0.0');
$app->route('/chat', new Chat());
$app->run();
}
И в JS я пытаюсь подключиться к этому
this._socket = new WebSocket('ws://<ip-address>:8888/chat');
Я также попробовал его на порту 8080, откуда он должен быть проксирован, но затем он вернул ошибку 404.
На порту 80 у меня есть интерфейс, а на порту 8080 - сервер, который пока работает. Я могу запустить WebSocket на порту 8888, который не дал мне никаких ошибок, которые я обнаружил, но при попытке подключиться к нему я получаю верхнее сообщение об ошибке. Это просто для тестирования, и у меня еще нет сертификата SSL, но сначала я хотел, чтобы это работало, или мне он нужен? Я перепробовал множество комбинаций URL, найденных по всему Интернету, но пока ни одна из них не работала.
Во время записи я заметил, что сокет запускается с /var/www/html_backend, а не с /var/www/html_backend/web. Может ли DocumentRoot вызывать проблемы с проксированием?
Я надеюсь, что кто-то может указать мне правильное направление, потому что все "рабочие" решения, которые я нашел, пока не были столь полезны.
Наилучшие пожелания
@ArtisticPhoenix не в первый раз слышу это про сокеты ... xD, но да, порты открыты.
Я построил один в качестве эксперимента около 3 лет назад, а затем решил использовать RabbitMq, поскольку у него было больше функций, чем я мог когда-либо надеяться создать или поддержать.
Я посмотрю, но пока я бы хотел, чтобы это работало просто ради этого
вы не пробовали ::1, но я сомневаюсь, что проблема в этом. Какой браузер вы используете, Chrome? Я только что прочитал, что Chrome не разрешает соединения без SSL, вы можете попробовать FIrefox. Я никогда не предлагаю попробовать IE или Edge, я прожил дни IE6 ... lol
Я попробую Firefox позже, немного испортил порты и не могу открыть соединение putty или ftp прямо сейчас, так как у меня нет с собой ssl-ключей.






Я создаю Websocket с PHP Linux и использую Digitalocean, и его рабочее реле хорошо (мой пример с wss, но вы также можете сделать это с ws).
как я это строю:
Веб-сокет с храповым механизмом на стороне сервера:
$wsServer = new WsServer(new Chat);
$server = IoServer::factory(
new HttpServer($wsServer),
8000
);
Apache httpd-ssl.conf:
<VirtualHost _default_:443>
ProxyPass /wss2/ ws://your.domain:8000
Ваш файл js:
wss://your.domain/wss2/
чем просто запустить php websocket в храповике с помощью команды: php server.php
и тебе хорошо ..
Является ли wss2 маршрутом по умолчанию при использовании new WsServer(..);? и пробовали ли вы это на порте, отличном от порта по умолчанию / будет ли wss://your.domain:8080/wss2/ работать с JS?
это не значение по умолчанию, поэтому мы настраиваем файл httpd-ssl (по умолчанию: your.domain). и вы должны использовать один и тот же порт на сервере и в клиенте
Хорошо, но я имею в виду, что сейчас в моем коде есть этот $app->route('/chat', new Chat());, а в моем виртуальном хосте - ProxyPass "/chat/" "ws://localhost:8888/". Нужно ли мне подключаться к ws://your.domain:8080/chat/chat для заполнения этого маршрута или как это работает? Но позже я просто попробую ваш код создания сервера. знак равно
добавьте порт в маршрут и в своем js измените его на: ws: //your.domain/chat (или просто попробуйте мой полный комментарий)
проверьте, что порты открыты. Socket-серверы - это головная боль .... Я не уверен, для чего вы планируете их использовать, но вы можете изучить что-то вроде RabbitMq, то есть очереди сообщений. Полностью зрелый, простой в использовании, продаваемый и т. д.