nginx: upstream com várias diretivas de servidor?


14

Estou tentando empacotar 2 aplicativos que usam o nginx como proxy e entregam cada um um arquivo de configuração /etc/nginx/conf.d/.

Fazer isso em um arquivo ( combined.conf) funciona muito bem:

    upstream backend1 {
      http://localhost:8989;
    }

    upstream backend2 {
      http://localhost:8990;
    }

    server {
      location /backend1/ {
        proxy_pass  http://backend1;
      }
      location /backend2/ {
        proxy_pass  http://backend2;
      }

No entanto, ao dividir em 2 arquivos, um dos redirecionamentos falha sistematicamente:

  • backend1.conf:

    upstream backend1 {
      http://localhost:8989;
    }
    
    server {
      location /backend1/ {
        proxy_pass  http://backend1;
      }
    
  • backend2.conf:

    upstream backend2 {
      http://localhost:8990;
    }
    
    server {
      location /backend2/ {
        proxy_pass  http://backend2;
      }
    

Então, minha pergunta é: um httpnó pode ter 2 serverfilhos diferentes ?

A documentação do Nginx não diz nada sobre isso.

Outras pessoas parecem ter tido sucesso com esse tipo de arquitetura :(

A versão do Nginx é 1.1.19-1ubuntu0.1.

Obrigado por qualquer conselho!


Para ser mais preciso, quando eu uso os 2 arquivos abordá-lo é o local padrão que atende com um 404.
oDDsKooL

Respostas:


8

depois de tantos testes e testes, achei uma maneira de fazê-lo funcionar e poder enviar um arquivo de configuração por aplicativo.

Aqui está, enviado em um arquivo comum e em um par de arquivos upstream / local por aplicativo:

  • /etc/nginx/conf.d/common-proxies.conf:

    include /upstreams/*.conf;
    
    server {
    include /locations/*.conf
    }
    
  • /etc/nginx/locations/backend1.conf

    location /backend1/ {
      upstream http://backend1;
    }
    
  • /etc/nginx/locations/backend2.conf

    location /backend2/ {
      upstream http://backend2;
    }
    
  • /etc/nginx/upstreams/backend1.conf

    upstream backend1 {
      http://localhost:8989;
    }
    
  • /etc/nginx/upstreams/backend2.conf

    upstream backend2 {
      http://localhost:8990;
    }
    

1
Isso é um erro de digitação? o upstream deve ter "server localhost: 8990" em vez de " localhost: 8990 ;". Veja aqui: nginx.org/en/docs/http/ngx_http_upstream_module.html
mbdev

Parece que o documento que você vinculou parece que todos os comandos dentro de um bloco são finalizados por uma semi-coluna. Por exemplo upstream backend { server 127.0.0.1:8080 max_fails=3 fail_timeout=30s; }. Além disso, este trabalha com o ;:)
oDDsKooL

Eu quis dizer que a palavra-chave 'servidor' está ausente antes do endereço. Ignore a parte de ponto e vírgula.
Mddev 31/07

1

Um bloco http pode ter muitos filhos do servidor. No entanto, o nginx seleciona um bloco de servidor para processar uma solicitação. Portanto, a solicitação nunca 'vê' o local do back-end2 porque corresponde ao primeiro bloco do servidor.


Você quer dizer que provavelmente é a minha locationdiretiva que suga e pega a solicitação destinada ao back-end2?
ODDsKooL

Ou será que preciso de uma maneira de diferenciar os dois serverblocos quando o nginx procurar o apropriado serverpara encaminhar a solicitação?
ODDsKooL

Os dois blocos de localização devem estar no mesmo bloco de servidor.
chrskly
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.