设为首页 收藏本站
查看: 2448|回复: 0

[经验分享] haproxy反代负载均衡

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2016-5-30 09:11:37 | 显示全部楼层 |阅读模式
haproxy是用于实现作为后端反代以实现负载均衡器。
实现负载均衡有多种方案:可在tcp层即四层和应用层即七层实现负载均衡:
四层:lvs也是工作在四层的;
七层:nginx、ats等多种软件工具;

haproxy域lvs相比,调度能力肯定是不如lvs,因为lvs工作在内核空间,与后端real server通信时,没有套接字数量和连接的限制,可以调度海量客户端的请求;而haproxy是工作在七层,毕竟基于套接字实现与real server通信的;但是,haproxy正因为基于七层,可以根据http协议中的首部的任何header进行调度,所以haproxy的调度粒度远远比lvs要精细的多。

在七层实现调度负载均衡器的除了haproxy,还有比较常用的nginx,二者其实不分伯仲,完全根据跟人喜欢择其一用之。只不过,它们的调度概念是相似的。与nginx所不同之处在于,nginx工作是master/worker模型,由多个worker负责响应处理用户请求,master只负责把用户请求接进来;而HAProxy的单一进程,一个进程可以处理数以万计的请求;

这也正是因为,nginx的worker中有一个锁机制,内部还有个负载均衡机制,当用户请求到达时,多个worker轮流的响应,如果不是由前端master调度的,判断worker中谁处理下一次请求,则谁持有了锁,谁才能接收请求的;所以只要是多进程模型必须有锁限制机制;因此,多进程模型会消耗大量内存空间,会受到前端主控进程的调度能力以及锁等资源的共同限制;而HAProxy是单一进程。

HAProxy性能特性:
        1.单进程、事件驱动模型显著降低了上下文切换的开销及内存占用;
        2.事件检查器(event checker)允许其在高并发连接中对任何连接的任何事件实现即时探测;
        3.在任何可用的情况下,单缓冲(single buffering)机制能以不复制任何数据的方式完成读写操作,这会节约大量的cpu时钟周期及内存带宽;
        4.MRU(最近最多使用)内存分配器在固定大小的内存池中可实现即时内存分配,这能够显著减少创建一个会话的时长;
        5.树型存储:侧重于使用作者多年前开发的弹性二叉树,实现了以O(log(N))的低开销来保持计时器命令、保持运行队列命令及管理轮询及最少连接队列;
        6.优化的HTTp首部分析:优化的首部分析功能避免了在http首部分析过程中重读任何内存区域;
        7.精心地降低了昂贵的系统调用,大部分工作都在用户空间完成,如时间读取、缓冲聚合及文件描述符的启用和禁用等;

软件特性:只是http协议的反向代理,不提供缓存功能,但额外支持对tcp层对基于tcp通信的应用做LB;
使用场景:适合用于大型互联网外网或者内网4&7层负载均衡;

衡量负载均衡器的关键指标:
        可以从三个因素来评估负载均衡器的性能:
        1.会话率;指定是会话创建、删除的能力,每秒钟可以创建新会话的数量;
        2.会话并发能力;可以同时持有的会话数量;
        3.数据处理速度

haproxy安装:
centos6.4+版本已经把haproxy软件包收录到base源中。
配置文件:/etc/haproxy/haproxy.cfg
环境配置文件:/etc/sysconfig/haproxy

]# yum -y install haproxy
]# rpm -ql haproxy 可查看相关文件存放路径

haproxy配置:大体分两部分
global:全局段,定义haproxy进程工作特性
    进程及安全配置相关的参数
    性能调整相关的参数
    Debug参数
proxies:代理段
    defaults:为代理提供默认设置;
    listen=frontend+backend
    frontend:定义前端
    backend:定义后端

defaults 默认代配置段
wKioL1dIWgqBFhVAAACUpeucjKI471.jpg

可对比nginx作为反代负载均衡器时的配置结构:
upstream BACKEND_SERVER1 {
        ip_hash;
        server ...;
        server ...;
}

upstream BACKEND_SERVER2 {
        leastconn;
        server ...;
        server ...;
}

