HAproxy的简单应用和基础知识


HAProxy(负载均衡器),能够实现正向代理和反向代理javascript

能够基于http协议反向代理,和tcp层的负载均衡(相似lvs的功能)php

 代理的做用:web缓存、反向代理、内容路由(根据流量及内容类型等将请求转发至特定服务器)、转码器css

 缓存的做用:html

    减小冗余内容传输前端

    节省带宽、缓解网络瓶颈java

    下降了对原始服务器的请求压力mysql

    下降了传输延迟ios

 

配置文件:/etc/haproxy/haproxy.cfgnginx

    /usr/sbin/haproxy程序文件web

配置分为两段:

   global:配置全局参数,如logmaxconn,…

   proxies

     defaultfrontendbackendlisten

     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.195haproxy172.16.249.115  172.16.249.159 为后端web服务器

修改配置文件(/etc/haproxy/haproxy.cfg)以下

spacer.gif

server中的check是作健康检测的,

而后启动systemctl  start  haproxy.service,要保证80端口没有被占用

使用systemctl  status  haproxy.service,能够查看状态

spacer.gif

而后访问测试下

spacer.gifwKiom1Y4dtKBeQ9BAABKjGk4pzk948.jpg

能够看到最简单的负载均衡就实现了,而后你能够停掉后端的一台web看可否作健康检测

 

