HAProxy的访问规则和算法
HAProxy ACL 访问规则的基本组成
ACL访问规则通常由以下几个部分组成:
- ACL 名称:自定义的ACL名称,用于在配置文件中标识该规则。
- 测试标准(Criterion):指定要检查的数据或内容,如源IP地址(src)、目标IP地址(dst)、请求头(hdr)等。
- 标志(Flags):用于调整测试标准的匹配方式,如是否忽略大小写(-i)、是否启用特定的匹配方式等。
- 操作符(Operator):用于定义测试标准与值之间的比较关系,如等于(=)、不等于(!=)、包含(~)等。
- 值(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的算法
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
- 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
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
- source(源地址hash)
- 特点:将请求的源地址进行hash运算,并由后端服务器的权重总数相除后派发至某匹配的服务器。这可以使得同一个客户端IP的请求始终被派发至某特定的服务器,有助于实现会话保持。
- 适用场景:适用于需要保持客户端会话一致性的场景,如用户登录状态等。
- uri(URI)
- 特点:根据请求的URI来分发请求。这可以使得对特定资源的请求始终被派发至同一台服务器,有助于缓存等优化措施的实施。
- 适用场景:适用于需要根据请求内容分发请求的场景,如缓存静态资源等。