HAProxy(负载均衡器),可以实现正向代理和反向代理
可以基于http协议反向代理,和tcp层的负载均衡(类似lvs的功能)
代理的作用:web缓存、反向代理、内容路由(根据流量及内容类型等将请求转发至特定服务器)、转码器
缓存的作用:
减少冗余内容传输
节省带宽、缓解网络瓶颈
降低了对原始服务器的请求压力
降低了传输延迟
配置文件:/etc/haproxy/haproxy.cfg
/usr/sbin/haproxy程序文件
配置分为两段:
global:配置全局参数,如log,maxconn,…
proxies
default,frontend,backend,listen
frontend,定义前端;backend:定义后端;listen是定义前端和后端,但只能是一对;default默认的,如果没有明确指明就使用默认
default_backend:为frontend指明使用的默认后端;
use_backend:条件式后端调用
balance: 指明调度算法;
示例:这就是一个简单的haproxy的配置
frontend main *:80
default_backend websrvs
backend websrvs
balance roundrobin
serverweb1 172.16.249.115 check
serverweb2 172.16.249.159 check
配置文件中全局中字段的意思:
log:定义日志信息的
nbproc <number>:指定启动的haproxy进程的个数,只能用于守护进程模式的haproxy;默认只启动一个进程,鉴于调试困难等多方面的原因,一般只在单进程仅能打开少数文件描述符的场景中才使用多进程模式;
maxconn 4000:设定每个haproxy进程所能接受的最大并发连接数,这个根据自己需求尽心修改,最大为3万个左右
daemon : 表示启动为守护进程,如果不加将运行在前台
ulimit-n:设定每个进程能够打开的最大文件描述符数目,默认情况下会自动计算,不用修改和添加
spread-checks <0..50,in percent>:做健康状态检查时报文发送的时间间隔,可以为自己定义的时间的前后N% (0-50)表示0%到50%
tune.bufsize: 定义缓冲区的大小,默认就可以
tune.maxaccept<number>:设定haproxy进程内核调度运行时一次性可以接受的连接的个数,较大的值可以带来较大的吞吐率,默认在单进程模式下为100,多进程模式下为8,设定为-1可以禁止此限制;一般不建议修改;
tune.maxpollevents <number>:设定一次系统调用可以处理的事件最大数,默认值取决于操作系统;其值小于200时可节约带宽,但会略微增大网络延迟,而大于200时会降低延迟,但会稍稍增加网络带宽的占用量
tune.maxrewrite<number>:设定为首部重写或追加而预留的缓冲空间,建议使用1024左右的大小;在需要使用更大的空间时,haproxy会自动增加其值;
其他的默认就行了
下面以实例来解释参数
172.16.249.195做haproxy,172.16.249.115 172.16.249.159 为后端web服务器
修改配置文件(/etc/haproxy/haproxy.cfg)如下
server中的check是做健康检测的,
然后启动systemctl start haproxy.service,要保证80端口没有被占用
使用systemctl status haproxy.service,可以查看状态
然后访问测试下
可以看到最简单的负载均衡就实现了,然后你可以停掉后端的一台web看能否做健康检测
然后编辑日志配置文件(/etc/rsyslog.conf),让haproxy的日志能生效,因为默认local2是不记录的
修改如下:
然后重启日志服务systemctl restart rsyslog.service
然后使用ss -unl 看下udp的514端口是否开启了
然后访问几下,去查看下日志
可以看到能记录日志了
HAProxy代理相关的参数:
代理相关的参数配置在如下段中:
- defaults <name>
- frontend <name>
- backend <name>
- listen <name>
“defaults”段用于为所有其它配置段提供默认参数,这配置默认配置参数可由下一个“defaults”所重新设定。
“frontend”段用于定义一系列监听的套接字,这些套接字可接受客户端请求并与之建立连接。
“backend”段用于定义一系列“后端”服务器,代理将会将对应客户端的请求转发至这些服务器。
“listen”段通过关联“前端”和“后端”定义了一个完整的代理,通常只对TCP流量有用。
所有代理的名称只能使用大写字母、小写字母、数字、-(中线)、_(下划线)、.(点号)和:(冒号)。此外,ACL名称会区分字母大小写
1、balance: 指明调度算法;
动态:权重可动态调整,实时生效
静态:调整权重不会实时生效
roundrobin:轮询,动态算法,每个后端主机最多支持4128个连接;
static-rr:轮询,静态算法,每个后端主机支持的数量无上限;
leastconn:根据后端主机的负载数量进行调度;仅适用长连接的会话;动态;
source:将请求的源地址进行hash运算,并由后端服务器的权重总数相除后派发至某匹配的服务器,以后来自这个IP地址的所有请求都会转发给这一个后端服务器
hash-type:
map-based:取模法;静态;
consistent:一致性哈希法;动态;
uri:对URI的左半部分(“问号”标记之前的部分)或整个URI进行hash运算,并由服务器的总权重相除后派发至某匹配的服务器;这可以使得对同一个URI的请求总是被派发至某特定的服务器,除非服务器的权重总数发生了变化;此算法常用于代理缓存或反病毒代理以提高缓存的命中率;需要注意的是,此算法仅应用于HTTP后端服务器场景
URI的组成为:
<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>
uri为‘/’后面的所有内容;uri的左半部分是‘/’‘?’之间的内容
例:http://www.baidu.com/inventory-check.cgi?item=123
uri为:inventory-check.cgi?item=123;uri的左半部分为:inventory-check.cgi
hash-type
map-based:取模法;静态
consistent: 取模法;静态
url_param:根据url中的指定的参数的值进行调度;把值做hash计算,并除以总权重;此算法可以通过追踪请求中的用户标识进而确保同一个用户ID的请求将被送往同一个特定的服务器,除非服务器的总权重发生了变化,可以实现类似会话保持的效果
hash-type
map-based:取模算法
consistent:一致性hash算法
hdr(<name>):根据请求报文中指定的header(如use-agent,referer, hostname)进行调度;把指定的header的值做hash计算;如果相应的首部没有出现或其没有有效值,则使用轮询算法对相应请求进行调度
hash-type
map-based:取模算法
consistent:一致性hash算法
示例:基于uri算法,进行集群调度
修改haproxy的配置文件,修改算法为uri
然后重载服务systemctlreload haproxy.service
然后测试下,为了演示效果,我们多设置几个页面
在后端主机上执行
for i in{1..10};do echo "<h1>Page $i on web1</h1>" >/var/www/html/test$i.html;done
生成10个测试页
另一台主机上执行
for i in {1..10};doecho "<h1>Page $i on web2</h1>" >/var/www/html/test$i.html;done
然后访问测试下
在用其他的主机请求test1.html显示的都是这个页面不会变化了
然后换个测试页试下,看能不能实现负载均衡,
可以看到调度到第二个后端服务器上了
基于uri的调度算法的实现就做好了
如果是基于URI的算法调度,但后端的一个主机宕机了,那么以前分发给这个主机的会自动调度给其他主机
把一个后端的web主机的httpd服务停掉,在请求测试
会发现以前调度给web2的,因为现在web2宕机了,现在调度给web1了
示例:基于hdr实现调度
修改haproxy的配置文件
然后重载,进行测试
使用 curl -A ‘hello’ http://172.16.249.195/test2.html 模拟不同的浏览器来测试
可以看到可以能基于浏览器进行调度
2、bind:此指令仅能用于frontend和listen区段,用于定义一个或几个监听的套接字
bind [<address>]:<port_range>[, ...]
bind [<address>]:<port_range>[, ...] interface <interface>
<address>:可选选项,其可以为主机名、IPv4地址、IPv6地址或*;省略此选项、将其指定为*或0.0.0.0时,将监听当前系统的所有IPv4地址;
<port_range>:可以是一个特定的TCP端口,也可是一个端口范围(如5005-5010),代理服务器将通过指定的端口来接收客户端请求;需要注意的是,每组监听的套接字<address:port>在同一个实例上只能使用一次,而且小于1024的端口需要有特定权限的用户才能使用,这可能需要通过uid参数来定义;
<interface>:指定物理接口的名称,仅能在Linux系统上使用;其不能使用接口别名,而仅能使用物理接口名称,而且只有管理有权限指定绑定的物理接口
示例:修改端口
修改配置文件
然后重启服务,看下端口
3、mode {tcp|http|health }:设定实例的运行模式或协议。当实现内容交换时,前端和后端必须工作于同一种模式(一般说来都是HTTP模式),否则将无法启动实例。
tcp:实例运行于纯TCP模式,在客户端和服务器端之间将建立一个全双工的连接,且不会对7层报文做任何类型的检查;此为默认模式,通常用于SSL、SSH、SMTP等应用;
http:实例运行于HTTP模式,客户端请求在转发至后端服务器之前将被深度分析,所有不与RFC格式兼容的请求都会被拒绝;
health:实例工作于health模式,其对入站请求仅响应“OK”信息并关闭连接,且不会记录任何日志信息;此模式将用于响应外部组件的健康状态检查请求;目前业讲,此模式已经废弃,因为tcp或http模式中的monitor关键字可完成类似功能;
4、log global
log <address> <facility>[<level> [<minlevel>]]
为每个实例启用事件和流量日志,因此可用于所有区段。每个实例最多可以指定两个log参数,不过,如果使用了“log global”且"global"段已经定了两个log参数时,多余了log参数将被忽略。
global:当前实例的日志系统参数同"global"段中的定义时,将使用此格式;每个实例仅能定义一次“log global”语句,且其没有任何额外参数;
<address>:定义日志发往的位置,其格式之一可以为<IPv4_address:PORT>,其中的port为UDP协议端口,默认为514;格式之二为Unix套接字文件路径,但需要留心chroot应用及用户的读写权限;
<facility>:可以为syslog系统的标准facility之一;
<level>:定义日志级别,即输出信息过滤器,默认为所有信息;指定级别时,所有等于或高于此级别的日志信息将会被发送;
5、maxconn<conns>:前端的最大并发连接数
设定一个前端的最大并发连接数,因此,其不能用于backend区段。对于大型站点来说,可以尽可能提高此值以便让haproxy管理连接队列,从而避免无法应答用户请求。当然,此最大值不能超出“global”段中的定义。此外,需要留心的是,haproxy会为每个连接维持两个缓冲,每个缓冲的大小为8KB,再加上其它的数据,每个连接将大约占用17KB的RAM空间。这意味着经过适当优化后,有着1GB的可用RAM空间时将能维护40000-50000并发连接。
如果为<conns>指定了一个过大值,极端场景下,其最终占据的空间可能会超出当前主机的可用内存,这可能会带来意想不到的结果;因此,将其设定了一个可接受值为明智决定。其默认为2000。
6、default_backend: 为frontend指明使用的默认后端;
use_backend: 条件式后端调用;
在没有匹配的"use_backend"规则时为实例指定使用的默认后端,因此,其不可应用于backend区段。在"frontend"和"backend"之间进行内容交换时,通常使用"use-backend"定义其匹配规则;而没有被规则匹配到的请求将由此参数指定的后端接收。
使用案例:
use_backend dynamic if url_dyn
use_backend static if url_css url_img extension_img
default_backend dynamic
7、server
server <name> <address>[:port][param*]:为后端声明一个server,因此,不能用于defaults和frontend区段。
<name>:为此服务器指定的内部名称,其将出现在日志及警告信息中;如果设定了"http-send-server-name",它还将被添加至发往此服务器的请求首部中;
<address>:此服务器的的IPv4地址,也支持使用可解析的主机名,只不过在启动时需要解析主机名至相应的IPv4地址;
[:port]:指定将连接请求所发往的此服务器时的目标端口,其为可选项;未设定时,将使用客户端请求时的同一相端口;
[param*]:为此服务器设定的一系参数;其可用的参数非常多,具体请参考官方文档中的说明,下面仅说明几个常用的参数;
服务器或默认服务器参数:
backup:设定为备用服务器,仅在负载均衡场景中的其它server均不可用于启用此server;
check:启动对此server执行健康状态检查,其可以借助于额外的其它参数完成更精细的设定,
如:
inter <delay>:设定健康状态检查的时间间隔,单位为毫秒,默认为2000;也可以使用fastinter和downinter来根据服务器端状态优化此时间延迟;
rise <count>:设定健康状态检查中,某离线的server从离线状态转换至正常状态需要成功检查的次数;
fall <count>:确认server从正常状态转换为不可用状态需要检查的次数;
cookie <value>:为指定server设定cookie值,此处指定的值将在请求入站时被检查,第一次为此值挑选的server将在后续的请求中被选中,其目的在于实现持久连接的功能;
maxconn <maxconn>:指定此服务器接受的最大并发连接数;如果发往此服务器的连接数目高于此处指定的值,其将被放置于请求队列,以等待其它连接被释放;
maxqueue <maxqueue>:设定请求队列的最大长度;
observe <mode>:通过观察服务器的通信状况来判定其健康状态,默认为禁用,其支持的类型有“layer4”和“layer7”,“layer7”仅能用于http代理场景;
redir <prefix>:启用重定向功能,将发往此服务器的GET和HEAD请求均以302状态码响应;需要注意的是,在prefix后面不能使用/,且不能使用相对地址,以免造成循环;例如:
server srv1 172.16.100.6:80 redir http://imageserver.magedu.com check
weight <weight>:权重,默认为1,最大值为256,0表示不参与负载均衡;
后端http服务做健康检测时的检查方法:
option httpchk 请求主页的
option httpchk <uri> 指明请求的uri
option httpchk <method> <uri>
option httpchk <method> <uri><version>:
不能用于frontend段,
例如:
backend https_relay
mode tcp
option httpchk OPTIONS * HTTP/1.1\r\nHost:\ www.magedu.com
server apache1 192.168.1.1:443 check port 80
基于浏览器cookie实现session sticky的使用案例:
backend websrvs
balance roundrobin
cookieSERVERID insert nocache indirect
serverweb1 172.16.100.68:80 check weight 1 cookie websrv1
serverweb2 172.16.100.69:80 check weight 3 cookie websrv2
要点:
(1) 每个server有自己惟一的cookie标识;
(2) 在backend中定义为用户请求调度完成后操纵其cookie
cookie的语法格式:cookie<name> [rewrite | insert | prefix ] [indirect] [nocache] [...]
name为cookie自己的名称,rewrite是把自己定义的cookiename替换原来的;insert追加到后面;prefix添加到前面
实例:基于cookie实现会话绑定
修改haproxy的配置文件
重载,测试
可以看到有cookie了,然后在请求其他的资源都不会在基于轮询进行调度,会基于cookie进行调度
8、stats:状态监控页的功能
stats enable:启用
启用基于程序编译时默认设置的统计报告,不能用于“frontend”区段。只要没有另外的其它设定,它们就会使用如下的默认配置:
-stats uri : /haproxy?stats
-stats realm : "HAProxy Statistics"
-stats auth : no authentication
-stats scope : no restriction
尽管“stats enable”一条就能够启用统计报告,但还是建议设定其它所有的参数,以免其依赖于默认设定而带来非期望的后果。
下面是一个配置案例:
backend public_www
server websrv1 172.16.100.11:80
stats enable
stats hide-version
stats uri /haproxyadmin?stats
stats realm Haproxy\ Statistics
stats auth statsadmin:password
stats auth statsmaster:password
示例:实现stats
编辑haproxy的配置文件
加入下面这些
然后重启服务,因为添加端口了
然后访问下,因为没有修改路径,就是默认的路径,也不需要认证就可以看到了
然后修改配置文件
重载,访问测试
输入用户名和密码就可以了
可以看到在websrvs中的那一栏,有复选框可以实现管理功能,这是因为加入了stats admin if TRUE 这一句,如果把这一句去掉,显示的页面为
没有复选框就不能实现管理功能了
9、capture requestheader:向日志中记录额外信息,捕获请求报文首部信息
capture request header <name> len<length>
捕获并记录指定的请求首部最近一次出现时的第一个值,仅能用于“frontend”和“listen”区段。捕获的首部值使用花括号{}括起来后添加进日志中。如果需要捕获多个首部值,它们将以指定的次序出现在日志文件中,并以竖线“|”作为分隔符。不存在的首部记录为空字符串,最常需要捕获的首部包括在虚拟主机环境中使用的“Host”、上传请求首部中的“Content-length”、快速区别真实用户和网络机器人的“User-agent”,以及代理环境中记录真实请求来源的“X-Forward-For”。
<name>:要捕获的首部的名称,此名称不区分字符大小写,但建议与它们出现在首部中的格式相同,比如大写首字母。需要注意的是,记录在日志中的是首部对应的值,而非首部名称。
<length>:指定记录首部值时所记录的精确长度,超出的部分将会被忽略。
可以捕获的请求首部的个数没有限制,但每个捕获最多只能记录64个字符。为了保证同一个frontend中日志格式的统一性,首部捕获仅能在frontend中定义。
10、capture responseheader:捕获响应报文首部信息
capture response header <name> len<length>
捕获并记录响应首部,其格式和要点同请求首部。
11、option httplog:当mode为http时,记录丰富的日志信息
option httplog [ clf ]
启用记录HTTP请求、会话状态和计时器的功能。
clf:使用CLF格式来代替HAProxy默认的HTTP格式,通常在使用仅支持CLF格式的特定日志分析器时才需要使用此格式。
默认情况下,日志输入格式非常简陋,因为其仅包括源地址、目标地址和实例名称,而“option httplog”参数将会使得日志格式变得丰富许多,其通常包括但不限于HTTP请求、连接计时器、会话状态、连接数、捕获的首部及cookie、“frontend”、“backend”及服务器名称,当然也包括源地址和端口号等。
12、option logasap;no optionlogasap:启用或禁用提前将HTTP请求记入日志,不能用于“backend”区段。
默认情况下,HTTP请求是在请求结束时进行记录以便能将其整体传输时长和字节数记入日志,由此,传较大的对象时,其记入日志的时长可能会略有延迟。“option logasap”参数能够在服务器发送complete首部时即时记录日志,只不过,此时将不记录整体传输时长和字节数。此情形下,捕获“Content-Length”响应首部来记录传输的字节数是一个较好选择。
一般在defaults段中默认定义
13、option forwardfor :允许在发往服务器的请求首部中插入“X-Forwarded-For”首部
option forwardfor [ except <network>] [ header <name> ] [ if-none ]
<network>:可选参数,当指定时,源地址为匹配至此网络中的请求都禁用此功能。
<name>:可选参数,可使用一个自定义的首部,如“X-Client”来替代“X-Forwarded-For”。有些独特的web服务器的确需要用于一个独特的首部。
if-none:仅在此首部不存在时才将其添加至请求报文首部中。
HAProxy工作于反向代理模式,其发往服务器的请求中的客户端IP均为HAProxy主机的地址而非真正客户端的地址,这会使得服务器端的日志信息记录不了真正的请求来源,“X-Forwarded-For”首部则可用于解决此问题。HAProxy可以向每个发往服务器的请求上添加此首部,并以客户端IP为其value。
需要注意的是,HAProxy工作于隧道模式,其仅检查每一个连接的第一个请求,因此,仅第一个请求报文被附加此首部。如果想为每一个请求都附加此首部,请确保同时使用了“option httpclose”、“option forceclose”和“option http-server-close”几个option。
下面是一个例子:
frontend www
mode http
option forwardfor except 127.0.0.1
在haproxy配置文件中的defaults段中已经默认加入这一项了,
为了看到效果,我们编辑后端的web服务器,修改日志记录的内容,然后查看日志
修改/etc/httpd/conf/httpd.conf 在LogFormat这一段中修改如下
然后重载httpd服务,然后访问几次,查看日志
可以看到记录的是真实的客户端地址了
14、errorfile:定义当用户请求不存在的页面时,使用haproxy主机本地文件进行响应
errorfile <code> <file>
在用户请求不存在的页面时,返回一个页面文件给客户端而非由haproxy生成的错误代码;可用于所有段中。
<code>:指定对HTTP的哪些状态码返回指定的页面;这里可用的状态码有200、400、403、408、500、502、503和504;
<file>:指定用于响应的页面文件;
例如:
errorfile 400/etc/haproxy/errorpages/400badreq.http
errorfile 403/etc/haproxy/errorpages/403forbid.http
errorfile 503/etc/haproxy/errorpages/503sorry.http
15、errorloc 和 errorloc302使用指定的url进行响应,响应状态码为302;只适用于GET请求方法;
errorloc <code> <url>
errorloc302 <code> <url>
请求错误时,返回一个HTTP重定向至某URL的信息;可用于所有配置段中。
<code>:指定对HTTP的哪些状态码返回指定的页面;这里可用的状态码有200、400、403、408、500、502、503和504;
<url>:Location首部中指定的页面位置的具体路径,可以是在当前服务器上的页面的相对路径,也可以使用绝对路径;需要注意的是,如果URI自身错误时产生某特定状态码信息的话,有可能会导致循环定向;
需要留意的是,这两个关键字都会返回302状态吗,这将使得客户端使用同样的HTTP方法获取指定的URL,对于非GET法的场景(如POST)来说会产生问题,因为返回客户的URL是不允许使用GET以外的其它方法的。如果的确有这种问题,可以使用errorloc303来返回303状态码给客户端。
16、 errorloc303
errorloc303 <code> <url>
请求错误时,返回一个HTTP重定向至某URL的信息给客户端;可用于所有配置段中。
<code>:指定对HTTP的哪些状态码返回指定的页面;这里可用的状态码有400、403、408、500、502、503和504;
<url>:Location首部中指定的页面位置的具体路径,可以是在当前服务器上的页面的相对路径,也可以使用绝对路径;需要注意的是,如果URI自身错误时产生某特定状态码信息的话,有可能会导致循环定向;
例如:
backend webserver
server 172.16.100.6 172.16.100.6:80 check maxconn 3000 cookie srv1
server 172.16.100.7 172.16.100.7:80 check maxconn 3000 cookie srv2
errorloc 403 /etc/haproxy/errorpages/sorry.html
errorloc 503 /etc/haproxy/errorpages/sorry.html
17、实现访问控制
http-request:基于http的访问控制即7层的访问控制
语法格式:http-request{allow | deny | auth [realm <realm>]} [{ if | unless } <condition>]
例:acl nagiossrc 192.168.1.2
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
tcp-request:基于tcp的访问控制即4层的访问控制
ACL的相关参数
haproxy的ACL用于实现基于请求报文的首部、响应报文的内容或其它的环境状态信息来做出转发决策,这大大增强了其配置弹性。其配置法则通常分为两步,首先去定义ACL,即定义一个测试条件,而后在条件得到满足时执行某特定的动作,如阻止请求或转发至某特定的后端。
ACL的语法格式如下:
acl <aclname> <criterion> [flags][operator] <value> ...
<aclname>:ACL名称,区分字符大小写,且其只能包含大小写字母、数字、-(连接线)、_(下划线)、.(点号)和:(冒号);haproxy中,acl可以重名,这可以把多个测试条件定义为一个共同的acl;
<criterion>:测试标准,即对什么信息发起测试;测试方式可以由[flags]指定的标志进行调整;而有些测试标准也可以需要为其在<value>之前指定一个操作符[operator];
[flags]:目前haproxy的acl支持的标志位有3个:
-i:不区分<value>中模式字符的大小写;
-f:从指定的文件中加载模式;
--:标志符的强制结束标记,在模式中的字符串像标记符时使用;
<value>:acl测试条件支持的值有以下四类:
a)整数或整数范围:如1024:65535表示从1024至65535;仅支持使用正整数(如果出现类似小数的标识,其为通常为版本测试),且支持使用的操作符有5个,分别为eq、ge、gt、le和lt;
b)字符串:支持使用“-i”以忽略字符大小写,支持使用“\”进行转义;如果在模式首部出现了-i,可以在其之前使用“--”标志位;
c)正则表达式:其机制类同字符串匹配;
d)IP地址及网络地址
同一个acl中可以指定多个测试条件,这些测试条件需要由逻辑操作符指定其关系。条件间的组合测试关系有三种:“与”(默认即为与操作)、“或”(使用“||”操作符)以及“非”(使用“!”操作符)。
1 、be_sess_rate<integer>
be_sess_rate<integer>
be代表backen
用于测试指定的backend上会话创建的速率(即每秒创建的会话数)是否满足指定的条件;常用于在指定backend上的会话速率过高时将用户请求转发至另外的backend,或用于阻止攻击行为。
例如:
backend dynamic
mode http
acl being_scanned be_sess_rate gt 50
redirect location/error_pages/denied.html if being_scanned
2、fe_sess_rate<integer>
fe_sess_rate<integer>
fe代表frontend
用于测试指定的frontend(或当前frontend)上的会话创建速率是否满足指定的条件;常用于为frontend指定一个合理的会话创建速率的上限以防止服务被滥用。例如下面的例子限定入站邮件速率不能大于50封/秒,所有在此指定范围之外的请求都将被延时50毫秒。
例如:
frontend mail
bind :25
mode tcp
maxconn 500
acl too_fast fe_sess_rate gt 50
tcp-request inspect-delay 50ms
tcp-request content accept if !too_fast
tcp-request content accept if WAIT_END
3 、hdr <string>
hdr(header)<string>
用于测试请求报文中的所有首部或指定首部是否满足指定的条件;指定首部时,其名称不区分大小写,且在括号“()”中不能有任何多余的空白字符。测试服务器端的响应报文时可以使用hdr()。
例如下面的例子用于测试首部Connection的值是否为close:
hdr(Connection) -i close
4 、method<string>
method<string>
测试HTTP请求报文中使用的方法。
5 、path_beg<string>
用于测试请求的URL是否以<string>指定的模式开头。下面的例子用于测试URL是否以/static、/images、/javascript或/stylesheets头。
acl url_static path_beg -i /static /images /javascript/stylesheets
6、 path_end<string>
用于测试请求的URL是否以<string>指定的模式结尾。例如,下面的例子用户测试URL是否以jpg、gif、png、css或js结尾。
acl url_static path_end -i .jpg .gif .png .css .js
7 、hdr_beg<string>
用于测试请求报文的指定首部的开头部分是否符合<string>指定的模式。例如,下面的例子用记测试请求是否为提供静态内容的主机img、video、download或ftp。
acl host_static hdr_beg(host) -i img.video. download. ftp.
8 、hdr_end<string>
用于测试请求报文的指定首部的结尾部分是否符合<string>指定的模式。例如,下面的例子用记测试请求是否为
还常用到:
url_beg<string>:url以<string>开头的
url_end<string>:url以<string>结尾的
path_reg:支持正则表达式
url_reg:支持正则表达式
示例:动静分离;基于lamp部署discuz,而动静分离;CentOS7上实现
首先后端的web服务器,要搭建好lamp,安装httpd php php-mysql mariadb-server
然后启动httpd
然后使用httpd –M查看php模块是否启动只要有这一句php5_module(shared)就可以了,然后在httpd配置文件中这个词DirectoryIndex后面加上 index.php
然后在一个web服务器上打开mariadb服务,然后创建数据库(dcdb)配置授权
在/etc/my.cnf中要加入skip_name_resolve = no,是为了防止反解的
grant all on dcdb.* to ‘dcuser‘@‘172.16.%.%‘identified by ‘passwd‘;
然后在其他主机上远程连接测试下,能连上就行了
然后在web服务器上设置测试夜,看php和mysql连接是不是正常,要确定selinx 和iptables是关闭的
然后解压Discuz,然后复制upload到/var/www/html中,然后修改属组属主为apache,权限766,然后外面打开,然后配置数据库,安装,再把后端的一个web服务器的upload复制给另一台,然后做动静分离
在haproxy配置文件中配置如下:
frontend http-in
bind *:80
mode http
log global
option httpclose
option logasap
option dontlognull
capture request header Host len20
capture request header Refererlen 60
acl url_static path_beg -i /static /images /javascript/stylesheets
acl url_static path_end -i .jpg .jpeg .gif .png .css .js
use_backend static_servers if url_static
default_backend dynamic_servers
backend static_servers
balance roundrobin
server imgsrv1 172.16.249.115:80check maxconn 6000
server imgsrv1172.16.249.116:80 check maxconn 6000
backend dynamic_servers
cookie srv insert nocache
balance roundrobin
server websrv1172.16.249.159:80 check maxconn 1000 cookie websrv1
server websrv1172.16.249.160:80 check maxconn 1000 cookie websrv1
这样重载服务,然后访问,就没问题了
然后查看后端主机的日志,会发现动静分离了
示例:实现keepalived+haproxy
haproxy的配置如上,要用两台主机做haproxy,然后在两台haproxy主机上安装keepalived程序,然后修改配置文件如下:
一台haproxy主机上的keepalived配置如下:
global_defs {
notification_email {
root@localhost
}
notification_email_from kaadmin@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id centos7
}
vrrp_script chk_nginx {
script "killall -0 haproxy &> /dev/null"
interval 1
weight -10
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 6b03429a7cf5
}
virtual_ipaddress {
172.16.249.18/16 dev eth0 label eth0:0
}
track_script {
chk_nginx
}
notify_master "/etc/keepalived/notify.sh master"
notify_backup "/etc/keepalived/notify.sh backup"
notify_fault "/etc/keepalived/notify.sh fault
}
另一台haproxy主机上的keepalived配置文件为
global_defs {
notification_email {
root@localhost
}
notification_email_from kaadmin@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id centos71
}
vrrp_script chk_nginx {
script "killall -0 haproxy &> /dev/null"
interval 1
weight -10
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 99
advert_int 1
authentication {
auth_type PASS
auth_pass 6b03429a7cf5
}
virtual_ipaddress {
172.16.249.18/16 dev eth0 label eth0:0
}
track_script {
chk_nginx
}
notify_master "/etc/keepalived/notify.sh master"
notify_backup "/etc/keepalived/notify.sh backup"
notify_fault "/etc/keepalived/notify.sh fault"
}
然后启动测试就行了
本文出自 “10520982” 博客,请务必保留此出处http://10530982.blog.51cto.com/10520982/1709284
原文:http://10530982.blog.51cto.com/10520982/1709284