regex de localização nginx corresponde ao intervalo de pastas

2

Estou tentando configurar o nginx e não entendi como fazer a seguinte configuração:

Eu tenho um URL link que precisa ser passado para diferentes backends, dependendo do intervalo '123' correspondências (por exemplo, 0-150 - > backend1, 151-400 - > backend2, ...).

Como quase não tenho experiência com regexp, não sei como fazer isso (em locação?).

Agradecemos antecipadamente por sua ajuda Sascha

    
por Sascha 11.05.2011 / 13:21

2 respostas

1

Você pode usar:

location ~ ^/foo/bar/(\d|\d\d|1[0-4]\d|150)/ {
    proxy_pass backend1;
}

location ~ ^/foo/bar/(15[1-9]|1[6-9]\d|[23]\d\d|400)/ {
    proxy_pass backend2;
}
...

Mas por que você faz o balanceamento de carga de maneira tão heterogênea? Por que não apenas shard por id de imagem / hash de nome? Sua solução resultará em diferentes cargas e até carregar padrões em diferentes servidores. Seria complicado administrá-los.

    
por 14.05.2011 / 18:49
3

Se você tiver um conjunto estático dos tamanhos de imagem, poderá usar map . Declare back-ends e um mapa na seção http do arquivo de configuração do Nginx:

http {
  upstream backend1 {
    server backend1:80;
  }

  upstream backend2 {
    server backend2:80;
  }

  map $pic_size $backend {
    default backend_default;
    80 backend1;
    150 backend2;
  }
}

Declare a localização em server :

location ~ ^/foo/bar/(?<pic_size>\d+) {
  proxy_pass http://$backend;
}

Se você quiser dar suporte à lógica condicional, recomendo usar o manipulador Perl. Novamente, em http :

http {
  perl_set $backend 'sub {
my $r = shift;
my $pic_size = $r->variable("pic_size");

$pic_size <= 150 and return "backend1";
$pic_size <= 400 and return "backend2";
return "backend_default";
}';
}

Na localização:

location ~ ^/foo/bar/(?<pic_size>\d+) {
  proxy_pass http://$backend:80;
}
    
por 15.05.2011 / 20:48

Tags