找回密码
 注册
查看: 5847|回复: 1

haproxy配置文件详解

[复制链接]

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
发表于 2016-8-18 09:45:39 | 显示全部楼层 |阅读模式

haproxy配置文件详解

    写在前面的话,本文档部分信息来自网络,同时参考过官方的架构指南,在此非常感谢zero提供的文档,以及在学习haproxy过程中的帮助。

  • #/usr/local/sbin/haproxy -f /etc/haproxy/haproxy.cfg -st `cat /var/run/haproxy.pid`
  •        ####################全局配置信息########################
  •        #######参数是进程级的,通常和操作系统(OS)相关#########
  • global
  •        maxconn 20480                   #默认最大连接数
  •        log 127.0.0.1 local3            #[err warning info debug]
  •        chroot /var/haproxy             #chroot运行的路径
  •        uid 99                          #所属运行的用户uid
  •        gid 99                          #所属运行的用户组
  •        daemon                          #以后台形式运行haproxy
  •        nbproc 1                        #进程数量(可以设置多个进程提高性能)
  •        pidfile /var/run/haproxy.pid    #haproxy的pid存放路径,启动进程的用户必须有权限访问此文件
  •        ulimit-n 65535                  #ulimit的数量限制
  •        #####################默认的全局设置######################
  •        ##这些参数可以被利用配置到frontend,backend,listen组件##
  • defaults
  •        log global
  •        mode http                       #所处理的类别 (#7层 http;4层tcp  )
  •        maxconn 20480                   #最大连接数
  •        option httplog                  #日志类别http日志格式
  •        option httpclose                #每次请求完毕后主动关闭http通道
  •        option dontlognull              #不记录健康检查的日志信息
  •        option forwardfor               #如果后端服务器需要获得客户端真实ip需要配置的参数,可以从Http Header中获得客户端ip  
  •        option redispatch               #serverId对应的服务器挂掉后,强制定向到其他健康的服务器  
  •        option abortonclose             #当服务器负载很高的时候,自动结束掉当前队列处理比较久的连接
  •        stats refresh 30                #统计页面刷新间隔
  •        retries 3                       #3次连接失败就认为服务不可用,也可以通过后面设置
  •        balance roundrobin              #默认的负载均衡的方式,轮询方式
  •       #balance source                  #默认的负载均衡的方式,类似nginx的ip_hash
  •       #balance leastconn               #默认的负载均衡的方式,最小连接
  •        contimeout 5000                 #连接超时
  •        clitimeout 50000                #客户端超时
  •        srvtimeout 50000                #服务器超时
  •        timeout check 2000              #心跳检测超时
  •        ####################监控页面的设置#######################
  • listen admin_status                    #Frontend和Backend的组合体,监控组的名称,按需自定义名称
  •         bind 0.0.0.0:65532             #监听端口
  •         mode http                      #http的7层模式
  •         log 127.0.0.1 local3 err       #错误日志记录
  •         stats refresh 5s               #每隔5秒自动刷新监控页面
  •         stats uri /admin?stats         #监控页面的url
  •         stats realm itnihao\ itnihao   #监控页面的提示信息
  •         stats auth admin:admin         #监控页面的用户和密码admin,可以设置多个用户名
  •         stats auth admin1:admin1       #监控页面的用户和密码admin1
  •         stats hide-version             #隐藏统计页面上的HAproxy版本信息  
  •         stats admin if TRUE            #手工启用/禁用,后端服务器(haproxy-1.4.9以后版本)
  •        errorfile 403 /etc/haproxy/errorfiles/403.http
  •        errorfile 500 /etc/haproxy/errorfiles/500.http
  •        errorfile 502 /etc/haproxy/errorfiles/502.http
  •        errorfile 503 /etc/haproxy/errorfiles/503.http
  •        errorfile 504 /etc/haproxy/errorfiles/504.http
  •        #################HAProxy的日志记录内容设置###################
  •        capture request  header Host           len 40
  •        capture request  header Content-Length len 10
  •        capture request  header Referer        len 200
  •        capture response header Server         len 40
  •        capture response header Content-Length len 10
  •        capture response header Cache-Control  len 8
  •      
  •        #######################网站监测listen配置#####################
  •        ###########此用法主要是监控haproxy后端服务器的监控状态############
  • listen site_status
  •        bind 0.0.0.0:1081                    #监听端口
  •        mode http                            #http的7层模式
  •        log 127.0.0.1 local3 err             #[err warning info debug]
  •        monitor-uri /site_status             #网站健康检测URL,用来检测HAProxy管理的网站是否可以用,正常返回200,不正常返回503
  •        acl site_dead nbsrv(server_web) lt 2 #定义网站down时的策略当挂在负载均衡上的指定backend的中有效机器数小于1台时返回true
  •        acl site_dead nbsrv(server_blog) lt 2
  •        acl site_dead nbsrv(server_bbs)  lt 2  
  •        monitor fail if site_dead            #当满足策略的时候返回503,网上文档说的是500,实际测试为503
  •        monitor-net 192.168.16.2/32          #来自192.168.16.2的日志信息不会被记录和转发
  •        monitor-net 192.168.16.3/32
  •        ########frontend配置############
  •        #####注意,frontend配置里面可以定义多个acl进行匹配操作########
  • frontend http_80_in
  •        bind 0.0.0.0:80      #监听端口,即haproxy提供web服务的端口,和lvs的vip端口类似
  •        mode http            #http的7层模式
  •        log global           #应用全局的日志配置
  •        option httplog       #启用http的log
  •        option httpclose     #每次请求完毕后主动关闭http通道,HA-Proxy不支持keep-alive模式
  •        option forwardfor    #如果后端服务器需要获得客户端的真实IP需要配置次参数,将可以从Http Header中获得客户端IP
  •        ########acl策略配置#############
  •        acl itnihao_web hdr_reg(host) -i ^(www.itnihao.cn|ww1.itnihao.cn)$   
  •        #如果请求的域名满足正则表达式中的2个域名返回true -i是忽略大小写
  •        acl itnihao_blog hdr_dom(host) -i blog.itnihao.cn
  •        #如果请求的域名满足www.itnihao.cn返回true -i是忽略大小写
  •        #acl itnihao    hdr(host) -i itnihao.cn
  •        #如果请求的域名满足itnihao.cn返回true -i是忽略大小写
  •        #acl file_req url_sub -i  killall=
  •        #在请求url中包含killall=,则此控制策略返回true,否则为false
  •        #acl dir_req url_dir -i allow
  •        #在请求url中存在allow作为部分地址路径,则此控制策略返回true,否则返回false
  •        #acl missing_cl hdr_cnt(Content-length) eq 0
  •        #当请求的header中Content-length等于0时返回true
  •        ########acl策略匹配相应#############
  •        #block if missing_cl
  •        #当请求中header中Content-length等于0阻止请求返回403
  •        #block if !file_req || dir_req
  •        #block表示阻止请求,返回403错误,当前表示如果不满足策略file_req,或者满足策略dir_req,则阻止请求
  •        use_backend  server_web  if itnihao_web
  •        #当满足itnihao_web的策略时使用server_web的backend
  •        use_backend  server_blog if itnihao_blog
  •        #当满足itnihao_blog的策略时使用server_blog的backend
  •        #redirect prefix http://blog.itniaho.cn code 301 if itnihao
  •        #当访问itnihao.cn的时候,用http的301挑转到http://192.168.16.3
  •        default_backend server_bbs
  •        #以上都不满足的时候使用默认server_bbs的backend
  •        ##########backend的设置##############
  •        #下面我将设置三组服务器 server_web,server_blog,server_bbs
  • ###########################backend server_web#############################
  • backend server_web
  •        mode http            #http的7层模式
  •        balance roundrobin   #负载均衡的方式,roundrobin平均方式
  •        cookie SERVERID      #允许插入serverid到cookie中,serverid后面可以定义
  •        option httpchk GET /index.html #心跳检测的文件
  •        server web1 192.168.16.2:80 cookie web1 check inter 1500 rise 3 fall 3 weight 1  
  •        #服务器定义,cookie 1表示serverid为web1,check inter 1500是检测心跳频率rise 3是3次正确认为服务器可用,
  •        #fall 3是3次失败认为服务器不可用,weight代表权重
  •        server web2 192.168.16.3:80 cookie web2 check inter 1500 rise 3 fall 3 weight 2
  •        #服务器定义,cookie 1表示serverid为web2,check inter 1500是检测心跳频率rise 3是3次正确认为服务器可用,
  •        #fall 3是3次失败认为服务器不可用,weight代表权重
  • ###################################backend server_blog###############################################
  • backend server_blog
  •        mode http            #http的7层模式
  •        balance roundrobin   #负载均衡的方式,roundrobin平均方式
  •        cookie SERVERID      #允许插入serverid到cookie中,serverid后面可以定义
  •        option httpchk GET /index.html #心跳检测的文件
  •        server blog1 192.168.16.2:80 cookie blog1 check inter 1500 rise 3 fall 3 weight 1  
  •        #服务器定义,cookie 1表示serverid为web1,check inter 1500是检测心跳频率rise 3是3次正确认为服务器可用,fall 3是3次失败认为服务器不可用,weight代表权重
  •        server blog2 192.168.16.3:80 cookie blog2 check inter 1500 rise 3 fall 3 weight 2
  •         #服务器定义,cookie 1表示serverid为web2,check inter 1500是检测心跳频率rise 3是3次正确认为服务器可用,fall 3是3次失败认为服务器不可用,weight代表权重
  • ###################################backend server_bbs###############################################
  • backend server_bbs
  •        mode http            #http的7层模式
  •        balance roundrobin   #负载均衡的方式,roundrobin平均方式
  •        cookie SERVERID      #允许插入serverid到cookie中,serverid后面可以定义
  •        option httpchk GET /index.html #心跳检测的文件
  •        server bbs1 192.168.16.2:80 cookie bbs1 check inter 1500 rise 3 fall 3 weight 1  
  •        #服务器定义,cookie 1表示serverid为web1,check inter 1500是检测心跳频率rise 3是3次正确认为服务器可用,fall 3是3次失败认为服务器不可用,weight代表权重
  •        server bbs2 192.168.16.3:80 cookie bbs2 check inter 1500 rise 3 fall 3 weight 2
  •         #服务器定义,cookie 1表示serverid为web2,check inter 1500是检测心跳频率rise 3是3次正确认为服务器可用,fall 3是3次失败认为服务器不可用,weight代表权重
    $ C  e* i2 v0 j

