Puoi definire le posizioni di un server in più file di configurazione di nginx?


14

Ho più app ruby ​​in esecuzione sullo stesso host:

~/app1
~/app2
~/app3

E voglio avere proxy nginx queste app usando sottodirectory come:

   http://example.com/app1
   http://example.com/app2
   http://example.com/app3

Sono curioso di sapere se nginx mi supporta nella possibilità di definire queste posizioni in più file, in modo da poter mantenere ogni configurazione con l'app, invece di avere un file di configurazione monolitico per tutte le app:

~/app1/nginx.conf
~/app2/nginx.conf
~/app3/nginx.conf

Il mio ingenuo tentativo di definire il server con una singola direttiva di posizione in ciascuno dei 3 file di configurazione ha portato a conflicting server name "example.com" on [::]:80, ignoreduna configurazione simile a questa:

upstream app1 { server 127.0.0.1:4567; }
server {
  listen      [::]:80;
  listen      80;
  servername  example.com
  location    /app1 {
     proxy_pass  http://app1;
     proxy_http_version 1.1;
     proxy_set_header Upgrade $http_upgrade;
     proxy_set_header Connection "upgrade";
     proxy_set_header Host $http_host;
     proxy_set_header X-Forwarded-Proto $scheme;
     proxy_set_header X-Forwarded-For $remote_addr;
     proxy_set_header X-Forwarded-Port $server_port;
     proxy_set_header X-Request-Start $msec;
  }
}

C'è un modo per organizzare le configurazioni in questo modo?

Risposte:


9

Puoi includere configurazioni esterne tramite include:

include /path/to/config1.conf;
include /path/to/config2.conf;
include /path/to/confdir/*.conf;

server {
    server_name example.com;
    listen      [::]:80;
    listen      80;
}

E all'interno di una configurazione separata è possibile utilizzare qualsiasi blocco di codice valido:

upstream app1 {
    server 127.0.0.1:8080;
}

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

5
Funziona davvero? Il modulo upstream non deve essere esterno al blocco del modulo server?
Curley,

5
Sembra che la direttiva sulla posizione non sia consentita al di fuori del blocco server. Almeno per me, riferisce nginx "location" directive is not allowed here.
Alexander Amelkin,

Sì ... non vedo un modo semplice per farlo correttamente senza più file per applicazione: uno che funzionerebbe all'interno di un blocco server, uno che funzionerebbe all'esterno. Immagino per flessibilità e per rendere più pulito un carattere jolly potrebbe essere usato: include /etc/nginx/above_server.d/*einclude /etc/nginx/in_server.d/*
jeteon

1
Questa risposta è sbagliata
AmirHossein,

11

Credo che potresti usare questa configurazione:

server {
    server_name example.com;
    listen      [::]:80;
    listen      80;

    include /path/to/applications/*/nginx.conf;
}

e quindi nella directory di ogni applicazione configurare il reindirizzamento in questo modo:

location    /app1 {
    proxy_pass  http://app1;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $http_host;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Forwarded-For $remote_addr;
    proxy_set_header X-Forwarded-Port $server_port;
    proxy_set_header X-Request-Start $msec;
}

2
Il rovescio della medaglia sarebbe che non è possibile definire più upstream all'interno del serverblocco ma penso che il caso d'uso dell'OP sia ben servito da questa risposta.
Jeteon,
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.