upstream fcgi {
        server ...;
        server ...;
}
server {
        listen
        location URI {
                proxy_pass http://BACKEND_SERVER1;
        }

        location \.(php)$ {
                fastcgi_pass fastcgi://fcgi;
        }

}

server {
        location URI {
                proxy_pass http://BACKEND_SERVER2;
        }
可见,其实与nginx的配置段功能完全相似,只不过表现方式略有不同而已。
haproxy中的linsten指令相当于nginx中的fastcgi_pass,专门反代后端固定的主机。
而haproxy中的frontend指令相当于nginx中的server指令,设置前端供客户端访问主机的各属性。
还有haproxy中的backend指令就相当于nginx中的upstream指令,设置后端主机的各属性。
最后,default是haproxy中设定默认设置的,如果在frontend、backend和listen中都没设置属性值,则它们将继承default中设定的值。

haproxy配置中有很多指令,但是指令是有使用位置的限制的,就是在不同的配置段中使用不同的相应指令。例如有些指令不能用在backend段,有些不能用在frontend,还有些指令不能用在default中。

使用listen设置简单的反代:
物理机使用win7系统,虚拟机使用centos7系统
haproxy反代服务器:172.18.11.111
后端主机:172.18.11.11
后端主机:172.18.11.12

在后端提供http服务,测试页面:
]# vim /var/www/html/index.html
<h1>RS1 172.18.11.11</h1>
]# vim /var/www/html/index.html
<h1>RS2 172.18.11.12</h1>

]# vim /etc/haproxy/haproxy.cfg
在backend app配置段,最后添加:

listen web *:80 #定义前端监听的服务名为web,端口80;
    balance roundrobin #调度算法为加权轮询
    server web-RS1 172.18.11.11:80 check #后端主机名自定义为web-RS1,check为进行健康状态检测;
    server web-RS2 172.18.11.12:80 check

listen stats *:9001 #添加了haproxy的状态页面,名称定义为stats,端口设为9001;
    stats enable #启用状态页面;
    stats uri /haproxyadmin?stats #此项指令,可以省略,为默认路径,建议修改;
    stats realm haproxy\ statistics #设置访问状态页时认证,提示信息,带空格要使用转义符;
    stats auth admin:pass #设定登录名admin,密码为pass;
    stats admin if TRUE #如果认证成功,开启页面管理接口;

浏览器测试:http://172.18.11.111/
多次刷新,交替显示:
RS1 172.18.11.11
RS2 172.18.11.12

设定访问状态页认证时,显示haproxy状态页:
wKioL1dIXmnjeb3DAAI5ppf5KvY102.jpg

global配置参数:
log:定义全局的syslog服务器,最多可定义两个,用于实现将haproxy产生的日志发往此服务器予以存储;
maxconn <number>:设定单个haproxy进程所能接受的最大并发连接数;其等同于命令行选项-n;ulimit -n自动计算的结果正是参照此参数设定的;
其它选项,一般都不需要设定。


代理相关的参数:
分四段:
        defaults:用于为listen/frontend/backend提供默认值;
        frontend <name>:定义监听的套接字(一个前端),可以有多个端口,用于接收客户端请求并与之建立连接;类似于nginx的server;
        backend <name>:定义后端服务器组,类似于nginx的upstream server,用于处理由frontend转发来的用户请求;
        listen <name>:通过关联前端和后端,定义一个完整的proxy server;通常用在tcp流量上;

        注意:所有代理都应该有名称

name:名字可使用大小写字母,数字,下划线(_),短横线(-),点号,冒号;
bind:指明监听的套接字;设定监听的ip和端口;用在frontend,listen,backend中;
    bind [<address>]:<port_range> [,...]
    bind /<path> [, ...] [param*]
其中,address和port不走过多解释了,就是设置ip地址和端口,<path>表示使用unix socket套接字文件,用于linux本机通信;

balance:设定调度方法,用在default,listen,backend中;
    balance <algorithm> [<arguments>]  使用指定的调度算法;
    balance url_param <param> [check_post [<max_wait>]] 指定基于url的参数做调度;

