定义自定义负载平衡算法

时间:2015-12-03 15:40:47

标签: ssl https load-balancing reverse-proxy haproxy

情况如下:

我有许多Web服务器,比如说10.我需要使用(软件)负载均衡器,它可以使用反向代理服务器实现,如HAProxy或Varnish。现在,我们所服务的所有流量都是通过https而不是http,所以Varnish是不可能的。

现在,我想将用户的请求划分为几个类别,这取决于请求的一个输入(POST)参数。根据该参数,我需要在服务器之间划分请求,基于此,(即使所有其他输入(POST)参数相同),不同的服务器将以不同的方式提供服务。

所以,我需要定义一个自定义负载平衡算法,这样,对于该参数的特定值,我将负载除以特定的3(比方说),对于某些其他值,将请求分为特定的2和其他值,剩余5。

由于我不能使用varnish,因为它不能用于终止ssl(定义自定义算法在VCL中很容易),我正在考虑使用HA-Proxy。

所以,问题是:

有人可以帮我解决如何使用HA-Proxy定义自定义负载均衡功能吗?

我研究了很多,但我找不到任何这样的文件。因此,如果HA-Proxy无法实现,您是否可以将我转介给其他可以用作负载均衡器的其他反向代理服务,以便满足上述两个标准? (ssl终止和定义自定义负载平衡的能力)。

编辑:

这个问题是我之前提出的一个问题。 Varnish to be used for https

1 个答案:

答案 0 :(得分:2)

我不确定你的目标是什么,但我建议 NOT 根据HTTP请求体进行自定义路由。这将表现得非常糟糕,并且可能超过你想要达到的任何好处。

任何必须解析超出负载均衡器典型HTTP标头值的东西都会降低速度。如果你可以避免使用Cookies本身就是一个坏主意。

如果您可以控制路径/路由值,这可能比解析某些值的每个POST更好。

你可以通过带有lua脚本的NGINX实现你想要的东西(Kong平台基于它们),但我不能说你有多难......

https://github.com/openresty/lua-nginx-module#readme

这是一篇文章,其中有一个基于lua输入设置不同上游的具体示例。

http://sosedoff.com/2012/06/11/dynamic-nginx-upstreams-with-lua-and-redis.html

server {
  ...BASE CONFIG HERE...

  port_in_redirect off;

  location /somepath {
    lua_need_request_body on;

    set $upstream "default.server.hostname";

    rewrite_by_lua '
      ngx.req.read_body()  -- explicitly read the req body
      local data = ngx.req.get_body_data()
      if data then
        -- use data: see
        -- https://github.com/openresty/lua-nginx-module#ngxreqget_body_data
        ngx.var.upstream = some_deterministic_value
      end
    '

    ...OTHER PARAMS...
    proxy_pass http://$upstream
  }
}