Недавно я возился с socket.io и node.js, и после успешного создания приложения на основе чата я захотел создать еще одно аналогичное веб-приложение. Я завершил его, и все работало нормально, когда я размещал локально на своем компьютере, но как только я поместил его на свой веб-сервер, он перестал работать. Узел отлично обслуживал страницу, но соединение с socket.io не выполнялось. Это связано с тем, как я настроил параметры прокси-сервера Apache, чтобы предыдущее приложение работало. Немного предыстории:
Когда я закончил первую программу, мне было трудно запустить ее на удаленном сервере. Я размещал приложение на порту 3000 и пытался заставить apache перенаправить определенный URL-адрес на этот порт. Я хотел, чтобы http://example.com/app1
по существу пересылал http://example.com:3000
. У меня это произошло после добавления ProxyPass /app1 http://localhost:3000
в файл конфигурации Apache, и это поставило меня в ситуацию, аналогичную описанной выше. Сама страница загрузилась нормально, но фактического подключения к socket.io не было. Я понял, что проблема в том, что клиент искал socket.io по URL-адресу http://example.com/socket.io
. Поскольку на порт 3000 перенаправлялся только подкаталог /app1
, было понятно, что клиент не сможет правильно подключиться к серверу. Чтобы исправить это, я добавил ProxyPass /socket.io http://localhost:3000/socket.io
в файл конфигурации Apache. Это по существу устранило проблему, так как теперь все запросы для socket.io отправлялись на правильный порт.
Это сработало для меня, пока я не захотел настроить второе приложение на другом порту. Клиент для второго приложения имел адрес http://example.com/app2
, который снова был перенаправлен на порт на веб-сервере, на этот раз порт 3001, с использованием ProxyPass /app2 http://localhost:3001
. Как я описал ранее, сама страница загрузилась нормально, но соединение с socket.io не было установлено. Эта новая клиентская страница снова отправляла все запросы socket.io на http://example.com/socket.io
. Как вы могли догадаться, весь трафик со страницы клиента второго приложения отправлялся не на тот сервер. Я изменил порт, на который перенаправлялся /socket.io
, с 3000 на 3001, что позволило второму приложению работать должным образом, но теперь первое приложение имеет ту же проблему.
Независимо от того, что я делаю, я не могу заставить клиентские страницы запрашивать, чтобы socket.io находился под URL-адресом приложения, такого как http://example.com/app1/socket.io
. Я могу изменить исходную строку сценария на странице клиента на что-то вроде <script src = "app1/socket.io/socket.io.js"></script>
(с начальным символом «/» или без него), но это все равно не работает. Я полагаю, что проблема сводится к попытке найти способ одновременного запуска двух полностью отдельных серверов node.js / socket.io.
TL; DR: Как я могу иметь два сервера socket.io, работающих одновременно на одном сервере Apache?
Как вы уже видели, по умолчанию socket.io инициирует все соединения с одним и тем же URL-адресом. По умолчанию ваши два приложения будут использовать один и тот же URL-адрес, и поэтому ваш сервер Apache не может определить, какой из них есть, чтобы проксировать их по-разному.
Таким образом, единственный способ исправить это - настроить одну из ваших установок socket.io (как клиент, так и сервер) для использования настраиваемого пути, который затем вы можете проксировать отдельно от пути socket.io по умолчанию.
Вы можете установить путь к серверу при создании сервера, как описано здесь.
const server = require('http').createServer();
const io = require('socket.io')(server, {
path: '/myownpath'
});
server.listen(3000);
Вы можете установить путь запроса клиента при установлении соединения в клиенте, как описано здесь.
const socket = io('http://localhost', {
path: '/myownpath'
});
Это работает! Всем, у кого была такая же проблема и кто использовал это решение, убедитесь, что на странице клиента вы изменили <script src = "socket.io/socket.io.js">
на <script src = "/myownpath/socket.io.js">
.
Полное объяснение и пример кода можно найти здесь: stackoverflow.com/questions/9831594/…
Добро пожаловать в StackOverflow. Описание вашей проблемы действительно велико, что дает шанс пользователям избежать ее. Пожалуйста, ознакомьтесь с руководством Как создать минимальный, полный и проверяемый пример и попытайтесь объяснить его немного короче. Будет легче читать и понять, как вам помочь, и вы быстрее получите ответы, которые могут быть полезны для решения вашей проблемы :)