我正在尝试设置nginx,但是我不明白如何执行以下设置:
我有一个URL http://somehost.com/foo/bar/123/xxx_xxx需要传递到不同的后端,取决于'123'匹配的范围(例如0-150 – >后端1,151-400 – >后端2,…)。
由于我几乎没有经验的正则expression式,我不知道如何做到这一点(在位置?)。
感谢您的帮助,Sascha
您可以使用:
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 /散列碎片? 您的解决scheme将导致不同的服务器上的不同的负载,甚至负载模式。 pipe理他们将是棘手的。
如果你有一组静态的图片尺寸,你可以使用map 。 在Nginxconfiguration文件的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; }
如果你想支持条件逻辑,我会build议使用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; }