Настройка нескольких приложений socket.io/node.js на сервере Apache?

Недавно я возился с 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?

Добро пожаловать в StackOverflow. Описание вашей проблемы действительно велико, что дает шанс пользователям избежать ее. Пожалуйста, ознакомьтесь с руководством Как создать минимальный, полный и проверяемый пример и попытайтесь объяснить его немного короче. Будет легче читать и понять, как вам помочь, и вы быстрее получите ответы, которые могут быть полезны для решения вашей проблемы :)

ikos23 09.09.2018 00:03
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
677
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как вы уже видели, по умолчанию 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">.

VirtualParticle 09.09.2018 23:16

Полное объяснение и пример кода можно найти здесь: stackoverflow.com/questions/9831594/…

Dr. Aaron Dishno 28.05.2020 21:32

Другие вопросы по теме