而后编辑日志配置文件(/etc/rsyslog.conf,haproxy的日志能生效,由于默认local2是不记录的

修改以下:

spacer.gifwKioL1Y4dzXA72_BAAB4Q1CHZtI642.jpg

而后重启日志服务systemctl restart rsyslog.service

而后使用ss  -unl 看下udp514端口是否开启了

spacer.gif

而后访问几下,去查看下日志

spacer.gif

能够看到能记录日志了

 

HAProxy代理相关的参数:

代理相关的参数配置在以下段中:

 - defaults <name>

 - frontend <name>

 - backend <name>

 - listen  <name>

 “defaults”段用于为全部其它配置段提供默认参数,这配置默认配置参数可由下一个“defaults”所从新设定。

 frontend”段用于定义一系列监听的套接字,这些套接字可接受客户端请求并与之创建链接。

 backend”段用于定义一系列“后端”服务器,代理将会将对应客户端的请求转发至这些服务器。

 listen”段经过关联“前端”和“后端”定义了一个完整的代理,一般只对TCP流量有用。

 

 全部代理的名称只能使用大写字母、小写字母、数字、-(中线)_(下划线).(点号):(冒号)。此外,ACL名称会区分字母大小写

 

1balance: 指明调度算法;

    动态:权重可动态调整,实时生效

    静态:调整权重不会实时生效

    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=123uri的左半部分为: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

spacer.gif

而后重载服务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 

而后访问测试下

spacer.gif

在用其余的主机请求test1.html显示的都是这个页面不会变化了

spacer.gif

而后换个测试页试下,看能不能实现负载均衡,

wKiom1Y4eRKSAFgyAABSoiyiLRA337.jpg

wKiom1Y4eRKyvt4pAABL2pvl7ZM957.jpg

 

能够看到调度到第二个后端服务器上了

基于uri的调度算法的实现就作好了

若是是基于URI的算法调度,但后端的一个主机宕机了,那么之前分发给这个主机的会自动调度给其余主机

把一个后端的web主机的httpd服务停掉,在请求测试

spacer.gif

会发现之前调度给web2的,由于如今web2宕机了,如今调度给web1

 

示例:基于hdr实现调度

修改haproxy的配置文件

spacer.gif

而后重载,进行测试

使用 curl  -A ‘hello’ http://172.16.249.195/test2.html 模拟不一样的浏览器来测试

spacer.gif

能够看到能够能基于浏览器进行调度

 

2bind:此指令仅能用于frontendlisten区段,用于定义一个或几个监听的套接字

    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系统上使用;其不能使用接口别名,而仅能使用物理接口名称,并且只有管理有权限指定绑定的物理接口


示例:修改端口

修改配置文件

spacer.gif

而后重启服务,看下端口

wKioL1Y4esPw08L9AANEsVvSEpA940.jpg

 

3mode {tcp|http|health }:设定实例的运行模式或协议。当实现内容交换时,前端和后端必须工做于同一种模式(通常说来都是HTTP模式),不然将没法启动实例。

    tcp:实例运行于纯TCP模式,在客户端和服务器端之间将创建一个全双工的链接,且不会对7层报文作任何类型的检查;此为默认模式,一般用于SSLSSHSMTP等应用;

    http:实例运行于HTTP模式,客户端请求在转发至后端服务器以前将被深度分析,全部不与RFC格式兼容的请求都会被拒绝;

    health:实例工做于health模式,其对入站请求仅响应“OK”信息并关闭链接,且不会记录任何日志信息;此模式将用于响应外部组件的健康状态检查请求;目前业讲,此模式已经废弃,由于tcphttp模式中的monitor关键字可完成相似功能;

 

4log global

    log <address> <facility>[<level> [<minlevel>]]

  为每一个实例启用事件和流量日志,所以可用于全部区段。每一个实例最多能够指定两个log参数,不过,若是使用了“log global”且"global"段已经定了两个log参数时,多余了log参数将被忽略。

 

    global:当前实例的日志系统参数同"global"段中的定义时,将使用此格式;每一个实例仅能定义一次“log global”语句,且其没有任何额外参数;

    <address>:定义日志发往的位置,其格式之一能够为<IPv4_address:PORT>,其中的portUDP协议端口,默认为514;格式之二为Unix套接字文件路径,但须要留心chroot应用及用户的读写权限;

    <facility>:能够为syslog系统的标准facility之一;

    <level>:定义日志级别,即输出信息过滤器,默认为全部信息;指定级别时,全部等于或高于此级别的日志信息将会被发送;

 

5maxconn<conns>:前端的最大并发链接数

 

  设定一个前端的最大并发链接数,所以,其不能用于backend区段。对于大型站点来讲,能够尽量提升此值以便让haproxy管理链接队列,从而避免没法应答用户请求。固然,此最大值不能超出“global”段中的定义。此外,须要留心的是,haproxy会为每一个链接维持两个缓冲,每一个缓冲的大小为8KB,再加上其它的数据,每一个链接将大约占用17KBRAM空间。这意味着通过适当优化后,有着1GB的可用RAM空间时将能维护40000-50000并发链接。

 

  若是为<conns>指定了一个过大值,极端场景下,其最终占据的空间可能会超出当前主机的可用内存,这可能会带来意想不到的结果;所以,将其设定了一个可接受值为明智决定。其默认为2000

 

6default_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

 

7server

  server <name> <address>[:port][param*]:为后端声明一个server,所以,不能用于defaultsfrontend区段。

 

    <name>:为此服务器指定的内部名称,其将出如今日志及警告信息中;若是设定了"http-send-server-name",它还将被添加至发往此服务器的请求首部中;

    <address>:此服务器的的IPv4地址,也支持使用可解析的主机名,只不过在启动时须要解析主机名至相应的IPv4地址;

    [:port]:指定将链接请求所发往的此服务器时的目标端口,其为可选项;未设定时,将使用客户端请求时的同一相端口;

    [param*]:为此服务器设定的一系参数;其可用的参数很是多,具体请参考官方文档中的说明,下面仅说明几个经常使用的参数;

 

  服务器或默认服务器参数:

    backup:设定为备用服务器,仅在负载均衡场景中的其它server均不可用于启用此server

    check:启动对此server执行健康状态检查,其能够借助于额外的其它参数完成更精细的设定,

  如:

     inter <delay>:设定健康状态检查的时间间隔,单位为毫秒,默认为2000;也可使用fastinterdowninter来根据服务器端状态优化此时间延迟;

     rise <count>:设定健康状态检查中,某离线的server从离线状态转换至正常状态须要成功检查的次数;

     fall <count>:确认server从正常状态转换为不可用状态须要检查的次数;

    cookie <value>:为指定server设定cookie值,此处指定的值将在请求入站时被检查,第一次为此值挑选的server将在后续的请求中被选中,其目的在于实现持久链接的功能;

    maxconn <maxconn>:指定此服务器接受的最大并发链接数;若是发往此服务器的链接数目高于此处指定的值,其将被放置于请求队列,以等待其它链接被释放;

    maxqueue <maxqueue>:设定请求队列的最大长度;

    observe <mode>:经过观察服务器的通讯情况来断定其健康状态,默认为禁用,其支持的类型有“layer4”和“layer7”,“layer7”仅能用于http代理场景;

    redir <prefix>:启用重定向功能,将发往此服务器的GETHEAD请求均以302状态码响应;须要注意的是,在prefix后面不能使用/,且不能使用相对地址,以避免形成循环;例如:

 server srv1 172.16.100.6:80  redir http://p_w_picpathserver.magedu.com check

    weight <weight>:权重,默认为1,最大值为2560表示不参与负载均衡;

 

  后端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] [...]

    namecookie本身的名称,rewrite是把本身定义的cookiename替换原来的;insert追加到后面;prefix添加到前面

实例:基于cookie实现会话绑定

修改haproxy的配置文件

spacer.gif

重载,测试

spacer.gif

能够看到有cookie了,而后在请求其余的资源都不会在基于轮询进行调度,会基于cookie进行调度

spacer.gif

 

8stats:状态监控页的功能

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的配置文件

加入下面这些

spacer.gif

而后重启服务,由于添加端口了

而后访问下,由于没有修改路径,就是默认的路径,也不须要认证就能够看到了

spacer.gif

 

而后修改配置文件

wKioL1Y4fKexM4fmAAC0WcuhMNc762.jpg

重载,访问测试

spacer.gif

输入用户名和密码就能够了

 

wKiom1Y4fOiR3bdJAAbttt8v65o405.jpg

能够看到在websrvs中的那一栏,有复选框能够实现管理功能,这是由于加入了stats  admin if  TRUE  这一句,若是把这一句去掉,显示的页面为

spacer.gif

没有复选框就不能实现管理功能了

 

9capture requestheader:向日志中记录额外信息,捕获请求报文首部信息

capture request header <name> len<length>

 

