基于Haproxy / Nginx部分URL的哈希上游

时间:2016-03-17 03:33:50

标签: nginx haproxy

我们知道HAProxy和Nginx可以在上游执行基于URL的哈希,但是我们如何对URL的部分进行哈希处理。

我们有4个后端原始图像服务器,每个都将存储所有原始大尺寸图像文件。映像服务器将根据用户请求动态调整文件大小。 (Tomcat Java将文件加载到内存中并调整大小然后响应)

原始文件是:

http://imageserver.company.com/path/to/imageA.jpg

最终用户将要求:

httpurl://imageserver.company.com/path/to/imageA.jpg/crop/400x300.jpg
httpurl://imageserver.company.com/path/to/imageA.jpg/400x224.jpg
httpurl://imageserver.company.com/path/to/imageA.jpg/1280x720.jpg

我希望HAProxy和Nginx会在" /path/to/imageA.jpg" ;;

上执行哈希
Hash (substring (url, 0, find (url, ".jpg/")

有关如何配置的想法吗?

1 个答案:

答案 0 :(得分:0)

在nginx中,您可以使用mapupstream::hash指令:

 map $uri $image_hash {
    default $uri;
    "~(?<image_path>.+(?:jpg|png))/" $image_path;
}

upstream image_backends {
    hash $image_hash;
    server server1;
    server server2;
    server server3;
    server server4;
}

server {
   ...

   location / {
      # add debug header to view the hash
      add_header ImageHash $image_hash;

      proxy_pass http://image_backends;
   }

}

我不确定HAProxy的确切语法是什么,但它的uri哈希支持指定URI哈希的“depth”。因此,如果URL的原始路径具有固定的深度,那么您可以使用它(虽然我猜不是这样)?

              The "depth" parameter indicates the maximum directory depth
              to be used to compute the hash. One level is counted for each
              slash in the request. If both parameters are specified, the
              evaluation stops when either is reached.