У меня есть два отдельных приложения node.js, работающих за nginx. Оба приложения используют socket.io и express. Один обслуживается на порте 5000, а другой - на порту 5001. Но нам нужно, чтобы они оба были доступны через порт 80, чтобы при доступе клиента http://example.com/app1 они перенаправляются в первое приложение, и http://example.com/app2 второе приложение.
Когда у нас было только одно приложение, у нас была эта настройка в файле конфигурации nginx Sites Enabled:
location /app1/ {
proxy_pass http://127.0.0.1:5000/;
}
location /socket.io {
proxy_pass http://127.0.0.1:5000/socket.io/;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_http_version 1.1;
}
Это сработало. Однако теперь, когда мы добавляем второе приложение, я не знаю, как настроить пересылку. Ясно, что socket.io больше не может пересылать на 5000, поскольку соединения из app2 должны подключаться через 5001.
Конечно, должен быть способ указать пересылку socket.io в качестве поддомена каждого из приложений, но я не знаю, что это будет.
Любой совет, который вы могли бы мне дать, был бы очень признателен.
У меня была точная проблема, и я нашел этот простой обходной путь:
Настройте свой клиентский socket.io из файла js / html для подключения из подкаталога (настройка socket.io по умолчанию будет иметь маршруты подключения socket.io к http://example.com/socket.io). вы можете узнать, как это сделать, здесь: запустить socket.io из подкаталога.
так что вам нужно это в своем клиентском файле:
var socket = io.connect('http://example.com', {path: "/app1socket"});
и для другого приложения:
var socket = io.connect('http://example.com', {path: "/app2socket"});
А затем, как и раньше, создайте маршруты для каждого сокета приложения в nginx:
location /app1socket/ {
proxy_pass http://127.0.0.1:3000/socket.io/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
location /app2socket/ {
proxy_pass http://127.0.0.1:4000/socket.io/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
Предполагая, что причина, по которой ваши приложения, работающие под nginx, заключаются в том, чтобы проксировать HTTP-запрос локально запущенному приложению, оставьте конфигурацию файла сервера по стандартной настройке.
var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);
http.listen(4000, '127.0.0.1');
Теперь вы можете создавать несколько приложений socket.io под nginx.
Если я правильно понял ваш вопрос, вам просто нужно перенаправить каждое местоположение на другой сервер, каждое из которых прослушивает другой порт, например:
location /app1/ {
proxy_pass http://127.0.0.1:5000/;
}
location /app2/ {
proxy_pass http://127.0.0.1:5001/;
}
Обратите внимание на финал /
, заменяя исходный URI. Если вы хотите переслать оригинал /app[12]/
URI для бэкэндов, удалите все после <ip>:<port>
пара.