以上为基本的配置文件,下面会对这个配置一一说明和应用

* c$ D% c9 t  J( P4 s5 _. z4 @

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2021-7-12 13:55:47 | 显示全部楼层
常用配置选项:
OPTION 选项:
option httpclose :HAProxy会针对客户端的第一条请求的返回添加cookie并返回给客户端,客户端发送后续请求时会发送
                             此cookie到HAProxy,HAProxy会针对此cookie分发到上次处理此请求的服务器上,如果服务器不能忽略
                             此cookie值会影响处理结果。如果避免这种情况配置此选项,防止产生多余的cookie信息。
option forwardfor :如果服务器上的应用程序想记录发起请求的客户端的IP地址,需要在HAProxy上配置此选项,这样
                               HAProxy会把客户端的IP信息发送给服务器,在HTTP请求中添加"X-Forwarded-For"字段。
option originalto :如果服务器上的应用程序想记录发起请求的原目的IP地址,需要在HAProxy上配置此选项,这样HAProxy
                              会添加"X-Original-To"字段。
option dontlognull :保证HAProxy不记录上级负载均衡发送过来的用于检测状态没有数据的心跳包。
# }0 Y( R% g8 A) s8 d5 i( p
BALANCE 选项:
balance source :如果想让HAProxy按照客户端的IP地址进行负载均衡策略,即同一IP地址的所有请求都发送到同一服务
                             器时,需要配置此选项。
balance roundrobin :HAProxy把请求轮流的转发到每一个服务器上,依据每台服务器的权重,此权重会动态调整。最常
                                   见的默认配置。
( j5 H- \7 |! Z9 ?. Q
COOKIE 选项:
cookie JSESSIONID prefix :如果客户端只支持一个cookie,并且服务器上的应用程序已经对返回设置了cookie,
                                               HAProxy设置此选项可以改写应用程序设置的cookie信息,把服务器的信息添加到原cookie中去。
cookie SERVERID indirect :HAProxy会删除添加的cookie信息,避免此cookie信息发送到服务器。
cookie SERVERID rewrite :
cookie SERVERID insert :
cookie SERVERID insert nocache :
cookie SERVERID insert postonly :

* C* V9 k$ Q- X+ v0 S# p4 u1 H
option httpclose& C6 p8 X  W* P3 U% H' L( \$ Y
no option httpclose2 k$ U& P- g8 k* V8 _
  Enable or disable passive HTTP connection closing   启用或禁止消极的HTTP连接关闭3 i1 Y+ Z4 z0 l& I$ F3 R
  May be used in sections :   defaults | frontend | listen | backend7 q" V3 J6 R7 q) |
                                 yes   |    yes   |   yes  |   yes* c9 p* ]5 L  c  o
  Arguments : none
% s  P+ e$ A6 e. g% E  + h1 l' V) S) x5 S2 t4 B# p
  默认的,客户端与服务端的通讯,HAProxy只做分析、日志和分析每个连接的第一个request。如果设置了 "option7 T5 x& k9 U/ @$ L- j% i
  httpclose" , 则会检查双向的http头是否有"Connection: close",如果没有则自动添加,使每个客户端或服务端在每次传输后,都会主动关闭TCP连接,使HTTP传输处于HTTP close模式下。任何 "Connection" 头如果不是"close",都会被移除。
0 i5 I8 O+ `7 T& J: S
3 [' v% b  @8 V1 A" Y  O! I# ]" ~  很少会有服务器不正确的忽略掉头,即使收到"Connection: close"也不关闭连接,否则就是不兼容HTTP 1.0浏览器标准。 如果发生这种情况,可以使用"option forceclose",在服务端响应后主动关闭请求连接。选项 "forceclose"还可以及早释放服务连接,而不必等到客户端的应答确认。% ~( c$ F4 k/ R8 P: F  m8 _$ ^

& ~, z6 ]' m; j+ Y9 z/ y1 `  这个选项可以设置在frontend或backend上,只要其上可以建立连接。如果同时设置了"option forceclose",那么它比"httpclose"优先。如果同时设置了 "option http-server-close",则会实现"option forceclose"的效果。
option forceclose
2 [% k) \( M- y0 O  dno option forceclose
  Enable or disable active connection closing after response is transferred.     启用或禁止response后的主动关闭连接
  May be used in sections :   defaults | frontend | listen | backend
! a+ c# @: F" H                                 yes   |    yes   |   yes  |   yes
' ]0 f# K! l" L  r$ r" ?3 R
  Arguments : none
; @3 d; L: X  L5 g0 }0 I        有的HTTP服务器收到"option httpclose"设置的"Connection: close",也不会关闭连接,如果客户端也不关闭,连接会 一直打开,直到超时。这会造成服务器上同一时段内的大量连接,日志中也会显示较高的全局会话时间。
        此时,可以使用 "option forceclose",当完成响应时,立即关闭对外的服务通道。该选项隐式打开httpclose选项。需要注意,该选项允许解析完整的request 和 response,所以可以很快关闭至服务器的连接,比httpclose更早释放一些资源。& v. h6 [7 n& L3 g9 n7 C/ l' e4 \
        如果同时启用了"option http-pretend-keepalive",虽然会禁止发送 "Connection: close"头,但是依然会在整个response被接收后,关闭连接。% D2 t6 a7 E9 ^! f' ]7 {4 C' O

$ D0 }9 T# T7 k0 i8 D1 Uoption http-server-close
% I' p) G7 X: fno option http-server-close
! T9 N, I" A$ M# p0 V4 E  Enable or disable HTTP connection closing on the server side  启用或禁止关闭服务端的HTTP连接* o5 b+ a4 H: m8 a# J; g- Q& @
  May be used in sections :   defaults | frontend | listen | backend8 o% D3 [6 o, S) K0 d4 i" h
                                 yes   |    yes   |   yes  |   yes, q) S7 E6 Q' d
  Arguments : none$ h8 s" i+ W* R7 x" V9 a+ l' S
    默认的,客户端与服务端通讯,haproxy 只是分析、记日志,并处理每个连接的第一个请求。该选项设置server端为HTTP 连接关闭模式,并支持客户端为HTTP keep-alive的pipelining模式。提供了最低的客户端延迟和最快的服务端会话重用,以节省服务资源,类似"option forceclose"。还允许无keepalive能力的服务端在keep-alive模式下为客户端提供服务,但是需要符合 RFC2616。需要注意的是,有些服务器遇到"Connection: close" 时并不总是执行关闭,那么keep-alive 则无法使用,解决方法是启用 "option http-pretend-keepalive".5 m9 s8 e4 ?6 v2 T0 i0 n7 L6 J

