nginx: upstream con più direttive server?


15

Sto cercando di impacchettare 2 applicazioni che usano nginx come proxy e consegnare a ciascuno un file di configurazione /etc/nginx/conf.d/.

Farlo in un file ( combined.conf) funziona alla grande:

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

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

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

Tuttavia, quando si divide in 2 file, uno dei reindirizzamenti non riesce 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;
      }
    

Quindi la mia domanda è: un httpnodo può avere 2 serverfigli diversi ?

La documentazione di Nginx non dice nulla al riguardo.

Altre persone sembrano aver avuto successo con questo tipo di architettura :(

La versione di Nginx è 1.1.19-1ubuntu0.1.

Grazie per qualsiasi consiglio!


Per essere più precisi, quando uso l'approccio a 2 file è il sito predefinito che risponde con un 404.
oDDsKooL

Risposte:


8

dopo così brontolii e test, ho pensato a un modo per farlo funzionare ed essere in grado di spedire un file di configurazione per applicazione.

Eccolo, spedito in un file comune e una coppia di file upstream / location per applicazione:

  • /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
È un errore di battitura? upstream dovrebbe avere "server localhost: 8990" invece di " localhost: 8990 ;". Vedi qui: nginx.org/it/docs/http/ngx_http_upstream_module.html
mbdev

Dal documento che hai collegato sembra che ogni comando all'interno di un blocco sia terminato da una semicolonna. Es upstream backend { server 127.0.0.1:8080 max_fails=3 fail_timeout=30s; }. Inoltre, questo funziona con ;:)
oDDsKooL

Intendevo dire che la parola chiave "server" manca prima dell'indirizzo. Ignora la parte punto e virgola.
mbdev,

1

Un blocco http può avere molti figli server. Tuttavia, nginx seleziona un blocco server per elaborare una richiesta. Pertanto, la richiesta non "vede" mai la posizione backend2 perché corrisponde al primo blocco server.


Intendi probabilmente è la mia locationdirettiva che succhia e afferra la richiesta destinata a backend2?
oDDsKooL,

O è che ho bisogno di un modo per differenziare entrambi i serverblocchi quando nginx cerca l'appropriato serverper inoltrare la richiesta?
oDDsKooL,

Entrambi i blocchi di posizione devono trovarsi all'interno dello stesso blocco di server.
chrskly,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.