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