haproxy (3)

3.17 option httplog


option httplog [ clf ]


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


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


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


3.18 option logasap

     no option logasap


option logasap

no option logasap


启用或禁用提前将HTTP请求记入日志,不能用于“backend”区段。


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


  listen http_proxy 0.0.0.0:80

      mode http

      option httplog

      option logasap

      log 172.16.100.9 local2


3.17 option httplog


option httplog [ clf ]


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


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


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


3.18 option logasap

     no option logasap


option logasap

no option logasap


启用或禁用提前将HTTP请求记入日志,不能用于“backend”区段。


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


  listen http_proxy 0.0.0.0:80

      mode http

      option httplog

      option logasap

      log 172.16.100.9 local2


3.20 errorfile


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


3.21 errorloc 和 errorloc302 


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状态码给客户端。


3.22 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 srv01

  server 172.16.100.7 172.16.100.7:80 check maxconn 3000 cookie srv02

  errorloc 403 /etc/haproxy/errorpages/sorry.htm

  errorloc 503 /etc/haproxy/errorpages/sorry.htm


timeout http-request <timeout>

面对客户端的UI大请求事件,默认是毫秒(单位可改)

wKiom1ZXzRqD89TEAABL3sVjd-s743.jpg


timeout queue <timeout>

让客户端等待队列最大的时间,一般超时返回503

wKioL1ZXzg6BOU7dAABV6N7zL2U512.jpg

timeout connect <timeout>

不在队列的前提下,服务器响应过慢,服务器超时

wKioL1ZXzr_wErbcAABakuw-aDQ689.jpg

timeout client <timeout>

定义TCP超时时间,客户端tcp超时

wKiom1ZXzx_RSYx2AABIOfVHSGs611.jpg

timeout server <timeout>

服务器与客户端建立tcp会话的超时时间


timeout http-keep-alive <timeout>

保持连接的超时时间,客户端长连接一侧多长时间


timeout check

健康状态检测的超时





cookie:启用后端服务器会话粘性的功能。目的是注重客户端的身份信息。haproxy如何篡改客户端和server发来的cookie。

    rewrite:重写,server提供新的cookie

    insert:server在响应用户名请求时,server附加cookie信息,haproxy内部插入haproxy认为要插入的信息

    prefix:在cookie上家前缀

wKioL1ZXr3XjLdkqAACg96bor0w442.jpg

cookie功能:第一次会话,server生成随机cookie提供给客户使用,客户将cookie保存在自己的缓存中,后面访问server时,都会附加用户,会话标识。

wKiom1ZXsBjhHEBkAADiunE0JIw984.jpg



nocache:一旦由cookie,通知缓存服务器怒要缓存用户数据

wKioL1ZXsyPSkyKEAADsVimEXRs242.jpg

cookie的粘性设置

[root@node200 ~]# vim /etc/haproxy/haproxy.cfg

 81 backend appsrvs

 82     balance     roundrobin

 83     option httpchk

 84     cookie SERVERID insert indirect nocache

 85     server  node2 192.168.112.130:80 check inter 2 rise 1 fall 3 cookie node2

 86     server  node3 192.168.112.140:80 check inter 2 rise 1 fall 3 cookie node3

 87 #    server  app3 127.0.0.1:5003 check

 88  #   server  app4 127.0.0.1:5004 check

 89 listen stats_pages

 90 bind *:9001

 91 stats enable

 92 stats uri /haproxyadmin?stats

[root@node200 ~]# service haproxy restart

停止 haproxy:                                             [确定]

正在启动 haproxy:                                         [确定]

wKioL1ZVar-T9ogyAAMRLO-iH84975.jpg



option forwordfor:后端服务器知道那个客户端过来请求,使用日志查看,通过x-forward-for。在haproxy上附加客户端的IP地址,结果haproxy,封装后给后端服务器。

wKioL1ZXtPnBA2GXAAB40WOOj2g373.jpg

[root@node200 ~]# vim /etc/haproxy/haproxy.cfg

  73 backend appsrvs

 74     balance     roundrobin

 75     mode http

 76    # option httpchk

 77    # cookie SERVERID insert indirect nocache    

 78     server  node2 192.168.112.130:80 check

 79     server  node3 192.168.112.140:80 check

 80     option forwardfor except 127.0.0.1(可以不写)


wKiom1ZVc6uS6B8HAAARdqMRKdc159.jpg

[root@node2 ~]# vim /etc/httpd/conf/httpd.conf 

LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

[root@node2 ~]# service httpd reload

重新载入 httpd:

wKioL1ZWY9qT34gIAACBOL9x3AY714.jpg

[root@node2 ~]# tail /var/log/httpd/access_log

192.168.112.200 - - "GET / HTTP/1.1" 200 16 "-" "Mozilla/5.0 (X11; Linux

192.168.112.200 - - "GET / HTTP/1.1" 200 16 "-" "Mozilla/5.0 (X11; Linux

