Назад | Перейти на главную страницу

Использование nginx для проксирования нескольких экземпляров sockets.io

У меня есть два отдельных приложения 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> пара.