Hospedando vários aplicativos Nodejs em uma única porta

3

Estou tentando executar vários aplicativos nodejs (usando o framework expresso) todos servidos na mesma porta externa (80), mas cada um sob um subdiretório.

Por exemplo Eu quero ...

NodeJsApplication1 to be available at http://www.mydomain.com/NodeJsApplication1

NodeJsApplication2 to be available at http://www.mydomain.com/NodeJsApplication2

etc.

Eu tentei usar o Nginx como proxy com um conf semelhante ao seguinte.

server {
    listen       80;
    server_name  www.mydomain.com;

    location / {
        root   /var/www/html;
        index  index.html index.htm;
    }

    location /NodeJsApplication1/ {
        proxy_pass http://0.0.0.0:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        rewrite /NodeJsApplication1/(.*) /$1 break;
    }

    location /NodeJsApplication2/ {
        proxy_pass http://0.0.0.0:3001;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        rewrite /NodeJsApplication2/(.*) /$1 break;
    }
}

Isso funciona para acessar a página, mas quebra todas as URLs relativas na página de retorno. Todos os scripts e csss estão apontando para a raiz (por exemplo, www.mydomain.com/styles/main.css).

Eu sei que posso usar vários subdomínios, mas não quero percorrer esse caminho. Eu preferiria ter um proxy de subpasta, então tudo é tratado em software e não preciso configurar nenhum registro de DNS para cada aplicativo.

Isso é possível?

Atualizar

Dentro dos próprios aplicativos, todos os links estão usando caminhos relativos. Por exemplo:

<link href="styles/main.css" />
<script src="scripts/app.js" />

Mas quando processado, o navegador os trata como " www.mydomain.com/styles/main.css " em vez de " www.mydomain.com/NodeJsApplication1/styles/main.css ".

Atualização 2 Eu conheço dois três soluções possíveis (não ideais) para este problema.

  • O primeiro a ser modifica os aplicativos NodeJS para especificar um URL completo , mas isso requer que o aplicativo conheça o subdiretório no qual o nginx está configurado e destrói a portabilidade para outro ambiente.
  • O segundo é usar subdomínios . Isso eu sei funciona e cada aplicativo pode ser definido como NodeJsApplication1.mydomain.com e todos os links vão agir como esperado. O problema que tenho com isso é que requer a criação de um registro de DNS para cada aplicativo. Eu quero algo que pode ser feito quase automaticamente sem muito trabalho manual. (Um registro curinga não é apropriado, pois o domínio é usado para outras finalidades).
  • Use a <base> tag para especificar a raiz do aplicativo. Novamente, isso tem o problema de exigir uma alteração no aplicativo, e não no ambiente.
por AverageMarcus 24.03.2014 / 08:11

4 respostas

1

Então, isso foi um problema com o aplicativo NodeJS e não com a configuração do ambiente. Parece que o aplicativo está tentando ser inteligente e obter a raiz do aplicativo, mas não sabendo que está sendo intermediado por proxy (ou algo parecido).

Quando eu tentei com um aplicativo barebones limpo, funcionou como esperado e os caminhos relativos foram válidos.

    
por 25.03.2014 / 09:09
3

Eu tive um problema semelhante ao ter vários aplicativos MEAN no mesmo domínio. Eu queria subdiretórios em vez de criar um novo subdomínio para cada aplicativo. Além de adicionar uma reescrita à sua configuração do Nginx:

rewrite ^/app1/(.*)$ /$1 break;

Você também precisa definir sua tag <base> na cabeça do seu índice:

<base href="/app1/">

de link

    
por 02.10.2014 / 18:07
0

Atualizar

Como parece que você tem o proxy nginx funcionando, o problema está no seu aplicativo usando links codificados para o domínio principal. Isso parece uma limitação imposta por um aplicativo, e o nginx não pode realmente ajudá-lo com isso, porque não há como saber quando você está acessando arquivos como /css/style.css caso ele seja redirecionado para /NodeJsApplication1 ou /NodeJsApplication2 .

Resposta antiga

Você não pode ter dois aplicativos diferentes ligados à mesma porta no mesmo sistema. O que você deve fazer em vez disso, é vinculá-los a portas diferentes e, em seguida, em sua configuração nginx passar para a porta do aplicativo específico como este (this asumes você está usando 3000 port para app1 e 3001 port para app2):

location /NodeJsApplication1/ {
    proxy_pass http://0.0.0.0:3000;
    ...
}


location /NodeJsApplication2/ {
    proxy_pass http://0.0.0.0:3001;
    ...
}
    
por 24.03.2014 / 09:30
0

Sobre a questão, arquivos de imagens css 、 js are são perdidas, você pode fazer isso

se você usar estrutura expressa。 você precisa adicionar esta linha de código

app.enable('trust proxy');

este valor padrão 'proxy de confiança' é desabilitado.

    
por 26.04.2014 / 05:35