nginx: ¿upstream con múltiples directivas de servidor?

15

Estoy tratando de empaquetar 2 aplicaciones que usan nginx como proxy y entregar cada una un archivo de configuración en /etc/nginx/conf.d/ .

Hacer esto en un archivo ( combined.conf) funciona muy bien:

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

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

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

Sin embargo, cuando se divide en 2 archivos, uno de los redireccionamientos falla sistemáticamente:

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

Entonces mi pregunta es: ¿puede un httpnodo tener 2 serverhijos diferentes ?

La documentación de Nginx no dice nada al respecto.

Sin embargo, otras personas parecen haber tenido éxito con este tipo de arquitectura :(

La versión de Nginx es 1.1.19-1ubuntu0.1.

Gracias por cualquier consejo!

oDDsKooL
fuente
Para ser más precisos, cuando uso el enfoque de 2 archivos, es el sitio predeterminado que responde con un 404.
oDDsKooL

Respuestas:

8

Después de tanto ruido y pruebas, descubrí una forma de hacerlo funcionar y poder enviar un archivo de configuración por aplicación.

Aquí está, enviado en un archivo común y un par de archivos ascendentes / de ubicación por aplicación:

  • /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;
    }
    
oDDsKooL
fuente
1
¿Es esto un error tipográfico? Upstream debería tener "servidor localhost: 8990" en lugar de " localhost: 8990 ;". Ver aquí: nginx.org/en/docs/http/ngx_http_upstream_module.html
mbdev
Según el documento que vinculó, cada comando dentro de un bloque termina con una semi columna. Por ej upstream backend { server 127.0.0.1:8080 max_fails=3 fail_timeout=30s; }. Además, esto funciona con el ;:)
oDDsKooL
Quise decir que falta la palabra clave 'servidor' antes de la dirección. Ignora la parte del punto y coma.
mbdev
1

Un bloque http puede tener muchos servidores secundarios. Sin embargo, nginx selecciona un bloque de servidor para procesar una solicitud. Por lo tanto, la solicitud nunca "ve" la ubicación del backend2 porque coincide con el primer bloque del servidor.

chrskly
fuente
¿Quiere decir que probablemente es mi locationdirectiva la que apesta y toma la solicitud destinada para backend2?
oDDsKooL
¿O es que necesito una forma de diferenciar ambos serverbloques cuando nginx busca el apropiado serverpara reenviar la solicitud?
oDDsKooL
Ambos bloques de ubicación deben estar dentro del mismo bloque de servidor.
chrskly