<algorithm>:调度算法
roundrobin:动态算法,(加权)轮询;
        权重可动态调整动态生效;根据权重轮流使用每个服务器,支持权重的运行时调整及慢启动机制,最大支持4095个后端主机;默认权重为1;其它使用hash调度方式的都支持动静两种方式;动态算法指的是服务器权重,可以在运行时调整,以实现实例的慢启动;所以可以加新server进来,而且可定义权重且可动态调整,不会瞬间调度大量请求,时逐渐调度请求上来的;服务器权重不同时就是加权轮询,相同时就是轮询;

static-rr:静态加权轮询;
        静态算法,不支持权重的运行时调整及慢启动机制;权重在服务器运行时改变了也不生效,除非重启服务器,而重启会导致此前所有连接断开,然后才重新调度的;但后端主机无数量上限;当服务器掉线时,健康状态检测又恢复上线时,立即加入服务器列表中取,且立即调度大量连接请求至此服务器,没有慢启动功能;而roundrobin则会慢慢调度请求至服务器;

leastconn:加权最少连接;动态算法;
        后端具有最少连接数的服务器将接收到请求,根据后端服务器当前连接的活动个数少来调度;
        haproxy一般推荐使用在较长时间会话场景中;例如,LDAP,MySQL等协议;并不适用用短时间连接,不是特别适用指的是由于leastconn在计算调度权重时,还得扫描后端服务器当前会话数量,所以性能有影响,消耗cpu资源,但是带来的收益是很低的;
        支持权重的动态改变,支持慢启动,属于wlc调度算法;对于短时间的连接不超过5秒钟,或2秒,一般建议使用roundrobin算法;

first:
        根据服务器在列表中的位置,自上而下进行调度;前面的服务器连接数达到上限时,才将新请求调度至下一个服务器;这种算法好处在于可省服务器;要保证单台服务器支撑多个连接时没有问题,性能还支撑一个没有什么区别时会很有用;
        每一个后端主机要定义最大并发连接数上限;在定义最大连接数时可以定义在三个位置:全局的最大并发连接数上限、每个frontend或listen的最大并发连接数上限、后端主机最大并发连接数上限;

        适用于会话较长的tcp连接;例如LDAP,MySQL等;

source:
        相当于nginx的ip-hash或lvs的sh算法,原地址哈希hash,默认为取模法;静态调度;类似于uri算法,指不过是哈希的源ip,而不是uri;
        将来自于同一个地址的请求,始终发往同一台后端主机;

        取模法:将原地址哈希计算后除以服务器总权重最后取模;结果落在哪个节点上,就有哪个节点发往器响应;服务器总数发生变化,会话会全局失效,会影响全局调度效果;在分布式场景中是相当不靠谱,尤其后端是缓存服务器时;默认为静态的,但是可使用hash-type指令设定支持动态;

        一致性哈希:服务器变得仅影响局部调度;动态调度;第一次调度时,基于取模法进行调度,一旦分配了服务器,后面再访问时将始终发往同一台服务器;通常用在tcp模式中;没有插入cookie时才会使用;如果协议支持cookie插入,就可以根据cookie进行调度,实现会话保持;

uri:基于uri做hash计算
先回顾下URL的完整格式,才能正确理解uri的调度算法;
URL的语法格式:
<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>
解释:
<scheme> 表示使用的协议
<user>:<password>@<host>:<port> 要求认证,指定用户名、密码、主机名或ip、端口
;<params> 分号隔开的是参数,传递给请求的参数;
例如:
        ftp://downloads.magedu.com/pub/gnu;type=d
        http://www.magedu.com/hammers;sale=false/index.html;graphics=true
?<query> 问号隔开的是查询串,指定向数据库发起查询条件;
http://www.joes-hardware.com/inventory-check.cgi?item=12731
        查询数据库item为12731的项目,返回给inventory-check.cgi这个脚本,再由此脚本处理以后的结果返回给客户端;
#<frag> 片段,同一页面上的不同段落锚点;

再来看uri的调度算法:
url_param:基于url指定参数做hash计算
对用户请求的uri中的<params>中的参数的值做hash计算,并由服务器的总权重相除取模后派发至某挑选出的后端主机;此算法通常用于追踪请求中的用户标识,尤其是登录类的电商站点,以确保来自同一个用户的请求始终发往同一个后端服务器;支持动静两种方式,使用hash-type指定;

