Nginx elige aguas arriba dependiendo de los argumentos

Nginx elige aguas arriba dependiendo de los argumentos

Necesito dos conjuntos diferentes de aguas arriba. Pero todas mis solicitudes provienen de la misma URL (misma ruta). La diferencia es que algunas solicitudes tendrán un argumento especial y otras no. Dependiendo de eso, necesitaría elegir qué upstream usar. Aquí hay una parte incompleta de un ejemplo de mi archivo de configuración:

  server_name localhost;

    root /var/www/something/;

  upstream pool1 
  {
    server localhost:5001;
    server localhost:5002;
    server localhost:5003;
  }


 upstream pool2
  {
    server localhost:6001;
    server localhost:6002;
    server localhost:6003;
  }


   location /
    { 
 # this is the part where I need help 
        try_files $uri @pool1;

    }

 location @pool1
    {
      include fastcgi_params;
      fastcgi_pass pool1;
    }


location @pool2
    {
      include fastcgi_params;
      fastcgi_pass pool2;
    }

Entonces... la parte que no sé es cómo verificar si el argumento/parámetro está en la URL y, dependiendo de eso, usar la ubicación pool1 o pool2.

¿Alguna idea de cómo puedo implementar esto?

¡Gracias!

Respuesta1

@hellvinz tiene razón. No puedo comentar así que estoy dando otra respuesta.

location / {
   if($myArg = "otherPool") {
       rewrite  ^/(.*)$ /otherUpstream/$1 last;
     } 
   try_files $uri pool1;
}

location /otherUpstream {
     proxy_pass http://@pool2;
}

Creo que tendrás que cambiar $myArg por el nombre del parámetro de consulta que estás probando y otherPool por el valor que hayas configurado. Además, la reescritura no se ha probado, por lo que es posible que yo también me equivoque, pero ya entiendes la idea.

Respuesta2

Me gustaría proponer una versión alternativa de esto.sin sideclaración. Sé que esta es una pregunta anterior, pero es posible que en el futuro los usuarios de Google aún la encuentren útil.

Debo admitir que también significa cambiar la forma de seleccionar el upstream. Pero no veo ningún problema en hacer esto.

La idea es enviar un encabezado HTTP personalizado (X-Server-Select) con la solicitud. Esto permite a nginx seleccionar el grupo correcto. Si el encabezado no está presente, se seleccionará un valor predeterminado.

Su configuración podría ser algo como esto:

upstream pool1 
{
  server localhost:5001;
  server localhost:5002;
  server localhost:5003;
}
upstream pool2
{
  server localhost:6001;
  server localhost:6002;
  server localhost:6003;
}

# map to different upstream backends based on header
map $http_x_server_select $pool {
    default "pool1";
    pool1 "pool1";
    pool2 "pool2";
}

location /
{
  include fastcgi_params;
  fastcgi_pass $pool;
}

Fuente:nginx usa un backend diferente según el encabezado http

Agregado después de volver a esto como futuro yo: Para probar servidores fácilmente, puede instalar una extensión en Chrome (Yo uso ModHeader) que le permite modificar los encabezados de las solicitudes.

Respuesta3

Puedes usar unsiprobando el parámetro contenido por$ arg

información relacionada