192.168.112.200 - - "GET / HTTP/1.1" 200 16 "-" "Mozilla/5.0 (X11; Linux

192.168.112.1 - - "GET / HTTP/1.1" 200 16 "-" "Mozilla/5.0 (Windows NT 6

192.168.112.1 - - "GET / HTTP/1.1" 200 16 "-" "Mozilla/5.0 (Windows NT 6

192.168.112.1 - - "GET / HTTP/1.1" 200 16 "-" "Mozilla/5.0 (Windows NT 6

192.168.112.1 - - "GET / HTTP/1.1" 200 16 "-" "Mozilla/5.0 (Windows NT 6

192.168.112.1 - - "GET / HTTP/1.1" 304 - "-" "Mozilla/5.0 (Windows NT 6.

spacer.gif

wKioL1ZWZDyC6BHbAAC76WSI8yc398.jpg

wKioL1ZWZD2gIOJkAACsMPZNcV8941.jpg


option http-server-close;no option http-server-close

长连接超时,主动关闭服务器连接;

注意:如果启用长连接,必须启动此选项


option http-pretend-keeplived;no option http-pretend-keeplived

haproxy通告webserver是否假装长连接,保持长连接;客户端一侧长连接,web端需要长连接。


option httpclose;no option httpclose

一般是第一次请求,haproxy分析并发送webserver,然后第二次haproxy不会检查,管道直接连接webserver(当粘性定位)。

option httpclos:haproxy会对每个请求做作请求。首部:“connection:close”的时候会做检查。


option redispatch;no option redispatch

当连接发生错误时,是否需要重新会话调度。


redirect

URL重定向

示例:acl secure dst_port 8080

acl login_page url_beg /login

acl secure dst_port 8080

redirect prefix http://zye.com if login_page !secure(之间是与的关系)

 注意:acl相同属于“或”的关系。


五 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测试条件支持的值有以下四类:

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

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

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

    IP地址及网络地址


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


5.1 常用的测试标准(criteria)


5.1.1 be_sess_rate <integer>


be_sess_rate(backend) <integer>


用于测试指定的backend上会话创建的速率(即每秒创建的会话数)是否满足指定的条件;常用于在指定backend上的会话速率过高时将用户请求转发至另外的backend,或用于阻止ddos***行为。例如:


    backend dynamic

        mode http

        acl being_scanned be_sess_rate gt 50

        redirect location /error_pages/denied.html if being_scanned


5.1.2 fe_sess_rate <integer>


fe_sess_rate(frontend) <integer>


用于测试指定的frontend(或当前frontend)上的会话创建速率是否满足指定的条件;常用于为frontend指定一个合理的会话创建速率的上限以防止服务被滥用。例如下面的例子限定入站邮件速率不能大于50封/秒,所有在此指定范围之外的请求都将被延时50毫秒。


    frontend mail

        bind :25

        mode tcp

        maxconn 500

        acl too_fast fe_sess_rate ge 500

        tcp-request inspect-delay 50ms(以50秒做TCP访问控制)

        tcp-request content accept if ! too_fast

        tcp-request content accept if WAIT_END

标注:tcp-request:tcp层次中做访问控制


5.1.3 hdr <string>


hdr(header) <string>


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


    hdr(Connection) -i close


5.1.4 method <string>


method <string>


测试HTTP请求报文中使用的方法。


5.1.5 path_beg <string>


  URL scheme://host:port/path/to/somewhere 中的 /path/to/somewhere


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


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


5.1.6 path_end <string>


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


    acl url_static       path_end       -i .jpg .gif .png .css .js


    


5.1.7 hdr_beg <string>


用于测试请求报文的指定首部的开头部分是否符合<string>指定的模式。例如,下面的例子用记测试请求是否为提供静态内容的主机img、video、download或ftp。


    acl host_static hdr_beg(host) -i img. video. download. ftp.


5.1.8 hdr_end <string>


用于测试请求报文的指定首部的结尾部分是否符合<string>指定的模式。例如,下面的例子用记测试请求是否为


其它的creterion:

  dst_port, src_port, src, dst, url_beg, url_end, path, url_reg, path_reg

动静分离

[root@node200 ~]# vim /etc/haproxy/haproxy.cfg

 63 frontend  main

 64     bind *:80

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

 66     acl url_static       path_end       -i .jpg .gif .png .css .js

 67 mode http

 68     use_backend static          if url_static

 69     default_backend             appsrvs

 70 #---------------------------------------------------------------------

 71 # static backend for serving up p_w_picpaths, stylesheets and such

 72 #---------------------------------------------------------------------

 73 backend static

 74 balance roundrobin

 75 server static1 192.168.112.131 check

 76 server static2 192.168.112.120 check

 77 

 78 backend appsrvs 

 79     balance     roundrobin

 80     mode http

 81     option httpchk

 82     cookie SERVERID insert indirect nocache    

 83     server  node2 192.168.112.130:80 check cookie node2

 84     server  node3 192.168.112.140:80 check cookie node3