捕获并记录指定的请求首部最近一次出现时的第一个值,仅能用于“frontend”和“listen”区段。捕获的首部值使用花括号{}括起来后添加进日志中。若是须要捕获多个首部值,它们将以指定的次序出如今日志文件中,并以竖线“|”做为分隔符。不存在的首部记录为空字符串,最常须要捕获的首部包括在虚拟主机环境中使用的“Host”、上传请求首部中的“Content-length”、快速区别真实用户和网络机器人的“User-agent”,以及代理环境中记录真实请求来源的“X-Forward-For”。

 

<name>:要捕获的首部的名称,此名称不区分字符大小写,但建议与它们出如今首部中的格式相同,好比大写首字母。须要注意的是,记录在日志中的是首部对应的值,而非首部名称。

<length>:指定记录首部值时所记录的精确长度,超出的部分将会被忽略。

 

能够捕获的请求首部的个数没有限制,但每一个捕获最多只能记录64个字符。为了保证同一个frontend中日志格式的统一性,首部捕获仅能在frontend中定义。

 

10capture responseheader:捕获响应报文首部信息

 

capture response header <name> len<length>

 

捕获并记录响应首部,其格式和要点同请求首部。

 

11option httplog:当modehttp时,记录丰富的日志信息

 

option httplog [ clf ]

启用记录HTTP请求、会话状态和计时器的功能。

clf:使用CLF格式来代替HAProxy默认的HTTP格式,一般在使用仅支持CLF格式的特定日志分析器时才须要使用此格式。

默认状况下,日志输入格式很是简陋,由于其仅包括源地址、目标地址和实例名称,而“option httplog”参数将会使得日志格式变得丰富许多,其一般包括但不限于HTTP请求、链接计时器、会话状态、链接数、捕获的首部及cookie、“frontend”、“backend”及服务器名称,固然也包括源地址和端口号等。

 

12option logasapno optionlogasap:启用或禁用提早将HTTP请求记入日志,不能用于“backend”区段。

默认状况下,HTTP请求是在请求结束时进行记录以便能将其总体传输时长和字节数记入日志,由此,传较大的对象时,其记入日志的时长可能会略有延迟。“option logasap”参数可以在服务器发送complete首部时即时记录日志,只不过,此时将不记录总体传输时长和字节数。此情形下,捕获“Content-Length”响应首部来记录传输的字节数是一个较好选择。

通常在defaults段中默认定义

 

13option 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这一段中修改以下

spacer.gif

而后重载httpd服务,而后访问几回,查看日志

wKioL1Y4fYWz1ZP0AANHALL_kqE593.jpg

能够看到记录的是真实的客户端地址了

 

14errorfile:定义当用户请求不存在的页面时,使用haproxy主机本地文件进行响应

errorfile <code> <file>

 

在用户请求不存在的页面时,返回一个页面文件给客户端而非由haproxy生成的错误代码;可用于全部段中。

<code>:指定对HTTP的哪些状态码返回指定的页面;这里可用的状态码有200400403408500502503504

<file>:指定用于响应的页面文件;

例如:

errorfile 400/etc/haproxy/errorpages/400badreq.http

errorfile 403/etc/haproxy/errorpages/403forbid.http

errorfile 503/etc/haproxy/errorpages/503sorry.http

 

15errorloc errorloc302使用指定的url进行响应,响应状态码为302;只适用于GET请求方法;

errorloc <code> <url>

errorloc302 <code> <url>

 

请求错误时,返回一个HTTP重定向至某URL的信息;可用于全部配置段中。

<code>:指定对HTTP的哪些状态码返回指定的页面;这里可用的状态码有200400403408500502503504

<url>Location首部中指定的页面位置的具体路径,能够是在当前服务器上的页面的相对路径,也可使用绝对路径;须要注意的是,若是URI自身错误时产生某特定状态码信息的话,有可能会致使循环定向;

 

须要留意的是,这两个关键字都会返回302状态吗,这将使得客户端使用一样的HTTP方法获取指定的URL,对于非GET法的场景(POST)来讲会产生问题,由于返回客户的URL是不容许使用GET之外的其它方法的。若是的确有这种问题,可使用errorloc303来返回303状态码给客户端。

 

16 errorloc303

errorloc303 <code> <url>

 

请求错误时,返回一个HTTP重定向至某URL的信息给客户端;可用于全部配置段中。

<code>:指定对HTTP的哪些状态码返回指定的页面;这里可用的状态码有400403408500502503504

<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

 

1七、实现访问控制

 http-request:基于http的访问控制即7层的访问控制

 语法格式:http-request{allow | deny | auth [realm <realm>]} [{ if | unless } <condition>]

    例:acl nagio***c 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

二、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、/p_w_picpaths、/javascript或/stylesheets头。

    acl url_static       path_beg       -i /static /p_w_picpaths /javascript/stylesheets

六、 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';

而后在其余主机上远程链接测试下,能连上就好了

wKiom1Y4f_-A6a-OAAE1Y7YZfCc920.jpg

而后在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 /p_w_picpaths /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"

     

    }

而后启动测试就好了

相关文章
相关标签/搜索