hdr(<name>):指定某一首部做hash计算
类似于nginx中的hash,可哈希请求报文中的任意首部,即可以基于任意首部做调度;
例如:

listen web
    bind *:80,*:8080
    balance hdr(Host)
    hash-type consistent
    server web-RS1 172.18.11.11:80 check weight 1
    server web-RS2 172.18.11.12:80 check weight 2

hash-type指令,指定对什么进行哈希计算:
hash-type <method> <function> <modifier>
其中:<method>包括map-based和consistent;
map-based:就是取模法;默认方法,是静态算法,不支持权重运行时调整及慢启动;
consistent:就是一致性哈希算法,动态算法,支持权重运行时调整及慢启动;

cookie <name> [ rewrite | insert | prefix ] [ indirect ] [ nocache ]
           [ postonly ] [ preserve ] [ httponly ] [ secure ]
           [ domain <domain> ]* [ maxidle <idle> ] [ maxlife <life> ]
启用基于cookie的持久连接功能;
注意,不是用来管理用户通信中的cookie,而是启用与后端服务器通信时持久连接功能;

server <name> <address>[:[port]] [param*]
定义后端主机中的服务器及其参数;

<name>:服务器的内部名称,仅在haproxy中使用;主要作用会出现在日志及警告信息中,可用来判断故障服务器,如果设定了http-send-server-name,它还将被添加至发往此服务器的请求首部当中;
<address>:服务器的ip地址,支持使用主机名;
[:[port]]:端口映射;省略时,表示与bind的端口相同;

[param*]:可选参数;
backup:设定为备用服务器,相当于sorry server;仅在所有服务器均不可用时,才启用;
check:对后端服务器做健康状态检测,无check时,表示假设后端主机始终可用,同时可使用辅助参数有很多;健康状态检测又三种:网络层检测、传输层检测(端口在未必服务正常,精确度不高)、应用层检测;
addr:通过此地址进行健康状态检测;
port <port>:通过此端口进行健康状态检测;
inter <delay>:连续两次检测之间的时间间隔,默认2000毫秒;每隔多长时间做一次健康检测;
fall <count>:连续多少次的失败检测将标记服务器检测为dead;默认3次;
rise <count>:连续多少次的成功检测将标记服务器为available;默认2次;
httpchk:基于http协议进行健康状态检测;是独立的参数进行设置;类似的还有"smtpchk", "mysql-check", "pgsql-check" and "ssl-hello-chk"分别用来定义7层检测的;

check-ssl:与后端通信使用ssl协议时此行用到;
disabled:表示禁用,类似于varnish中标记为down状态;
id <value>:为每个服务器设置一个持久ID,是基于id的会话粘性才会用到;
maxconn <maxconn>:当前服务器支持的最大并发连接数,超出此值的连接将被放置请求队列中;
maxqueue <maxqueue>:当前服务器的队列上限;
minconn <minconn>:如果设定了此参数,那么,最大值就成为动态的,可以根据后端服务器负载状态动态调整;

on-error <mode>:当判断后端服务器连续出现error时要做哪种模式;
<mode>:
        fastinter:
        fail-check:检测失败;
        sudden-death:间歇性down;
        mark-down:标记为down;
on-marked-down <action>:标记为down时,执行的动作;
on-marked-up <action>:标记为up时,执行的动作;
redir <prefix>:将发往此服务器的所有的GET和HEAD请求重定向至指定的地址;这个地址完全可以是haproxy代理没有关系的另外的主机;发送302响应码;
weight <weight>:服务器的权重;

maxconn <conn>:
定义实例的最大并发连接数;

标记后端主机为backup,例如:server web-RS1 172.18.11.11:80 check weight 1 backup
标记后端主机的最大连接数、队列长度,定义后端主机的的总最大连接数;例如:
maxconn 7700
server web-RS1 172.18.11.11:80 check weight 1 maxconn 2000 maxqueue 200
server web-RS2 172.18.11.12:80 check weight 2 maxconn 5000 maxqueue 500
注意:maxconn=所有后端server定义的maxconn之和+所有后端server定义的maxqueue之和;

