haproxy反代负载均衡

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
云数据库 RDS MySQL Serverless,价值2615元额度,1个月
简介:

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.png


可对比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.png


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.png

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.png

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.png


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.png


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










本文转自 crystaleone 51CTO博客,原文链接:http://blog.51cto.com/linsj/1783960,如需转载请自行联系原作者
相关实践学习
部署高可用架构
本场景主要介绍如何使用云服务器ECS、负载均衡SLB、云数据库RDS和数据传输服务产品来部署多可用区高可用架构。
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
目录
相关文章
|
7月前
|
负载均衡 算法 应用服务中间件
百度搜索:蓝易云【Linux系统如何使用 HAProxy、Nginx 和 Keepalived 进行负载均衡?】
通过上述步骤,你可以在Linux系统中使用HAProxy、Nginx和Keepalived来实现负载均衡。这些工具可以帮助你将流量分配到多个后端服务器上,提高系统的性能、可靠性和可扩展性。
92 0
|
13天前
|
负载均衡 网络协议 应用服务中间件
【亮剑】在Linux中构建高可用性和高性能网络服务的负载均衡工具HAProxy、Nginx和Keepalived。
【4月更文挑战第30天】本文介绍了在Linux中构建高可用性和高性能网络服务的负载均衡工具HAProxy、Nginx和Keepalived。HAProxy是一个高性能的开源TCP和HTTP负载均衡器,适合处理大量并发连接;Nginx是一个多功能Web服务器和反向代理,支持HTTP、HTTPS和TCP负载均衡,同时提供缓存和SSL功能;Keepalived用于监控和故障切换,通过VRRP实现IP热备份,保证服务连续性。文中详细阐述了如何配置这三个工具实现负载均衡,包括安装、配置文件修改和启动服务,为构建可靠的负载均衡系统提供了指导。
|
20天前
|
负载均衡 算法 网络协议
LVS、Nginx和HAProxy负载均衡器对比总结
LVS、Nginx和HAProxy负载均衡器对比总结
|
21天前
|
负载均衡 监控 网络协议
使用haproxy实现负载均衡集群
【4月更文挑战第14天】HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,快速并且可靠的一种解决方案。
13 1
|
6月前
|
负载均衡 前端开发 网络协议
Keepalived+HAProxy 搭建高可用负载均衡(二)
Keepalived+HAProxy 搭建高可用负载均衡
|
6月前
|
负载均衡 算法 调度
Keepalived+HAProxy 搭建高可用负载均衡
Keepalived+HAProxy 搭建高可用负载均衡
236 0
|
6月前
|
负载均衡 算法 应用服务中间件
Haproxy负载均衡
Haproxy负载均衡
|
7月前
|
负载均衡 前端开发 应用服务中间件
企业实战(22)基于Haproxy负载均衡+Keepalived高可用集群实战详解
企业实战(22)基于Haproxy负载均衡+Keepalived高可用集群实战详解
|
12月前
|
运维 负载均衡 监控
在 Linux 中如何使用 HAProxy、Nginx 和 Keepalived 进行负载均衡?
在 Linux 中如何使用 HAProxy、Nginx 和 Keepalived 进行负载均衡?
677 0
在 Linux 中如何使用 HAProxy、Nginx 和 Keepalived 进行负载均衡?