HAproxy指南之haproxy配置详解2(理论篇)

    xiaoxiao2021-03-26  6

    上一小节的从haproxy的配置文件我们知道haproxy相关参数基本介绍,但是在实际生产环境中,往往需要根据相关规则做请求匹配跳转,这时就需要用到Frontend;Backend这两个配置段,再结合Frontend的acl匹配规则来做相应的客户端请求跳转;另外,可能还会遇到客户端访问出错,这时就需要利用错误重定向功能,将其定义到相关友情提示的错误页面上,这样更加人性化。

    一. Frontend匹配规则ACL用法详解 

    haproxy ACL具有很强大的功能,能够定义三到七层的规则。ACL的作用,就是为了匹配一些特别的请求,然后对其进行修改或者分发到不同的服务器组中

    ①haproxy acl定义

    格式: acl <aclname> <criterion> [flags] [operator] [<value>] 

    <aclname>:ACL名称,区分字符大小写,且其只能包含大小写字母、数字、-(连接线)、_(下划线)、.(点号)和:(冒号);haproxy中,acl可以重名,这可以把多个测试条件定义为一个共同的acl;

    <criterion>:测试标准,即对什么信息发起测试;测试方式可以由[flags]指定的标志进行调整;而有些测试标准也可以需要为其在<value>之前指定一个操作符[operator];

    [flags]:目前haproxy的acl支持的标志位有3个:

    -i:不区分中模式字符的大小写;

    -f:从指定的文件中加载模式;

    --:标志符的强制结束标记,在模式中的字符串像标记符时使用;

    <value>:acl测试条件支持的值有以下四类:

    1.  整数或整数范围:如1024:65535表示从1024至65535;仅支持使用正整数(如果出现类似小数的标识,其为通常为版本测试),且支持使用的操作符有5个,分别为eq、ge、gt、le和lt;

    2.  字符串:支持使用“-i”以忽略字符大小写,支持使用“\”进行转义;如果在模式首部出现了-i,可以在其之前使用“–”标志位;

    3.  正则表达式:其机制类同字符串匹配;

    4.  IP地址及网络地址;

    注意:同一个acl中可以指定多个测试条件,这些测试条件需要由逻辑操作符指定其关系。条件间的组合测试关系有三种:“与”(默认即为与操作)、“或”(使用“||”操作符)以及“非”(使用“!”操作符)。

    常用的测试标准(criteria)

    (1) 基于七层协议(http)规则acl测试标准

    1. method <string> 

    method <string>测试HTTP请求报文中请求类型。

    例如: 利用method来实现前段读写分离:

    acl  read method GET acl  read method HEAD acl write method PUT acl write method POST use_backend imgservers if read use_backend uploadservers if write

    2. path_beg <string> ||url_beg

    用于测试请求的URL是否以指定的模式开头;下面的例子用于测试URL是否以 /static、/images、/javascript或/stylesheets头。

    例如:利用path_beg实现以/static /images开头的请求转交到 static server上:

    acl url_static path_beg -i /static /images use_backend static if url_static

    2. path_end <string> || url_reg

    用于测试请求的URL是否以<string>指定的模式结尾。例如,下面的例子用户测试URL是否以jpg、gif、png、css或js结尾

    例如:利用path_end实现以.jpg .gif .png .css等结尾的格式的请求转交到 static server上:

    acl url_static path_end -i .jpg .gif .png .css .js .html use_backend static if url_static

    3. hdr_beg <string>

    用于测试请求报文的指定首部的开头部分是否符合<string>指定的模式。

    acl is_lvs3 hdr_beg(host) -i lvs3.test.net:8080   use_backend lvs3 if is_lvs3

    #表示当request header中的host前缀部分匹配到lvs.test.net.:8080则将请求转给后端backend定义的 is_lvs3上

    4. hdr_end <string>

    用于测试请求报文的指定首部的结尾部分是否符合<string>指定的模式

    acl is_lvs3 hdr_end(host) -i lvs3.test.net:8080   use_backend lvs3 if is_lvs2

    #表示当request header中的host后缀部分匹配到lvs3.test.net.:8080则将请求转给后端backend定义的 is_lvs2上

    5. hdr <string>

    用于测试请求报文中的所有首部或指定首部信息是否满足指定的条件;指定首部时, 其名称不区分大小写, 且在括号中“()”不能有任何多余的空白字符。测试服务器端的响应报文时可以使用shdr()。

    例如 当用户访问172.16.1.100时,重定向到http://www.afwing.com

    acl  dstipaddr  hdr(Host) 172.16.1.100 redirect  location   http://www.afwing.com if  dstipaddr

    (2) 基于四层协议(ip)规则acl测试标准

    1. dst和dst_port

    定义访问地址为目标地址或目标端口的acl规则

    2. src和src_port

    定义访问地址为源地址或源端口的acl规则

    例如: 允许10.0.0.0/24的用户访问,其他用户将禁止

    acl net10  src  10.0.0.0/24 tcp-request content  accept  if  net10 tcp-request  content  reject tcp-request content accept [ {if | unless} ] Accept a connection if/unless a content inspection condition is matched

    ②haproxy acl引用

    当定义好了ACL后我们可以利用“use_backend” 参数来引用acl规则,如果需要引用多个acl时,只需要依次在后面添加相关acl ,也可以 匹配多个acl,如下示例:

    1.正常写法:

    use_backend static if url_static

    2.或者写法:

    use_backend backend1 if aclA || aclB use_backend backend1 if aclA ||  !aclC

    注意上面“||”也可以使用or来表示

    3.非(不符合)写法:

    use_backend backend1 if aclA !aclB use_backend backend1 if aclA !aclB !aclC

    4.与(and)写法:

    use_backend backend1 if aclA !aclB use_backend backend1 if aclA !aclB !aclC

    haproxy 常见应用实例:

    1. haproxy 利用acl实现页面动静分离;

    frontend webservs bind *:80 acl url_static path_beg -i /static /images /javascript /stylesheets acl url_static path_end -i .jpg .gif .png .css .js .html acl url_php path_end  -i .php use_backend static if url_static or host_static use_backend dynamic if url_php default_backend dynamic backend static balance roundrobin server node1 192.168.1.111:80 check maxconn 3000 backend dynamic balance roundrobin server node2 192.168.1.112:80 check maxconn 1000  

    二. haproxy 错误重定向用法

    格式为: errorfile  错误代码code  错误代码文件路径

    如下为常用的优化客户端访问出现错误时错误提示页面示例

    errorfile 403 /etc/haproxy/errorfiles/403.http errorfile 500 /etc/haproxy/errorfiles/500.http errorfile 502 /etc/haproxy/errorfiles/502.http errorfile 503 /etc/haproxy/errorfiles/503.http errorfile 504 /etc/haproxy/errorfiles/504.http

    至此,以上关于haproxy的配置文件相关参数就介绍到这里了,这些都是基本参数,如要更详细的配置介绍,请访问haproxy官方文档说明:https://cbonte.github.io/haproxy-dconv/configuration-1.5.html 

    转载请注明原文地址: https://ju.6miu.com/read-569542.html

    最新回复(0)