' ~+ j  N$ P$ g( {  d, Y) r     目前,日志无法指明请求是否来自同一会话;日志中的接收日期为前一个请求的结束;请求时间为新请求的等待时间;keep-alive request time 存活请求时间为超时时间,绑定 "timeout http-keep-alive" 或 "timeout http-request"的设置。
; y+ ?4 [2 t' ]# L( h/ N     这个操作可以设置在frontend或backend上,只要其上可以建立连接。需要注意的是,这个选项可以与 "option httpclose"结合, 但 "option httpclose"优先级更高,结合后基本实现了forceclose的效果。% N$ _% `0 {* M) G; c* S

. a- r% B" L4 C7 ]! k4 Noption http-pretend-keepalive (http-假装-长连接)
- M) E% q# X" q0 f; {no option http-pretend-keepalive" k2 C5 p6 m* z) f( }; ^" i! C
  Define whether haproxy will announce keepalive to the server or not  定义 haproxy 与服务器是否是 keepalive 的。
1 M" Z: x+ }* n: q  May be used in sections :   defaults | frontend | listen | backend
9 C! A4 F4 `. N* m                                 yes   |    yes   |   yes  |   yes2 ^! {0 v7 ?' V; x
  Arguments : none5 F" h' `, [; @/ o( V- X% j9 U2 Q
    当声明了 "option http-server-close" 或 "option forceclose", haproxy会在给server的request头中添加 "Connection: close" 。然而有些服务器看到这个头,会返回未知长度的response,并自动避免chunked encoding,其实这是不对的。它会阻止haproxy保持客户端长连接,还会使客户端或缓存接收了未完成的响应,却认为响应结束了。
: z) n) o- ^& n3 p    设置 "option http-pretend-keepalive", haproxy会在服务器端保持长连接,服务端则不会出现前面的问题。当 haproxy 获取了完整的response, 才会以类似forceclose的方式关闭服务端。这样客户端得到一个普通的响应,连接也在服务端被正常关闭。
$ U% E, P( J; n6 d2 W    建议不将其设为默认值,因为大部分服务器会在发送完最后一个包之后更高效的关闭连接,并释放缓存,而且网络上的数据包也会略微降低整体的峰值性能。但是启用该选项,haproxy会略微少做一些工作。所以如果haproxy在整个架构中是个瓶颈,可以启用该操作,以节省CPU。5 P7 Q* }' E( R4 l9 v% r! j) _( ?( k
/ s9 e. k; e3 L% z2 P# c1 Q) `8 X
     这个选项可以设置在frontend或backend上,只要其上可以建立连接。这个选项可以与 "option httpclose"结合, 使服务端keepalive,客户端close,但并不建议这样做。
4 i6 u! ~" i/ V, h" p: x
balance <algorithm> [ <arguments> ]2 p8 O/ F3 R$ ^9 \
balance url_param <param> [check_post [<max_wait>]]
, q$ L0 b& y- u2 n* ?  定义选择后端服务的负载均衡算法7 A- N0 y3 y  I5 U, s- Q9 w; c
  May be used in sections :   defaults | frontend | listen | backend
+ {0 r4 W6 B3 X- Q  @5 m/ ]                                               yes   |    no    |   yes  |   yes
; r2 g+ f/ v1 m* m5 N# t$ b! Z1 _  Arguments :% Z% ]4 X9 v4 {
    <algorithm> 是负载均衡时选择服务器的算法,没有持续信息时可用,或连接重定向到另一个服务器。<algorithm> 可以是以下几种:
6 b1 Q4 ~/ i8 f4 [  k( c      roundrobin  每个服务器根据权重轮流使用,如果服务器的处理时间平均分布,这是最流畅和公平的算法。算法是动态的,对于实例启动慢的服务器的权重会在运行中调整。每个backend的活动服务器在设计上限制为4128个。在一些大的群里面, 当服务器很短的宕机后恢复回来,有时会有几百个请求被重新整合到群当中,并开始接收处理。尽管很少发生,但是很正常。这也说明了有机会监视它们,所以不必担心。
: x" a$ Z8 s' I$ N% Z- f, f0 |  z+ q# D" K( y: S
      static-rr  每个服务器根据权重轮流使用,类似roundrobin,但它是静态的,意味着运行时修改权重是无效的。另一方面,它对服务器的数量没有设计上的限制,服务器启动后便会立即进到群中,整个分发方案会重新计算。这会略微降低CPU的运行(约1%)。
( g: h& r# c3 @1 K- I  u4 L8 t
; B0 y3 p  d) Y- u' M' q      leastconn  连接数最低的服务器优先接收连接。Round-robin用于负载相同的服务器,使每台服务器都被使用。leastconn建议用于长会话服务,例如LDAP, SQL, TSE等,而不是很适合短会话协议,如HTTP。算法是动态的,对于实例启动慢的服务器的权重会在运行中调整。
$ m% w) J: ?% S, [/ G. q* a7 C2 }2 S4 K5 L! m0 F" X0 D
      source    对源IP地址进行哈希,用可用服务器的权重总数除以哈希值,根据结果进行分配。只要服务器正常,同一个客户端IP地址总是访问同一台服务器。如果哈希的结果随可用服务器数量而变化,那么有的客户端会定向到不同的服务器。该算法一般用于不能插入cookie的TCP模式。它还可以用于广域网上,为拒绝使用会话cookie的客户端提供最有效的粘连。该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是算法会根据"hash-type"的变化做调整。; z' U) t1 H' d% S# h* W1 n
. J- n# N- E3 H
      uri        对URI左端(问号之前)进行哈希,用可用服务器的权重总数除以哈希值,根据结果进行分配。只要服务器正常,同一个URI地址总是访问同一台服务器。一般用于代理缓存和反病毒代理,以最大限度的提高缓存的命中率。该算法只能用于HTTP后端。该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是算法会根据"hash-type"的变化做调整。' K) L" g! m) [1 B
                  算法支持两个可选参数"len" 和 "depth", 都是后跟正整数。“len”参数指定算法只处理URI从头开始的字符数,据此计算哈希。因为大多URI以"/"开头,所以"len"最好不要设为1。"depth" 参数指定URI中最大的路径深度,据此计算哈希。请求中的每个斜线为一级。如果同时声明了这两个参数,则截取URI时必须同时满足。
3 j) T6 ]3 h$ M. Z, m3 N. s. `$ X$ q
      url_param  在HTTP GET请求的查询串中查找<param>中指定的URL参数。$ B! T6 H0 ?5 l6 n
                 若使用了修饰符"check_post",如果在URL问号('?')后面的查询串中找不到参数,就会搜索HTTP POST 请求实体。或者在指定的一些字节后面尝试搜索消息体。如果搜索不到实体, 则使用round robin算法。例如,假设客户端总是在前128个字节发送LB参数,就可以指定它。默认为48。如果到达网关的字节数量不够,实体数据是检索不到的,至少有:(default/max_wait, Content-Length or first chunk length)。如果Content-Length没有或为0,就不需要等待客户端发送更多的数据。当Content-Length有值且大于<max_wait>,则等待仅限于<max_wait>,并假设有足够的数据用于搜索参数的存在。万一Transfer-Encoding被用了,则只能检查第一个块。如果参数值被块边界分隔开,则只能随机均衡负载了。
$ s+ e7 j6 P8 O$ p* g  [( a                  如果参数后面跟着 ('=') 和一个值,则可以根据这个值进行哈希,用可用服务器的权重总数除以哈希值,根据结果进行分配。
3 t. x8 q/ R. u: }. _0 E                  还可用于跟踪请求中的用户身份,只要服务器正常,同一个用户ID的请求总是发给同一台服务器。如果没有参数或参数没有值,则使用轮询算法。该算法只用于HTTP后端。该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是算法会根据"hash-type"的变化做调整。
; |5 U0 @: C# ?8 n9 [" C9 w0 Y0 R; ]2 f: Z0 s( t
      hdr(name)  在每个HTTP请求中查找HTTP头<name>。与ACL函数'hdr()'一样。括号括起来的头名字不区分大小写。如果缺少头或头没有任何值,则使用roundrobin算法代替。                  : D3 w2 b" l7 a0 Y( t! z* Z9 s- w3 p
                       启用参数'use_domain_only',哈希算法将只用于一些类似'Host'的特定头的主域部分。例如主机值"haproxy.1wt.eu",则只考虑 "1wt"。该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是算法会根据"hash-type"的变化做调整。
( G. T" e- Q2 l2 L7 d$ W3 J
7 s8 D4 ^5 U) s) M/ D0 O+ p      rdp-cookie% T. }1 \' c# X/ U* T" M. S) W( \
      rdp-cookie(name)
9 o& \) I" f: F. l7 K7 `6 i                  为每个进来的TCP请求查询并哈希RDP cookie <name> (或“mstshash”如果省略) 。与ACL函数 'req_rdp_cookie()'一样,name不区分大小写。该机制用于退化的持久模式,可以使同一个用户(或同一个会话ID)总是发送给同一台服务器。如果没有cookie, 则使用roundrobin算法代替。7 B( O9 K8 L. M8 |
                  必须注意该声明要生效,前端必须确保在请求缓冲中已经有RDP cookie,所以必须使用规则tcp-request content accept' 和ACL 'req_rdp_cookie_cnt'相结合。
1 l# x% ]1 H- t6 }2 r$ S/ T, l                  该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是算法会根据"hash-type"的变化做调整。
' `# Z! a( M. p% ?
, t! P; a# P9 k( O! T, }  q" y5 A& ?    <arguments> 是用于一些算法的可选参数列表,目前只有"url_param" 和 "uri" 用到,例如:8 f. W( f8 V, s# F# ^" I
                balance uri [len <len>] [depth <depth>]
) O' z) D- N# _2 A                balance url_param <param> [check_post [<max_wait>]]
- U$ Z1 P' r4 ]; n2 r
) W/ @  r& C  }' |9 P- @& w  如果没有其他算法、模式或选项的设置,后端的负载均衡算法默认为roundrobin。每个后端只能设置一种。
* V/ q7 n! v" U0 T9 M4 k3 ]  Examples :7 _8 t% q0 p  V9 d# V0 D
        balance roundrobin
