Usando o nginx para fazer proxy de várias instâncias de sockets.io

1

Eu tenho dois aplicativos node.js separados rodando atrás do nginx. Ambos os aplicativos usam socket.io e express. Um é servido na porta 5000 e o outro na porta 5001. Mas precisamos que ambos sejam acessados pela porta 80 para que, quando um cliente acessar o link , ele seja acessado. são encaminhados para o primeiro aplicativo e vinculam o segundo aplicativo.

Quando tínhamos apenas um aplicativo, tínhamos essa configuração no arquivo de configuração do 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;
    }

Isso funcionou bem. No entanto, agora que estamos adicionando um segundo aplicativo, não sei como configurar o encaminhamento. Claramente, o socket.io não pode mais ser encaminhado para o 5000, já que as conexões do app2 precisam se conectar através do 5001.

Certamente deve haver uma maneira de especificar o encaminhamento de socket.io como um subdomínio de cada um dos aplicativos, mas não sei o que seria.

Qualquer conselho que você possa me dar seria muito apreciado.

    
por BarthesSimpson 19.11.2014 / 23:37

2 respostas

1

Eu estava com o problema exato e encontrei esta solução simples:

Configure seu cliente socket.io do seu arquivo js / html para conectar-se a partir do subdiretório (A configuração padrão do socket.io terá suas rotas de conexão do socket.io para link socket.io ). você pode descobrir como fazer isso aqui: get socket .io executando a partir do subdiretório .

para que você queira isso no seu arquivo de cliente:

var socket = io.connect('http://example.com', {path: "/app1socket"});

e para outro aplicativo:

var socket = io.connect('http://example.com', {path: "/app2socket"});

E, como você fez antes, crie rotas para cada soquete de aplicativo no 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;
}

Assumindo que seus aplicativos executados no nginx sejam uma solicitação HTTP para um aplicativo localmente em execução, deixe a configuração do arquivo do servidor de acordo com a configuração padrão.

var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);
http.listen(4000, '127.0.0.1');

Agora você pode fazer vários aplicativos do socket.io sob nginx.

    
por 18.07.2015 / 14:17
0

Se eu entendi sua pergunta corretamente, você só precisa redirecionar cada local para um back-end diferente, cada um ouvindo em uma porta diferente, como o seguinte:

location /app1/ {
        proxy_pass http://127.0.0.1:5000/;
}

location /app2/ {
        proxy_pass http://127.0.0.1:5001/;
}

Mente o final / , substituindo o URI original. Se você deseja encaminhar o /app[12]/ URI original para os back-ends, remova tudo depois do par <ip>:<port> .

    
por 21.11.2014 / 11:01