option httpchk 默认检测主页响应码为200;
option httpchk <uri>
option httpchk <method> <uri>
option httpchk <method> <uri> <version>
        定义基于http协议7层健康状态检测功能;
        <uri>:如果没指明,默认检测主页;

        <method>:检测为请求方法;
        <version>:检测表示http协议的版本;默认为http 1.0;

mode { tcp|http|health }
定义实例的工作模式;
tcp(四)层:给代理的为ssl,ssh,mysql等非http协议时使用,默认即为此模式;如果服务主机是https主机,要使用mode tcp模式;因为haproxy代理分析不了请求报文首部,加密了;

http(七)层:仅当代理为http协议时使用;包括7层过滤器、内容交换;

health:工作于健康状态检测响应模式;当收到请求时仅回应OK后就断开连接;


设置haproxy反代,负载均衡非http协议,如监听ssl服务,例如:
listen sshserver
    bind *:20002
    balance leastconn
    mode tcp
    maxconn 20
    server sshserver1 172.18.11.11:22 check
    server sshserver2 172.18.11.12:22 check
注意:代理https时,要使用mode 指明tcp模式;

cookie <name> [ rewrite | insert | prefix ] [ indirect ] [ nocache ]
          [ postonly ] [ preserve ] [ httponly ] [ secure ]
          [ domain <domain> ]* [ maxidle <idle> ] [ maxlife <life> ]
cookie:基于cookie进行会话保持;

<name>:用于指明cookie中的某个名称,这个名称定义了那一段cookie信息是用来做会话粘性时被监控、修改、或者插入信息以实现持久性的;
rewrite:重写;整个cookie信息将会被haproxy重写,并在内部加上服务器id信息,当然,也有可能把某些信息依然放进去,只是把其中的某些项改了;相当于把insert和prefix结合使用;
insert:插入;在原有的cookie中插入;
prefix:添加前缀;把cookie信息插入在原有cookie信息的最左侧;
nocache:当使用insert操作时,当客户端经由一个代理连接haproxy主机时,推荐使用此选项;用来操作对应的cache标记来判定对应信息是否能够作为重写标准;
preserve:服务器可以保留某个指定的cookie标记,以实现基于此信息的转发;
secure:指示haproxy在insert时添加一个secure cookie标记;作用在于不允许后端服务器操作里面的cookie信息;
domain <domain>:对应的cookie对应在哪个域上;

基于cookie实现粘性,例如:
listen web
    log global
    bind *:80,*:8080
    balance roundrobin
    option httpchk
    maxconn 7700
    cookie web insert indirect nocache
    server web-RS1 172.18.11.11:80 check weight 1 maxconn 2000 maxqueue 200 cookie rs1
    server web-RS2 172.18.11.12:80 check weight 2 maxconn 5000 maxqueue 500 cookie rs2

统计接口启用相关的参数:

stats enable:启用统计页;可以基于默认参数直接启用统计页;默认参数如下,其实,只需这一个指令即可,其它都有默认值;
默认设置:
        stats uri   : /haproxy?stats
        stats realm : "HAProxy Statistics"
        stats auth  : no authentication
        stats scope : no restriction

定义访问haproxy的状态页uri,例如:
listen stats *:9001
    stats enable
    stats uri /
    stats realm haproxy\ statistics

    stats auth admin:pass
    stats admin if TRUE
浏览器输入:http://172.18.11.111:9001/
wKioL1dIaCWxiYvrAAHg3052mFs174.jpg
stats uri <prefix>:统计页的访问时的uri前缀,通常要跟上?stats;默认为/haproxy?stats;不建议使用默认公开的状态统计页uri;
stats realm <realm>:设定认证时使用realm,使用字符串中有空格时,要用转义符或加双引号;
stats auth <user>:<passwd>:认证时的账号和密码;可以使用多次;
stats refresh <delay>:统计页的自动刷新时间间隔;默认单位秒;
stats show-desc [ <desc> ]:设置显示状态页的描述信息;