reqadd:客户端请求报文发送至后端服务器,在http尾部添加首部,目的时对后端服务器的日志,程序调用。

reqadd <string> [{if|unless} <cond>]

acl is-ssl dst_port 81

regadd X-proto:\ is ssl


rsp <string> [{if|unless} <cond>]

从后端服务器响应客户端时,在http添加首部在响应报文。

acl is-ssl dst_port 81

regadd X-proto:\ is ssl


构建响应报文

[root@node200 ~]# vim /etc/haproxy/haproxy.cfg

 63 frontend  main

 64     bind *:80

 65     rspadd X-Via:\ zye  

 67 #     acl url_static       path_beg       -i /static /p_w_picpaths /javascri    pt /stylesheets

 68 #    acl url_static       path_end       -i .jpg .gif .png .css .js

 69 

 70 mode http

 71   #  use_backend static          if url_static

 72     default_backend             appsrvs

 73 #---------------------------------------------------------------------

 74 # static backend for serving up p_w_picpaths, stylesheets and such

 75 #---------------------------------------------------------------------

 76 #backend static

 77 #balance roundrobin

 78 #server static1 192.168.112.131 check

 79 #server static2 192.168.112.120 check

 80 

wKiom1ZWtvWQBSVIAAIXbqLFaKw686.jpg



配置案例


1. http服务器配置示例


#---------------------------------------------------------------------

# Global settings

#---------------------------------------------------------------------

global

    # to have these messages end up in /var/log/haproxy.log you will

    # need to:

    #

    # 1) configure syslog to accept network log events.  This is done

    #    by adding the '-r' option to the SYSLOGD_OPTIONS in

    #    /etc/sysconfig/syslog

    #

    # 2) configure local2 events to go to the /var/log/haproxy.log

    #   file. A line like the following can be added to

    #   /etc/sysconfig/syslog

    #

    #    local2.*                       /var/log/haproxy.log

    #

    log         127.0.0.1 local2


    chroot      /var/lib/haproxy

    pidfile     /var/run/haproxy.pid

    maxconn     4000

    user        haproxy

    group       haproxy

    daemon


defaults

    mode                    http

    log                     global

    option                  httplog

    option                  dontlognull

    option http-server-close

    option forwardfor       except 127.0.0.0/8

    option                  redispatch

    retries                 3

    timeout http-request    10s

    timeout queue           1m

    timeout connect         10s

    timeout client          1m

    timeout server          1m

    timeout http-keep-alive 10s

    timeout check           10s

    maxconn                 30000


listen stats

    mode http

    bind 0.0.0.0:1080

    stats enable

    stats hide-version

    stats uri     /haproxyadmin?stats

    stats realm   Haproxy\ Statistics

    stats auth    admin:admin

    stats admin if TRUE



frontend http-in

    bind *:80

    mode http

    log global

    option httpclose

    option logasap

    option dontlognull

    capture request  header Host len 20

    capture request  header Referer len 60

    default_backend servers


frontend healthcheck

    bind :1099

    mode http

    option httpclose

    option forwardfor

    default_backend servers


backend servers

  balance roundrobin

    server websrv1 192.168.10.11:80 check maxconn 2000

    server websrv2 192.168.10.12:80 check maxconn 2000

    



2. 负载均衡MySQL服务的配置示例


#---------------------------------------------------------------------

# Global settings

#---------------------------------------------------------------------

global

    # to have these messages end up in /var/log/haproxy.log you will

    # need to:

    #

    # 1) configure syslog to accept network log events.  This is done

    #    by adding the '-r' option to the SYSLOGD_OPTIONS in

    #    /etc/sysconfig/syslog

    #

    # 2) configure local2 events to go to the /var/log/haproxy.log

    #   file. A line like the following can be added to

    #   /etc/sysconfig/syslog

    #

    #    local2.*                       /var/log/haproxy.log

    #

    log         127.0.0.1 local2


    chroot      /var/lib/haproxy

    pidfile     /var/run/haproxy.pid

    maxconn     4000

    user        haproxy

    group       haproxy

    daemon


defaults

    mode                    tcp

    log                     global

    option                  httplog

    option                  dontlognull

    retries                 3

    timeout http-request    10s

    timeout queue           1m

    timeout connect         10s

    timeout client          1m

    timeout server          1m

    timeout http-keep-alive 10s

    timeout check           10s

    maxconn                 600


listen stats

    mode http

    bind 0.0.0.0:1080

    stats enable

    stats hide-version

    stats uri     /haproxyadmin?stats

    stats realm   Haproxy\ Statistics

    stats auth    admin:admin

    stats admin if TRUE



frontend mysql

    bind *:3306

    mode tcp

    log global

    default_backend mysqlservers


backend mysqlservers

    balance leastconn

    server dbsrv1 192.168.10.11:3306 check port 3306 intval 2 rise 1 fall 2 maxconn 300

    server dbsrv2 192.168.10.12:3306 check port 3306 intval 2 rise 1 fall 2 maxconn 300





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章