Preciso de dois conjuntos diferentes de upstreams. Mas todas as minhas solicitações vêm da mesma URL (mesmo caminho). A diferença é que algumas solicitações terão um argumento especial e outras 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 não sei é como verificar se o argumento/parâmetro está na URL e dependendo disso, usar o local pool1 ou pool2.
Alguma ideia de como posso implementar isso?
Obrigado!
Responder1
@hellvinz está certo. Não posso comentar, então estou dando 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 posso estar errado também, mas você entendeu.
Responder2
Gosto de propor uma versão alternativa destesem sedeclaração. Eu sei que esta é uma pergunta mais antiga, mas futuros googlers ainda poderão 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 ideia é enviar um cabeçalho HTTP customizado (X-Server-Select) com a solicitação. Isso permite que o nginx selecione o pool correto. Se o cabeçalho não estiver presente, um padrão será selecionado.
Sua configuração pode ficar mais ou menos 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 back-end diferente com base no cabeçalho http
Adicionado depois de voltar a isso como futuro: Para testar facilmente os servidores, você pode instalar uma extensão no Chrome (Eu uso ModHeader) que permite modificar cabeçalhos de solicitação.