例如:
listen stats *:9001
    stats enable
    stats uri /
    stats realm haproxy\ statistics

    stats auth admin:pass
    stats admin if TRUE
    stats refresh 3s
    stats show-desc magedu test haproxy
wKiom1dIaBPQcJ_cAAGKbICc1jU822.jpg
stats hide-version:在统计页隐藏版本信息;
stats admin { if | unless } <cond>:在指定的条件下acl满足时,启用admin功能;

option forwardfor [ except <network> ] [ header <name> ] [ if-none ]
把发往backend server的请求报文中添加X-Forwarded-For首部,其值为真正的客户端主机地址;此功能自动实现;
对于后端主机每一次访问日志信息中记录的客户端是代理服务器的ip地址,应该想要记录真正的客户端ip地址;
except <network>:来自于此网络的请求不添加;
header <name>:不使用默认的X-Forwarded-For,自定义的首部名称;即改名;

例如:
后端RS1,httpd配置文件,修改日志格式:
]# vim /etc/httpd/conf/httpd.conf
LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
wKiom1dIaU2y1l6EAACNwTJB3pw866.jpg

option forceclose
no option forceclose
        启用或禁用活动连接,就是面向客户端连接时,响应完客户端后是否立即断开;

option httpclose
no option httpclose
        启用或禁用被动http连接关闭,就是服务端是否关闭连接;
        haproxy默认支持保持连接功能的,如果客户端不发请求连接也一直存在;
面向客户端一侧,如果强制不使用持久连接功能,可启用option httpclose;否则,要启用no option httpclose,且结合option http-server-close一同使用;

option http-keep-alive
no option http-keep-alive
        是否启用保持连接功能;如果启用option http-keep-alive,要结合option http-server-close一同使用;

reqadd  <string> [{if | unless} <cond>]
        向请求报文尾部添加自定义的header;

reqdel  <search> [{if | unless} <cond>]
reqidel <search> [{if | unless} <cond>]  (ignore case)
        基于模式删除匹配到的请求报文首部中的header及其值;因为首部可能会影响调度算法,所以要删除;

        <search>:搜索的是正则表达式;
        reqidel:忽略字符大小写;


rspadd <string> [{if | unless} <cond>]
        向响应报文尾部添加自定义的header;

rspdel  <search> [{if | unless} <cond>]
rspidel <search> [{if | unless} <cond>]  (ignore case)
        基于模式删除匹配到的响应报文中的header及其值;

删除响应给客户端首部的Server的值,例如:
listen web
    log global
    bind *:80,*:8080
    balance roundrobin
    option httpchk
    maxconn 7700
    rspidel ^Server:.*
    errorfile 403 /tmp/403.html
    cookie web insert indirect nocache
    server web-RS1 172.18.11.11:80 check weight 1 maxconn 2000 maxqueue 200 cookie rs1
    server web-RS2 172.18.11.12:80 check weight 2 maxconn 5000 maxqueue 500 cookie rs2
wKioL1dIa2PDAf-YAAForj63kaM132.jpg

errorfile <code> <file>
设定错误页,响应码及响应的资源文件路径;
<code>:可为200, 400, 403, 408, 500, 502, 503, and 504.
<file>:是本地文件;

errorloc <code> <url>
设定错误页,响应码及响应的本地url;

errorloc302 <code> <url>
告诉客户端,错误页是重定向的本地url,这个url有可能是haproxy服务器自身提供的;

errorloc303 <code> <url>
不由haproxy服务器自己生成错误页,而是返回一个url,这个url可能在另一个服务器上;

使用acl结合自定义错误页,显示给客户端;

acl <aclname> <criterion> [flags] [operator] <value> ...
定义或补全一个访问列表;
acl要先定义后调用;

<aclname>:
        指定acl的名称,可使用同一名称;可用大小写字母、短横线(-) 、下划线(_)、点号(.)、冒号(:);区分字符大小写;

