nginx 位置正则表达式匹配目录范围

nginx 位置正则表达式匹配目录范围

我正在尝试设置 nginx,但不知道如何进行以下设置:

我有一个网址http://somehost.com/foo/bar/123/xxx_xxx需要根据“123”匹配的范围将其传递给不同的后端(例如0-150->后端1、151-400->后端2,...)。

由于我几乎没有使用正则表达式的经验,所以我不知道如何做到这一点(在位置上?)。

提前感谢你的帮助,Sascha

答案1

您可以使用:

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

但是,为什么要以这种异构方式进行负载平衡?为什么不直接按图像 ID/名称哈希进行分片?您的解决方案将导致不同服务器上的负载甚至负载模式不同。管理它们会很棘手。

答案2

如果你有一组静态的图片尺寸,你可以使用。在Nginx 配置文件部分map声明后端和映射:http

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

相关内容