Nginx escolha upstream dependendo de args

4

Eu preciso de dois conjuntos diferentes de upstreams. Mas todos os meus pedidos vêm da mesma URL (mesmo caminho). A diferença é que alguns pedidos terão um argumento especial e outros não. Dependendo disso, eu precisaria escolher qual upstream usar. Aqui está uma parte incompleta de um exemplo do meu arquivo de configuração:

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

Então ... a parte que eu não sei é como verificar se o argumento / parâmetro está no URL e, dependendo disso, use o local pool1 ou pool2.

Alguma ideia de como posso implementar isso?

Obrigado!

    
por Mariano Martinez Peck 17.12.2013 / 19:00

3 respostas

3

@hellvinz está certo. Eu não posso comentar, então estou fazendo outra resposta.

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

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

Acho que você terá que alterar $ myArg para o nome do parâmetro de consulta que você está testando e otherPool para o nome que você definiu. Além disso, a reescrita não foi testada, então eu posso ter isso errado também, mas você entendeu.

    
por 18.12.2013 / 19:39
1

Eu gosto de propor uma versão alternativa desta declaração sem if . Eu sei que esta é uma pergunta antiga, mas futuros googlers podem achar isso útil.

Devo admitir que isso também significa mudar a forma como você seleciona o upstream. Mas não vejo problema em fazer isso.

A idéia é enviar um cabeçalho HTTP personalizado (X-Server-Select) com a solicitação. Isso permite que o nginx selecione o conjunto correto. Se o cabeçalho não estiver presente, um padrão será selecionado.

Sua configuração pode se tornar algo assim:

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

Fonte: nginx usa backend diferente com base no cabeçalho http

Adicionado depois de voltar a isso como futuro eu: Para testar facilmente os servidores, você pode instalar uma extensão no chrome ( Eu uso o ModHeader ) que permite modificar cabeçalhos de solicitação.

    
por 11.09.2017 / 14:27
0

Você pode usar um if testando o parâmetro contido em $ arg

    
por 18.12.2013 / 12:38