<criterion>:匹配标准,可以基于分析请求报文中的任何属性信息,来作为判断一次请求报文是否符合此处所定义acl;标准非常多,如请求报文原地址、请求报文的首部各信息等;
四层获取匹配条件:
dst IP:目标地址匹配;
dst_port PORT:目标端口匹配;
src IP:源地址匹配;
src_port POST:源端口匹配;
[flags] :标志位;
[operator] :匹配后的操作符;
做布尔型匹配:其值0表示false,1表示true;
做整型匹配:可用操作符为:
eq:等于
ge:大于等于
gt:大于
le:小于
lt:小于等于
做字符串匹配:
-m str:精确匹配;
-m sub:做字串匹配;
-m beg:匹配前缀,即开头的字符串;
-m end:匹配后缀;
-m dir:匹配子路径;
-m dom:域名匹配;

指明多个匹配条件时,使用的逻辑符号:
与:隐式条件;
||:或
!:非

例如:
   acl url_static  path_beg         /static /images /img /css
   acl url_static  path_end         .gif .png .jpg .css .js
   acl host_www    hdr_beg(host) -i www
解释:
        1.定义acl名称为url_static,条件匹配路径的开头,以/static /images /img /css开头都匹配;
        2.cal名称相同,条件匹配路径结尾,以.gif .png .jpg .css .js结尾都匹配

use_backend <backend> [{if | unless} <condition>]
        调用指定的后端主机;条件一般为acl;

default_backend <backend>
        使用的默认后端主机;

haproxy实现简单的动静分离:

]# vim /etc/haproxy/haproxy.cfg

backend php
    balance roundrobin
#   cookie phpsession indirect nocache
    server phpsr1 172.18.11.112:80 check weight 1 cookie php1 maxconn 300
    server phpsr2 172.18.11.113:80 check weight 1 cookie php2 maxconn 600

backend web
    balance roundrobin
    server websr1 172.18.11.11:80 check maxconn 1000
    server websr2 172.18.11.12:80 check maxconn 1000

frontend frondphp
    bind *:80
    acl php_page path_end -i .php
#   acl php_page path_reg -i \.php$
    use_backend php if php_page
    default_backend web

listen stats
    bind *:9000
    stats enable

tcp-check connect [params*]
        打开一个新连接;

block { if | unless } <condition>
        阻塞7层请求;根据判断条件匹配;
        <condition>就是acl;

http-request { allow | deny | tarpit | auth [realm <realm>] | redirect <rule> |
  add-header <name> <fmt> | set-header <name> <fmt> |
  del-header <name> | set-nice <nice> | set-log-level <level> |
  replace-header <name> <match-regex> <replace-fmt> |
  replace-value <name> <match-regex> <replace-fmt> |
  set-tos <tos> | set-mark <mark> |
  add-acl(<file name>) <key fmt> |
  del-acl(<file name>) <key fmt> |
  del-map(<file name>) <key fmt> |
  set-map(<file name>) <key fmt> <value fmt>
}
[ { if | unless } <condition> ]

基于7层做http的请求报文做访问控制;

例如:
acl nagios src 192.168.129.3
acl local_net src 192.168.0.0/16
acl auth_ok http_auth(L1)

http-request allow if nagios
http-request allow if local_net auth_ok
http-request auth realm Gimme if local_net auth_ok
http-request deny

对http的请求报文做控制,为白名单;

http-response { allow | deny | add-header <name> <fmt> | set-nice <nice> |
set-header <name> <fmt> | del-header <name> |
replace-header <name> <regex-match> <replace-fmt> |
replace-value <name> <regex-match> <replace-fmt> |
set-log-level <level> | set-mark <mark> | set-tos <tos> |
add-acl(<file name>) <key fmt> |
del-acl(<file name>) <key fmt> |
del-map(<file name>) <key fmt> |
set-map(<file name>) <key fmt> <value fmt>
}
[ { if | unless } <condition> ]

        基于http的响应报文做访问控制;

        例如:
        acl key_acl res.hdr(X-Acl-Key) -m found

        acl myhost hdr(Host) -f myhost.lst

        http-response add-acl(myhost.lst) %[res.hdr(X-Acl-Key)] if key_acl
        http-response del-acl(myhost.lst) %[res.hdr(X-Acl-Key)] if key_acl



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-223693-1-1.html 上篇帖子: varnish基础应用 下篇帖子: ubuntu下haproxy日志处理
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表