Настроить несколько приложений socket.io/node.js на сервере Apache? - PullRequest
0 голосов
/ 09 сентября 2018

Я недавно возился с socket.io и node.js, и после успешного создания приложения на основе чата я захотел создать еще одно подобное веб-приложение. Я завершил его, и все работало нормально, когда я размещал локально на своем компьютере, но как только я установил его на свой веб-сервер, он перестал работать. Node обслуживал страницу просто отлично, но соединение с 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?

1 Ответ

0 голосов
/ 09 сентября 2018

Как вы уже видели, по умолчанию 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'
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...