! F. ?5 a1 L8 z1 K# Q* e4 L        balance url_param userid0 B% T5 ^: W+ f4 u( `
        balance url_param session_id check_post 64
& b2 G5 ]: K( z. j" b$ p. _  ]        balance hdr(User-Agent)5 }- i& v$ z4 B
        balance hdr(host)
$ A( O5 }+ }' `) x* o- e9 B( D+ l: p        balance hdr(Host) use_domain_only
, w7 i: Y3 d# v4 \0 H3 r* Q, w" Z' n# b
9 x% D6 {+ ]# _# |- P  注意:  以下的警告和限制是使用“check_post“扩展和”url_param”所必须考虑 :# c4 C+ h$ B+ L1 V( Z
    - 所有POST请求都要考虑,因为在包含二进制数据的体或实体中,没有办法决定是否会找到参数。因此需要另一种方法,限制POST请求的体中不含有URL参数 (见 acl reqideny http_end)
    - 大于请求缓冲大小的 <max_wait> 值是没用的。在build时设置缓冲大小,默认16KB。
1 G. ]6 B, F' F) y    - 不支持Content-Encoding, 参数搜索会失败;负载均衡会改用 Round Robin。' [! l7 P1 Z+ w9 F) f2 R
    - 预计: 不支持100-continue,负载均衡会改用 Round Robin。
* a8 E4 C5 ]/ a/ d    - Transfer-Encoding (RFC2616 3.6.1) 只在第一个块中支持。如果在第一个块中的参数值不完整,选择的服务器就没有定义。(实际上取决于在第一个块中定义的有多小)
; y% B, h+ B  f: R. W+ U/ M. q; ]    - 该特性不支持生成100, 411 或 501 响应。' {0 g/ ~/ O" y3 K+ ~) n( N
    -  有的情况下,需要"check_post"只是要查看整个消息体的内容。检查一般会停在任意数量的空格(LWS: linear: i) g- Q$ w. c0 }  A) \4 S
      white space)或控制符上,表示这可能是一个URL参数列表。这可能不是一个关于SGML的类型消息体。( _& E, e3 ~0 ]

! U3 ]: f! X! R; H  See also : "dispatch", "cookie", "appsession", "transparent", "hash-type" and "http_proxy".
" X7 h4 B" ?* ^' D+ @* ~% @
hash-type <method>. w* O& Z; _2 D' a* F  q. s
  将哈希映射到服务器的方法。Specify a method to use for mapping hashes to servers& T! D$ |: h$ L5 Q5 @; c  X/ h1 Y
  May be used in sections :   defaults | frontend | listen | backend3 p% y' \& S  s. \* X8 a
                                               yes   |    no    |   yes  |   yes% f" k5 b% q8 K2 Q$ ~+ j4 s
  Arguments :
