HAProxy的访问规则和算法


HAProxy ACL 访问规则的基本组成

ACL访问规则通常由以下几个部分组成:

  1. ACL 名称:自定义的ACL名称,用于在配置文件中标识该规则。
  2. 测试标准(Criterion):指定要检查的数据或内容,如源IP地址(src)、目标IP地址(dst)、请求头(hdr)等。
  3. 标志(Flags):用于调整测试标准的匹配方式,如是否忽略大小写(-i)、是否启用特定的匹配方式等。
  4. 操作符(Operator):用于定义测试标准与值之间的比较关系,如等于(=)、不等于(!=)、包含(~)等。
  5. 值(Value):具体的匹配内容,如特定的IP地址、域名、URL路径等。

常见的ACL规则

基于IP地址的访问控制
  • src:源IP地址
  • dst:目标IP地址
  • src_port:源端口
  • dst_port:目标端口

例如,允许特定IP地址段的用户访问服务:

acl allowed_ips src 192.168.1.0/24  
use_backend mybackend if allowed_ips
基于URL路径的访问控制
  • path:URL路径的精确匹配
  • path_beg:URL路径以某个字符串开头的匹配
  • path_end:URL路径以某个字符串结尾的匹配
  • path_reg:URL路径的正则表达式匹配

例如,将特定路径的请求转发到不同的后端服务器:

acl images path_beg -i /images  
use_backend images_backend if images
基于请求头的访问控制
  • hdr(name):请求头中的特定字段
  • hdr_beg(name):请求头字段的开头部分
  • hdr_end(name):请求头字段的结尾部分
  • hdr_reg(name):请求头字段的正则表达式匹配

例如,根据Host请求头来转发请求:

acl host_www hdr(host) -i www.example.com  
use_backend www_backend if host_www
基于请求方法的访问控制
  • method:HTTP请求的方法(如GET、POST等)

例如,区分读写请求并转发到不同的后端:

acl read_requests method GET HEAD  
acl write_requests method PUT POST  
use_backend read_backend if read_requests  
use_backend write_backend if write_requests


HAProxy的算法

  1. roundrobin(轮询)

    • 特点:按顺序轮流将请求分发到后端服务器。在服务器的处理时间保持均匀分布时,这是最平衡、最公平的算法。此算法是动态的,表示其权重可以在运行时进行调整。

    • 适用场景:适用于后端服务器性能相近的情况,可以确保每台服务器都能得到相对均衡的请求量。

    • backend app_roundrobin  
       balance roundrobin  
       server server1 172.16.1.7:80 check  
       server server2 172.16.1.8:80 check  
       server server3 172.16.1.9:80 check
      
      1. static-rr(基于权重的轮询)
      • 特点:与roundrobin类似,但为静态方法。在配置时指定各服务器的权重,并在运行时保持不变。不支持运行时动态调整权重,但后端服务器连接数上没有限制。
      • 适用场景:适用于服务器性能差异较大,需要根据服务器性能分配不同请求量的情况。
      • bash backend app_static_rr balance roundrobin server server1 172.16.1.7:80 weight 2 check server server2 172.16.1.8:80 weight 1 check server server3 172.16.1.9:80 weight 1 check
  2. leastconn(最少连接)

    • 特点:新的连接请求被派发至具有最少连接数目的后端服务器。此算法既支持权重的运行时调整,也支持慢启动(新加的服务器会逐渐增加转发数)。

    • 适用场景:适用于长连接较多的场景,如数据库连接池等,可以确保服务器资源得到更合理的利用。

    • backend app_leastconn  
       balance leastconn  
       server server1 172.16.1.7:80 check  
       server server2 172.16.1.8:80 check  
       server server3 172.16.1.9:80 check
      
      1. source(源地址hash)
      • 特点:将请求的源地址进行hash运算,并由后端服务器的权重总数相除后派发至某匹配的服务器。这可以使得同一个客户端IP的请求始终被派发至某特定的服务器,有助于实现会话保持。
      • 适用场景:适用于需要保持客户端会话一致性的场景,如用户登录状态等。
      1. uri(URI)
      • 特点:根据请求的URI来分发请求。这可以使得对特定资源的请求始终被派发至同一台服务器,有助于缓存等优化措施的实施。
      • 适用场景:适用于需要根据请求内容分发请求的场景,如缓存静态资源等。