Регулярное выражение nginx соответствует диапазону каталога
Я пытаюсь настроить nginx и не понимаю, как выполнить следующие настройки:
У меня есть URL-адрес http://somehost.com/foo/bar/123/xxx_xxx который необходимо передать различным бэкэндам в зависимости от диапазона совпадений "123" (например, 0-150 -> backend1, 151-400 -> backend2, ...).
Так как у меня почти нет опыта работы с регулярным выражением, я не знаю, как это сделать (на месте?).
Заранее спасибо за помощь, Саша
2 ответа
Ты можешь использовать:
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;
}
...
Но почему вы делаете распределение нагрузки таким разнородным способом? Почему не просто осколок по идентификатору изображения / хэшу имени? Ваше решение приведет к разной загрузке и даже нагрузке на разных серверах. Было бы сложно управлять ими.
Если у вас есть статический набор размеров изображения, вы можете использовать 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;
}