& P# b0 h7 k1 `, W2 ^, n$ P    map-based  哈希表是包含所有在线服务器的静态数组。哈希结果很平滑,并考虑了权重,但是会忽略服务器启动时的权重变化,也就是说不能慢启动。另外,服务器是根据数组中的位置所选择的,所以服务器数量变化时,大部分映射也会变化。当一台服务器启动或关闭,或服务器加入到群中,大部分连接会再分配给不同的服务器,这对有缓存的实例会比较麻烦。
    consistent  哈希表是由每个服务器构成的树,会在树上查找哈希Key,并选择最近的服务器。这种哈希是动态的,支持服务器启动时修改权重,所以可以慢启动。它有一个好处是当服务器启动或关闭时,只有其本身的关系被移除,当服务器加入群时,只有一小部分的映射会被重新分配,所以是一个比较理想的支持缓存的算法。但是根据其原理,算法不会非常平滑,有时候必须调整服务器的权重或ID来获得更平衡的分布。要保持多次负载均衡时的相同分布,服务器ID是绝对不能变的。(roloand:haproxy根据服务器的ID初始化其哈希值)- `' l7 v% D# j  V  H7 C, I/ @
   默认值是"map-based",建议大部分情况下使用。2 [! @; i! M& t" {9 l* I2 i

4 p/ }) _; o; l, x& y# I* R1 b$ @  See also : "balance", "server"

7 G! |3 V2 G. S3 wdispatch <address>:<port>& S+ B- `+ g( G6 o4 H8 H, n
  设置一个默认的服务器地址  A( e( ~" u- K6 Q) A& `
  May be used in sections :   defaults | frontend | listen | backend2 l8 s5 ?- P3 J7 Y8 ?
                                               no    |    no    |   yes  |   yes9 k' E) T9 f8 K. Q5 I- r5 G6 u3 _4 `
  Arguments : none* w1 O* N* T# [( p8 p
    <address> 默认服务器的IPv4地址,也可以是主机名称,名称只在启动时解析为IP地址。) m0 Y3 z0 G7 p2 U. N
    <ports>  端口号,所有连接都会发送给这个端口,但是不允许像其他服务器一样使用端口偏移(port offsets)。
   "dispatch"关键字指定了一个默认的服务器,用于无可用服务器时的连接的处理。过去常用于前传非持久连接给后备负载均衡器,由于定义简单,还用于简单的TCP中继(TCP relays)。 建议对于明确的连接处理,应使用"server"直接声明。
====================
一:Global parameters- O0 `* M/ v' j) ?$ ]+ D: ?
* Process management and security
5 E! {; z% A, v( v- chroot 改变当前工作目录
6 X3 }1 G$ T3 l  R) i5 l. y- daemon 运行方式为后台工作1 }  C, q. G* ]+ J/ \
- user - group 工作用户和组1 ^2 _/ K) Z" W! z9 c# v
-log <address> <facility>日志输出设备
* L; i5 Z1 A/ v9 G% ?, n1 \- nbproc 创建工作的进程数目
6 i) A! Q4 I. a9 v5 J-pidfile pid文件位置6 e+ p2 e! {1 v+ n0 L) _
- ulimit-n 设置每个进程的可用的最大文件描述符
7 m0 B( B( V2 n1 o$ _( G; l  H( V: `- stats 创建监控所用的套接字目录
  e3 _; ^& y3 A! L: G- g- node 创建另外一个节点名字共用一个IP地址,用来识别哪个节点在处理流量( ~4 `! B9 B3 O
- description 描述实例的名称1 d" `  f1 w9 P) ^# E$ ?# n: s" p1 h
maxconn <number> 每个进程可用的最大连接数7 m* G  r4 H' X" @0 [2 r$ B( |
maxpipes <number>  每个进程可用的最大管道数7 ^4 t! _2 a( I8 L8 U: x$ Z
nokqueue  nopoll  nosepoll nosplice  禁用这些功能
0 c( H% i2 B) c- V; Q9 I3 [/ s* H* Ospread-checks <0..50, in percent>  health check 的时间间隔5 ~6 i% \1 w0 w% h' r  h/ U
tune.bufsize <number>
+ }/ p) i/ _3 k2 |tune.maxaccept <number>
$ ^/ m6 i( ?$ E( vtune.maxpollevents <number>
4 Q7 O* `6 f& W. ^  @tune.maxrewrite <number> ' _1 z" N2 H* A2 k: ~+ Q) [
tune.rcvbuf.client <number>
. p; H( A8 A2 H' b5 p7 ?+ stune.rcvbuf.server <number>
% r; ?" j4 H5 m: b  w3 atune.sndbuf.client <number> ! i% ]/ ~( f! g7 b& I4 n* h3 F
tune.sndbuf.server <number> , N  J5 K2 b6 ]$ H( v! N
以上凭字面理解吧
4 P' B1 T$ W5 idebug  调试模式,输出启动信息到标准输出
9 g: J2 K. B! `- P2 P6 a# W0 bquiet   安装模式,启动时无输出
) j" s5 S. c& _, J7 a8 c0 o( ~. T
. j4 W1 @& {! H6 N二:defaults 块
3 \( O* v( {: t; @) P  o$ e! a作用于其后紧跟的listen块,直至下一个defaults 块,下一个default 将替换上一个块作用于以后的listen8 p. R4 G# }( @5 Y5 U) W$ g
frontend 块,接受请求的端口组# j$ X( V: Q/ _
backend块,后端处理的server 组# u  D4 D+ G& M
listen块,frontend和backend 块的结合
, q8 Z; ]1 J; I0 h' I% @
8 [) |$ L8 s1 s三:常用配置命令, |4 A( T6 W% u0 s' j- ]% M' q

; u" b* y: O1 ^6 |+ a  n% P0 k! X$ |$ Dbalance <algorithm> [ <arguments> ]
# L4 q1 q& B0 z3 U3 Ibalance url_param <param> [check_post [<max_wait>]]   负载均衡模块设置
& {* O0 u# A( R& `& ^, P8 @. T/ H. J1 W0 m* d3 ^0 {
Examples :
7 g  m2 E! E( H/ x8 G. |balance roundrobin
" Q: ^, w0 {* J! Jbalance url_param userid  
) i/ P" I9 L" |% h& r! Kbalance url_param session_id check_post 64
( A% b9 ]6 _3 @8 N* M9 ^) v% c2 Wbalance hdr(User-Agent)
: T! ?' j( O6 D% {7 Vbalance hdr(host)
$ C# H; x1 X# {6 Wbalance hdr(Host) use_domain_only . h- [) k0 c! x. z6 n

8 }, w4 U& D- r3 B2 b) `block { if | unless } <condition>  在7层阻止访问+ @2 V$ D3 ^3 L2 v; I
Example: ; i7 a0 [% J; U" i! x( v. @8 m- n
acl invalid_src src 0.0.0.0/7 224.0.0.0/3  acl定义和squid 很像. o# E: B6 l7 j- V/ M1 q! Z, f) P
acl invalid_src src_port 0:1023 6 W  i) n0 ~: M4 v/ J2 h+ x' f
acl local_dst hdr(host) -i localhost
% t& I1 F* b% ~5 R' Sblock if invalid_src || local_dst ' i8 X4 D; w3 Y: t

) j8 Q% O# N  r* [1 I2 Ocapture cookie <name> len <length>  在请求和回应包中捕捉记录指定长度的cookie,name 为cookie的开头几个字母
/ S/ Z; |) b/ ?1 m4 E3 h6 L
' o! z3 D1 `8 V+ V' t2 j+ ]Example:
3 i+ k0 g# p, u( Q1 T+ M/ Lcapture cookie ASPSESSION len 32 9 p  ~/ v2 t2 g# `% w; }

+ ?  {  S) K0 |0 T& e- kcapture request header <name> len <length> 2 s7 H5 z0 y( {
capture response header <name> len <length> 同上
: h+ k8 i* ?. d# Q& g' r" H, \! W1 A9 ]+ j/ V- ^# t$ F
clitimeout <timeout> (deprecated)
7 L/ r* z% z& @( m2 c. rcontimeout <timeout> (deprecated)  客户端超时时间,不赞成设置
6 Y* E( a4 z" c9 J
2 D( w2 f6 w5 i1 j: Xcookie <name> [ rewrite | insert | prefix ] [ indirect ] [ nocache ] [ postonly ] [ domain <domain> ]*   允许持续的基于cookie 的后端连接
, m% @$ [+ R2 }- B/ b" D% ~) c0 ]) I- h' l7 T! u- X1 i9 X
default_backend <backend> 默认应用的后端
# P: _, T& r0 Q" U* H6 U4 H5 F
: L5 l$ f6 Z! f( x1 @& h& y3 lExample : 8 H+ ]( D! J% C: _$ q
use_backend dynamic if url_dyn
/ D, f' I! \- I% s& j3 xuse_backend static if url_css url_img extension_img
1 u; h$ X0 N3 k' J6 A0 r9 zdefault_backend dynamic    当没有匹配时就用dynamic: ~" D: X0 F! @' Z$ V% N2 F
2 f9 o4 s. x  s: v+ G% X! Y
errorfile <code> <file> 定义出现错误的代码的返回页
& i5 ^- d( |, SExample :
( P0 y8 `) L3 k# s0 ~4 uerrorfile 400 /etc/haproxy/errorfiles/400badreq.http # K7 a3 X5 p: p  q* S; A6 H0 O0 z1 V
errorfile 403 /etc/haproxy/errorfiles/403forbid.http
+ r$ T& q$ F- ferrorfile 503 /etc/haproxy/errorfiles/503sorry.http * o$ _! B. u( \) o
/ f6 f1 Y2 A6 \

& P- `7 c. a' f3 W5 O& Perrorloc <code> <url> errorloc302 <code> <url>   出错重定向到指定url
/ l7 a) p' H$ {2 Sforce-persist { if | unless } <condition>  在特定条件下,强制继续连接down 掉的服务器后端+ F" Z9 X( V, Q  z/ w/ U
fullconn <conns>  定义后端组的最大连接数1 _" X% L4 \. Z
grace <time>  haproxy停止后,再持续多长时间用于处理连接
3 X1 n6 b4 h! i, fhttp-check disable-on-404  如果后端检测返回404,将不再把后端计入负载均衡
' g$ M# I# U2 i+ S3 }http-check send-state 允许haproxy 发送 X-Haproxy-Server-State* o' X( k, ]* t1 @# H- U
http-request { allow | deny | http-auth [realm <realm>] } [ { if | unless } <condition> ]   七层访问控制
$ _/ @7 ]3 ~% p6 m( Y: J6 wExample:
$ G) o) v9 `5 U( x8 N/ p% |+ Racl nagios src 192.168.129.3
: ?' |8 z1 Q, v- C! eacl local_net src 192.168.0.0/16; e! v6 {! G4 s
acl auth_ok http_auth(L1)
/ C! M1 {" t8 s; K2 G1 P: R- V: C6 f+ ^
http-request allow if nagios
" I" P; q3 y( `) V+ Ghttp-request allow if local_net auth_ok7 ]& r* I# q' P" ~8 P2 `  R( p
http-request auth realm Gimme if local_net auth_ok" q9 [3 o" {; _; U. e
http-request deny
1 R& H2 h$ o: L4 q1 p: y% n
  i6 `; y9 m# f2 L+ x' g2 TExample:' m+ T9 n- K3 h( `' x
acl auth_ok http_auth_group(L1) G19 p0 z; T8 I6 K
2 e7 _7 p; |4 R
http-request auth unless auth_ok
+ l5 L; O' J" `. w  C1 g' d4 L
2 B# N" F% S/ F' zmode { tcp|http|health }   设定启动的实例的协议类型# j  i% }8 f. b2 q- g
monitor fail { if | unless } <condition>  监控失败条件设置
/ {3 d$ L- \7 K; ^/ I; _# D+ m  _- X
option abortonclose 丢弃由于客户端等待时间过长而关闭连接但仍在haproxy等待队列中的请求/ ~# c+ e( h& L* N$ x2 k
option accept-invalid-http-request  接受无效的http请求,建议关闭(开启可能有安全隐患)
& d# m$ c# a. n8 o( foption accept-invalid-http-response 接受无效的response ,建议关闭
* z4 |7 y4 Q3 L. C  g4 _! ooption allbackups  应该是后备服务器,如果正常的后端无法使用,就使用这些后备的设备,balance方式还是用原来的,没有优先的选择,常用来提供错误的页面
; A* T$ y/ G! v# L5 [option checkcache    分析后端response,阻止可缓存的cookie,它对response 进行严格检查,包括"Cache-control", "Pragma" and "Set-cookie" ,查看在客户端代理那边保存是否有风险,如果这个允许的话,符全以下条件 的response 将被允许,其它的将被阻止。) A. G8 E) E( g# d1 `' X: G" [4 @4 `
- all those without "Set-Cookie" header ;
" z9 e6 g: J$ j' T/ z- all those with a return code other than 200, 203, 206, 300, 301, 410,( s9 D" k# E! u4 C# V3 T3 z
provided that the server has not set a "Cache-control: public" header ;  [9 h' j  |, j& b! g/ {* ^
- all those that come from a POST request, provided that the server has not
% \5 X1 \: @0 V8 v6 S. Y0 G, u' zset a 'Cache-Control: public' header ;
, _7 \: O- {# X% a% k8 |- those with a 'Pragma: no-cache' header
' o& T. T) y9 T" x- those with a 'Cache-control: private' header
+ n: o* p. H' Q- those with a 'Cache-control: no-store' header2 y: Y. y+ l0 D/ R+ W
- those with a 'Cache-control: max-age=0' header0 k0 `7 o( Y& d) [+ k; O
- those with a 'Cache-control: s-maxage=0' header
% i3 b% ^, Y: I, E7 s- those with a 'Cache-control: no-cache' header
8 z) q6 P- ^8 i; i9 M) ?1 e- those with a 'Cache-control: no-cache="set-cookie"' header
2 u) h  D9 E6 o; X- those with a 'Cache-control: no-cache="set-cookie,' header/ x8 p9 o, f  e8 K% O8 e( \6 p
(allowing other fields after set-cookie)) d  @, s! u& @! |' q8 V- E

. F& L0 s7 C, {option clitcpka   是否允许客户端发送tcp keepalive 包,这个和http 的keepalive 没有关系5 T) v5 r; c0 f; u, ^
option contstats   允许连续的流量统计更新5 v" s  P3 N9 j" u: x, ~2 y
option dontlog-normal   开启正常连接的日志3 {/ I0 l' k( C+ G2 x  Y
option dontlognull   记录空连接; |3 S! P: s* v' S+ p
option forceclose  允许关闭session 在后端把response 发送后) N5 i5 ~, I6 W1 A( w
option forwardfor [ except <network> ] [ header <name> ]        允许在request 中加入X-Forwarded-For header 发往server
% B; C3 b8 r9 H# G4 ~option http-pretend-keepalive    定义是否haproxy要宣布同server keepalive7 P1 ~7 M3 O9 D
option http-server-close   是否开启在server 端 connection closing
+ H- Z, ]/ P: Koption http-use-proxy-header    用non-standard Proxy-Connection 替换 connection7 u# T5 B3 O' o& S2 C3 d

+ |, j* {! n9 W/ J, H% U  y' B5 V6 t4 R" o
option httpchk <method> <uri> <version>  允许用http协议检查server 的健康3 Z9 v) J  _# [6 q( k
Examples :; K9 \' ?$ Z; F/ K" M2 w
# Relay HTTPS traffic to Apache instance and check service availability
6 V* U7 v, G8 Q# d" U# using HTTP request "OPTIONS * HTTP/1.1" on port 80.! i- y4 i. h' F! c8 [
backend https_relay' |: K" L+ ^* k5 y# k* T
mode tcp* U( N4 E+ P5 _& I5 ~/ `! M
option httpchk OPTIONS * HTTP/1.1\r\nHost:\ www
* M0 d. ^0 }% s) xserver apache1 192.168.1.1:443 check port 800 x1 N6 M' `$ @( c) f3 X
) s- R9 N; k. o4 P- \: y4 d
option httplog [ clf ] 定制日志格式6 @& _8 R) D8 v5 I. s, j9 |. G9 B5 G
option http_proxy  开启http 代理模式,只有最基本的代理功能
; D# ]1 v" n  n7 U; p7 a$ goption ignore-persist { if | unless } <condition> 在某条件下拒绝持续连接,适用于对静态文件的负载均衡
8 }8 f8 U9 q- g4 m6 M  E- }option independant-streams  启用双向超时处理,如socket 的read 和write
0 Z. s; ~) \1 {$ G8 z: zoption log-health-checks   记录健康检查日志% a' G2 i/ [3 r' d6 ~7 S
option log-separate-errors   对非完全成功的连接改变日志记录等级
0 O; D- r1 F2 Roption logasap   大传输大文件时可以提前记录日志
! q5 B+ A- @# g7 }+ Y6 V' foption mysql-check   mysql 健康检查
1 Q. \6 e6 p' f& \* loption nolinger  清除肮脏连接后开成的tcp 状态及占用的资源,不过并不是强列要求你用这个选项,当然如果你有thousands of FIN_WAIT1 sessions on your system ,那肯定得用了' i  x; S# v. _
option originalto [ except <network> ] [ header <name> ]   允许在requests中加入X-Original-To header 发往server
2 x5 V- D2 ?* n2 Q1 E8 }/ q" `! zoption persist     强制将http请求发往已经down 掉的server: e- p% ^! }" {# [; l% {" h4 R7 V
option redispatch   是否允许重新分配在session 失败后$ U& y8 q  O, @2 ~
option smtpchk   smtp 检查! ^; ]: M. {# I* L1 {: O6 I: e  T  d
option socket-stats  允许对单个socket进行统计
5 G5 H+ x0 d  t& q: }# h. ~0 v+ `option srvtcpka  是否允许向server 发送keepalive
1 ]5 J" ^# x' s" m1 I3 q# i7 |, doption tcpka 是否允许向server和client发送keepalive& l. e" \2 ?1 I! Y
option tcplog  允许记录tcp 连接的状态和时间7 u; K( ]2 _2 Y% U6 C: b' \
option transparent   允许客户端透明代理
  e4 ~3 F  q5 |. E" ^! |/ Frate-limit sessions <rate> 设置frontend 每秒处理的连接的上限,如果到达上限就停止建立新的connection
0 k: j0 X( A9 R$ E2 x- P& k7 x( ^( H& A( u2 q
redirect location <to> [code <code>] <option> [{if | unless} <condition>]" |" O* t  q8 ?; @/ h6 \
redirect prefix   <to> [code <code>] <option> [{if | unless} <condition>] 重定向,相当于rewrite1 {: j# o3 F+ N
7 L( j. m" s+ c; W9 ?( t
Example: move the login URL only to HTTPS.
2 e3 F; [. `/ }7 W: wacl clear      dst_port  805 A& w, ~3 b& M% u: p$ T) \
acl secure     dst_port  8080
0 G! n$ D- N& B2 c) Jacl login_page url_beg   /login* U3 u4 j% N. o8 O4 T
acl logout     url_beg   /logout1 f5 o1 k2 a4 R% x7 Q' m! ~
acl uid_given  url_reg   /login?userid=[^&]+2 Q8 z( `$ Q" R* h! W
acl cookie_set hdr_sub(cookie) SEEN=1( k/ N& }) i: [$ p
! C" V# q* `! l/ Q
redirect prefix   https://mysite.com set-cookie SEEN=1 if !cookie_set9 p5 I5 `$ W. ^3 i/ o. _
redirect prefix   https://mysite.com           if login_page !secure2 z4 A: [+ l* V& H# Q9 p
redirect prefix   http://mysite.com drop-query if login_page !uid_given0 Y! u( f# s* ^, W# Q
redirect location http://mysite.com/           if !login_page secure
% }5 G& N4 P: E; ?8 V2 S) H+ v; Vredirect location / clear-cookie USERID=       if logout
4 u7 ^; ?, ]) }0 q6 [: a4 \& |0 ~2 W- \: P1 T
Example: send redirects for request for articles without a '/'.
$ e+ }% l% A- m4 Zacl missing_slash path_reg ^/article/[^/]*$
" A$ n& R8 }' Q! ~3 tredirect code 301 prefix / drop-query append-slash if missing_slash) F  `6 |/ |7 _# I0 w3 K1 Y
redisp (deprecated)
, R$ n0 X1 j! ]7 M8 ?5 S; uredispatch (deprecated) 开启session 重新分配在connection连接失败后,不赞成启用
3 P. \* f& J& J: P: b6 i- a* Mreqadd  <string> [{if | unless} <cond>] 在http请示的末尾加上string0 @1 C2 y* x1 y

6 n. ?' g* t5 j' l3 iExample : add "X-Proto: SSL" to requests coming via port 81) G9 z* ^8 w- `: I. f
acl is-ssl  dst_port       81
% ]0 \' f( H% ?reqadd      X-Proto:\ SSL  if is-ssl
+ k, v7 O' P+ _$ s: t' t8 D3 G, q! m
reqallow  <search> [{if | unless} <cond>]
' T; w- r( D$ y( t  [: Xreqiallow <search> [{if | unless} <cond>] (ignore case)    request 请求访问控制7 X- `/ l! M" w7 ~) B
. q# @/ T; W1 G
Example :& p5 t( n! s* P5 V# J& k6 e
# allow www.* but refuse *.local
; W, k0 {3 d  z; H, W6 X: rreqiallow ^Host:\ www\.9 a; L& \2 v. e
reqideny  ^Host:\ .*\.local6 A5 {1 O5 T3 h! q

4 R! _1 i% |! nreqdel  <search> [{if | unless} <cond>]+ j6 g! Z* B6 ]; n
reqidel <search> [{if | unless} <cond>]  (ignore case) 删除请求的head 中的内容
8 m' r0 P9 b5 F. g7 T- p' Z* n8 `7 u1 i6 N: G7 h- ~4 t
Example :
( D5 ~; i/ p( {# remove X-Forwarded-For header and SERVER cookie
- @  y% F- j+ P8 Q, xreqidel ^X-Forwarded-For:.*# m5 B" Z, ]1 @  V1 D* E2 H
reqidel ^Cookie:.*SERVER=
5 P6 s8 k7 A0 I. u+ _& a: Y" h: O8 X7 ~7 T% i' d
- c6 z% ]/ M$ I/ y: V' _
reqdeny  <search> [{if | unless} <cond>]2 B  }! L$ E& e$ J
reqideny <search> [{if | unless} <cond>]  (ignore case) 拒绝访问
4 R5 w* q$ @) q% b# X+ Y, R
3 R. ]/ o6 G/ D+ @$ |reqrep  <search> <string> [{if | unless} <cond>]
- {- F# P7 Q: f, Nreqirep <search> <string> [{if | unless} <cond>]   (ignore case)  request 请求替换
- }; g6 ~# l1 K2 W+ F- ^Example :
8 m: \! ^4 Q# ~% i. N1 f# replace "/static/" with "/" at the beginning of any request path.; j0 |: A$ O' p$ ^( ^1 ~; v4 r
reqrep ^([^\ ]*)\ /static/(.*)     \1\ /\2
( k: x6 M( A, U+ e3 j7 I  J# replace "www.mydomain.com" with "www" in the host name.
! Q" a' i  d2 j8 I7 @; qreqirep ^Host:\ www.mydomain.com   Host:\ www4 K* f; d4 S6 q* l/ y/ \
" M* H4 C" b2 o: X
reqtarpit  <search> [{if | unless} <cond>]
6 H* [2 Y2 u. K3 \1 u' O& [& Yreqitarpit <search> [{if | unless} <cond>]  (ignore case) 阻止http请求中的某些信息* G: n8 i0 ?4 l, ?  i

2 L1 z2 g2 |) W# c! K6 V, t! c& HExamples :
; a6 A, z6 S. B, d# ignore user-agents reporting any flavour of "Mozilla" or "MSIE", but
# J6 A) \1 K8 e4 y: O# block all others.) u9 Q# |5 F, F
reqipass   ^User-Agent:\.*(Mozilla|MSIE)  k3 @0 T1 \, `
reqitarpit ^User-Agent:
3 G8 s; g- ~  t# s. G
% A5 P* _+ \3 M4 B$ m# block bad guys% e8 o  b( y9 D+ K$ S% ^
acl badguys src 10.1.0.3 172.16.13.20/28
* b6 q" E+ h! Z. Ureqitarpit . if badguys8 M8 Z5 G, Q/ T3 b% G* U
- j0 |8 \, v# C
retries <value> 当对server的connection失败后,重试的次数
  [  `$ S3 f- B- h6 Orspadd <string> [{if | unless} <cond>] response 增加信息
9 {8 c1 r7 R8 H" @2 J$ \rspdel  <search> [{if | unless} <cond>]
) d' _! t3 H5 I5 g: h" c# \rspidel <search> [{if | unless} <cond>]  (ignore case)
' C+ U$ C( O/ d2 _' d, r/ X- Wrspdeny  <search> [{if | unless} <cond>]
, ^4 v6 d8 ?2 u& U! }) t9 Rrspideny <search> [{if | unless} <cond>]  (ignore case)+ h; q) b/ e3 I+ T; F4 U
rsprep  <search> <string> [{if | unless} <cond>]
" j' e! C+ Y* A) X, g+ orspirep <search> <string> [{if | unless} <cond>]  (ignore case)
$ j- I. H* o; {以上和request 的差不多
: p$ ]- x9 L5 O" m, L) [1 g2 T$ I: a' u7 i0 s- R6 k# f' j3 Q
source <addr>[:<port>] [usesrc { <addr2>[:<port2>] | client | clientip } ] 定义从代理出去的连接的对象,用于限定地址可以访问server: g6 T' V  W" k! Q
' t' d& a: _0 e& b
一些timeout
0 J" Z( ?+ h- S# I6 H2 Q3 E7 a6 M& f$ @% L8 i8 l2 U1 s' V
srvtimeout <timeout> server 处理超时,不赞成设置
& [" k/ U/ Y) ]timeout check                             X          -         X         X
) `# z. W: D. t# Mtimeout client                            X          X         X         -/ k! n8 w, @7 C
timeout clitimeout          (deprecated)  X          X         X         -
, r' v0 Z3 @, J& X: P5 P6 Ltimeout connect                           X          -         X         X/ o! W% Q: K5 `5 x, w; \/ u
timeout contimeout          (deprecated)  X          -         X         X
* O2 _7 d- l+ b6 ltimeout http-keep-alive                   X          X         X         X
  K. o- b% @  @6 V# Gtimeout http-request                      X          X         X         X
1 Y' L5 |8 C/ f( P0 wtimeout queue                             X          -         X         X
0 `; b' a+ Z+ h7 ?' [0 O. Stimeout server                            X          -         X         X
" z1 e" H7 X( e1 |# }timeout srvtimeout          (deprecated)  X          -         X         X- n5 d% b$ g# L% a# b) _* R0 D2 p
timeout tarpit                            X          X         X         X9 i3 [! H( [1 C2 N

1 y) G6 f6 x# V3 f9 k2 g) A$ }1 b5 S4 U1 M# ~
stats auth <user>:<passwd> 监控统计的帐号和密码8 v9 O6 M  b& p: B4 Y% |
backend public_www: G4 n7 N  y& w0 n, y! n6 B; P' l8 R
server srv1 192.168.0.1:801 N$ _3 u* ~/ d7 ~6 [" |5 V6 Z
stats enable
+ ?; B, N8 ^  W# _stats hide-version) l4 h2 e$ T3 B
stats scope   .$ C- k: ~" E0 k; b
stats uri     /admin?stats
  G4 t( D/ C# U4 |stats realm   Haproxy\ Statistics9 A  c+ D4 r+ ?( {0 [
stats auth    admin1:AdMiN123
+ {' J# j1 L  m- I) z# W4 `stats auth    admin2:AdMiN321
9 p0 R5 @. n! u5 K! U8 |
$ b# a& _! |+ z! U: }  j& E# internal monitoring access (unlimited)
3 J6 N, r* u8 f, A9 V& Q6 b# ~backend private_monitoring, `; X4 m: }% S1 V5 L3 n
stats enable" V( L: f: V2 U5 K: B
stats uri     /admin?stats/ T8 }  H# a* o( k  X6 Z
stats refresh 5s. }! b! t+ I2 x9 }4 C

9 z  h0 v. h: ^! P- ?( }4 `还有很多参数,以上能用到的也没有几个,只要满足当前需求就好,对于性能要求高的话,建议把不需要的功能 都关了吧.
====================
HAProxy的配置示例
HAProxy配置中分成五部分内容,当然这些组件不是必选的,可以根据需要选择部分作为配置。
' E6 P/ t* i1 n1 C$ A7 s. D3 Vglobal:参数是进程级的,通常和操作系统(OS)相关。这些参数一般只设置一次,如果配置无误,就不需要再次配置进行修改
4 W% y( k$ I& D! ddefaults:配置默认参数的,这些参数可以被利用配置到frontend,backend,listen组件
! M4 V3 c! l: x  R7 [* r8 \3 Bfrontend:接收请求的前端虚拟节点,Frontend可以根据规则直接指定具体使用后端的 backend(可动态选择)。5 m* t) H, G9 Y& _( l: a+ Q
backend:后端服务集群的配置,是真实的服务器,一个Backend对应一个或者多个实体服务器。
) r5 \+ X3 T0 e- ^8 m  Mlisten:Frontend和Backend的组合体。
下面是HAProxy的一些常用的配置,这个配置是用来说明HAProxy的一些常用功能的配置,具体详细配置请查看安装目录下的doc目录下的文档文件,或者到http://cn.haproxy.org/下载中文配置说明文档
配置具体实例,后附说明:
global
#全局的日志配置 其中日志级别是[err warning info debug]
#local0 是日志设备,必须为如下24种标准syslog设备的一种:
#kern user mail daemon auth syslog lpr news
#uucp cron auth2 ftp ntp audit alert cron2
#local0 local1 local2 local3 local4 local5 local6 local7
#但是之前在/etc/syslog.conf文件中定义的是local0所以
#这里也是用local0
log 127.0.0.1 local0 info #[err warning info debug]
#最大连接数
maxconn 4096
#用户
user admin
#组
group admin
#使HAProxy进程进入后台运行。这是推荐的运行模式
daemon
#创建4个进程进入deamon模式运行。此参数要求将运行模式设置为"daemon"
nbproc 4
#将所有进程的pid写入文件 启动进程的用户必须有权限访问此文件。
pidfile /home/admin/haproxy/logs/haproxy.pid
defaults
#默认的模式mode { tcp|http|health },tcp是4层,http是7层,health只会返回OK
mode http
#采用http日志格式
option httplog
#三次连接失败就认为是服务器不可用,也可以通过后面设置
retries 3
如果cookie写入了serverId而客户端不会刷新cookie,
#当serverId对应的服务器挂掉后,强制定向到其他健康的服务器
option redispatch
#当服务器负载很高的时候,自动结束掉当前队列处理比较久的链接
option abortonclose
#默认的最大连接数
maxconn 4096
#连接超时
contimeout 5000
#客户端超时
clitimeout 30000
#服务器超时
srvtimeout 30000
#=心跳检测超时
timeout check 2000
#注:一些参数值为时间,比如说timeout。时间值通常单位为毫秒(ms),但是也可以通过加#后缀,来使用其他的单位。
#- us : microseconds. 1 microsecond = 1/1000000 second
#- ms : milliseconds. 1 millisecond = 1/1000 second. This is the default.
#- s : seconds. 1s = 1000ms
#- m : minutes. 1m = 60s = 60000ms
#- h : hours. 1h = 60m = 3600s = 3600000ms
#- d : days. 1d = 24h = 1440m = 86400s = 86400000ms
########统计页面配置############
listen admin_stats
#监听端口
bind 0.0.0.0:1080
#http的7层模式
mode http
#日志设置
log 127.0.0.1 local0 err #[err warning info debug]
#统计页面自动刷新时间
stats refresh 30s
#统计页面url
stats uri /admin?stats
#统计页面密码框上提示文本
stats realm Gemini\ Haproxy
#统计页面用户名和密码设置
stats auth admin:admin
stats auth admin1:admin1
#隐藏统计页面上HAProxy的版本信息
stats hide-version
#######网站检测listen定义############
listen site_status
bind 0.0.0.0:1081
mode http
log 127.0.0.1 local0 err #[err warning info debug]
#网站健康检测URL,用来检测HAProxy管理的网站是否可以用,正常返回200,不正常返回500
monitor-uri /site_status
#定义网站down时的策略
#当挂在负载均衡上的指定backend的中有效机器数小于1台时返回true
acl site_dead nbsrv(denali_server) lt 1
acl site_dead nbsrv(tm_server) lt 1
acl site_dead nbsrv(mms_server) lt 1
#当满足策略的时候返回500
monitor fail if site_dead
#如果192.168.0.252或者192.168.0.31这两天机器挂了
#认为网站挂了,这时候返回500,判断标准是如果mode是
#http返回200认为是正常的,如果mode是tcp认为端口畅通是好的
monitor-net 192.168.0.252/31
########frontend配置############
frontend http_80_in
#监听端口
bind 0.0.0.0:80
#http的7层模式
mode http
#应用全局的日志配置
log global
#启用http的log
option httplog
#每次请求完毕后主动关闭http通道,HA-Proxy不支持keep-alive模式
option httpclose
#如果后端服务器需要获得客户端的真实IP需要配置次参数,将可以从Http Header中
#获得客户端IP
option forwardfor
###########HAProxy的日志记录内容配置##########
capture request header Host len 40
capture request header Content-Length len 10
capture request header Referer len 200
capture response header Server len 40
capture response header Content-Length len 10
capture response header Cache-Control len 8
####################acl策略定义#########################
#如果请求的域名满足正则表达式返回true -i是忽略大小写
acl denali_policy hdr_reg(host) -i ^(www.gemini.taobao.net|my.gemini.taobao.net|auction1.gemini.taobao.net)$
#如果请求域名满足trade.gemini.taobao.net 返回 true -i是忽略大小写
acl tm_policy hdr_dom(host) -i trade.gemini.taobao.net
##在请求url中包含sip_apiname=,则此控制策略返回true,否则为false
acl invalid_req url_sub -i sip_apiname=
##在请求url中存在timetask作为部分地址路径,则此控制策略返回true,否则返回false
acl timetask_req url_dir -i timetask
#当请求的header中Content-length等于0时返回 true
acl missing_cl hdr_cnt(Content-length) eq 0
######################acl策略匹配相应###################
##当请求中header中Content-length等于0 阻止请求返回403
block if missing_cl
##block表示阻止请求,返回403错误,当前表示如果不满足策略invalid_req,或者满足策略timetask_req,则阻止请求。
block if !invalid_req || timetask_req
#当满足denali_policy的策略时使用denali_server的backend
use_backend denali_server if denali_policy
#当满足tm_policy的策略时使用tm_server的backend
use_backend tm_server if tm_policy
#reqisetbe关键字定义,根据定义的关键字选择backend
reqisetbe ^Host:\ img dynamic
reqisetbe ^[^\ ]*\ /(img|css)/ dynamic
reqisetbe ^[^\ ]*\ /admin/stats stats
#以上都不满足的时候使用默认mms_server的backend
default_backend mms_server
#HAProxy错误页面设置
errorfile 400 /home/admin/haproxy/errorfiles/400.http
errorfile 403 /home/admin/haproxy/errorfiles/403.http
errorfile 408 /home/admin/haproxy/errorfiles/408.http
errorfile 500 /home/admin/haproxy/errorfiles/500.http
errorfile 502 /home/admin/haproxy/errorfiles/502.http
errorfile 503 /home/admin/haproxy/errorfiles/503.http
errorfile 504 /home/admin/haproxy/errorfiles/504.http
##########backend的设置##############
backend mms_server
#http的7层模式
mode http
#负载均衡的方式,roundrobin平均方式
balance roundrobin
#允许插入serverid到cookie中,serverid后面可以定义
cookie SERVERID
#心跳检测的URL,HTTP/1.1¥r¥nHost:XXXX,指定了心跳检测HTTP的版本,XXX为检测时请求
#服务器的request中的域名是什么,这个在应用的检测URL对应的功能有对域名依赖的话需要设置
option httpchk GET /member/login.jhtml HTTP/1.1\r\nHost:member1.gemini.taobao.net
#服务器定义,cookie 1表示serverid为1,check inter 1500 是检测心跳频率
#rise 3是3次正确认为服务器可用,fall 3是3次失败认为服务器不可用,weight代表权重
server mms1 10.1.5.134:80 cookie 1 check inter 1500 rise 3 fall 3 weight 1
server mms2 10.1.6.118:80 cookie 2 check inter 1500 rise 3 fall 3 weight 2
backend denali_server
mode http
#负载均衡的方式,source根据客户端IP进行哈希的方式
balance source
#但设置了backup的时候,默认第一个backup会优先,设置option allbackups后
#所有备份服务器权重一样
option allbackups
#心跳检测URL设置
option httpchk GET /mytaobao/home/my_taobao.jhtml HTTP/1.1\r\nHost:my.gemini.taobao.net
#可以根据机器的性能不同,不使用默认的连接数配置而使用自己的特殊的连接数配置
#如minconn 10 maxconn 20
server denlai1 10.1.5.114:80 minconn 4 maxconn 12 check inter 1500 rise 3 fall 3
server denlai2 10.1.6.104:80 minconn 10 maxconn 20 check inter 1500 rise 3 fall 3
#备份机器配置,正常情况下备机不会使用,当主机的全部服务器都down的时候备备机会启用
server dnali-back1 10.1.7.114:80 check backup inter 1500 rise 3 fall 3
server dnali-back2 10.1.7.114:80 check backup inter 1500 rise 3 fall 3
backend tm_server
mode http
#负载均衡的方式,leastconn根据服务器当前的请求数,取当前请求数最少的服务器
balance leastconn
option httpchk GET /trade/itemlist/prepayCard.htm HTTP/1.1\r\nHost:trade.gemini.taobao.ne
server tm1 10.1.5.115:80 check inter 1500 rise 3 fall 3
server tm2 10.1.6.105:80 check inter 1500 rise 3 fall 3
######reqisetbe自定义关键字匹配backend部分#######################
backend dynamic
mode http
balance source
option httpchk GET /welcome.html HTTP/1.1\r\nHost:www.taobao.net
server denlai1 10.3.5.114:80 check inter 1500 rise 3 fall 3
server denlai2 10.4.6.104:80 check inter 1500 rise 3 fall 3
backend stats
mode http
balance source
option httpchk GET /welcome.html HTTP/1.1\r\n Host:www.163.com
server denlai1 10.5.5.114:80 check inter 1500 rise 3 fall 3
server denlai2 10.6.6.104:80 check inter 1500 rise 3 fall 3
您需要登录后才可以回帖 登录 | 注册

本版积分规则

返回首页|Archiver|手机版|小黑屋|易陆发现技术论坛 ( 蜀ICP备2026014127号-1 )

GMT+8, 2026-6-12 03:26 , Processed in 0.019139 second(s), 24 queries .

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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