¿Puedes definir las ubicaciones de un servidor en múltiples archivos de configuración nginx?

14

Tengo varias aplicaciones de ruby ​​ejecutándose en el mismo host:

~/app1
~/app2
~/app3

Y quiero tener proxy nginx estas aplicaciones usando subdirectorios como:

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

Tengo curiosidad por saber si nginx me permite definir estas ubicaciones en varios archivos, de modo que pueda mantener cada configuración con la aplicación, en lugar de tener un archivo de configuración monolítico para todas las aplicaciones:

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

Mi ingenuo intento de definir el servidor con una sola directiva de ubicación en cada uno de los 3 archivos de configuración condujo a conflicting server name "example.com" on [::]:80, ignoreduna configuración similar a esta:

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;
  }
}

¿Hay alguna manera de organizar las configuraciones de esta manera?

aubreyrhodes
fuente

Respuestas:

9

Puede incluir configuraciones externas a través de incluir:

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

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

Y dentro de una configuración separada, puede usar cualquier bloque de código válido:

upstream app1 {
    server 127.0.0.1:8080;
}

location /app1 {
    proxy_pass http://app1;
}
Slezhuk
fuente
55
¿Esto realmente funciona? ¿No necesita el módulo ascendente estar fuera del bloque del módulo del servidor?
Curley
55
Parece que la directiva de ubicación no está permitida fuera del bloque del servidor. Al menos para mí, informa nginx "location" directive is not allowed here.
Alexander Amelkin
Sí ... No veo una manera simple de hacerlo correctamente sin varios archivos por aplicación: uno que funcione dentro de un bloque de servidor, uno que funcione fuera. Creo que para la flexibilidad y la ponga a limpiar un comodín podría utilizarse: include /etc/nginx/above_server.d/*yinclude /etc/nginx/in_server.d/*
jeteon
1
Esta respuesta es incorrecta
AmirHossein
11

Creo que podría usar esta configuración:

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

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

y luego, en el directorio de cada aplicación, configure la redirección de esta manera:

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;
}
Alexander Amelkin
fuente
2
La desventaja sería que no puede definir múltiples flujos ascendentes dentro del serverbloque, pero creo que el caso de uso del OP está bien servido por esta respuesta.
jeteon