Назад | Перейти на главную страницу

Регулярное выражение местоположения nginx соответствует диапазону каталогов

Я пытаюсь настроить nginx и не понимаю, как выполнить следующую настройку:

У меня есть URL http://somehost.com/foo/bar/123/xxx_xxx который необходимо передать в разные серверные части в зависимости от диапазона, которому соответствует '123' (например, 0-150 -> backend1, 151-400 -> backend2, ...).

Поскольку у меня почти нет опыта работы с регулярным выражением, я не знаю, как это сделать (в месте?).

Заранее спасибо за вашу помощь, Саша

Если у вас есть статический набор размеров изображения, вы можете использовать map. Объявить серверные части и карту в http раздел конфигурационного файла Nginx:

http {
  upstream backend1 {
    server backend1:80;
  }

  upstream backend2 {
    server backend2:80;
  }

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

Объявить местоположение в server:

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

Если вы хотите поддерживать условную логику, я бы рекомендовал использовать обработчик Perl. Опять же, в 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";
}';
}

На месте:

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

Ты можешь использовать:

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

Но почему вы делаете балансировку нагрузки таким неоднородным способом? Почему бы просто не разбить по идентификатору изображения / хешу имени? Ваше решение приведет к разной нагрузке и даже шаблонам нагрузки на разных серверах. Управлять ими будет сложно.