易陆发现互联网技术论坛

 找回密码
 开始注册
查看: 5844|回复: 1
收起左侧

haproxy配置文件详解

[复制链接]
发表于 2016-8-18 09:45:39 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?开始注册

x

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代表权重
    3 u6 d( V: g. O8 @! [7 y7 \

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

' E" O& P  ]! r
 楼主| 发表于 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不记录上级负载均衡发送过来的用于检测状态没有数据的心跳包。

" X) S! t& D' m; U
BALANCE 选项:
balance source :如果想让HAProxy按照客户端的IP地址进行负载均衡策略,即同一IP地址的所有请求都发送到同一服务
                             器时,需要配置此选项。
balance roundrobin :HAProxy把请求轮流的转发到每一个服务器上,依据每台服务器的权重,此权重会动态调整。最常
                                   见的默认配置。

4 u  Z' l* a( K  q% z. D7 d
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 :
/ a. G& d" A7 D. ]! Z1 o) e$ K
option httpclose
! d+ `' ]1 u+ _+ }; R6 Sno option httpclose
8 i; `7 R2 n9 L+ H' D+ N# o, C. a. D  Enable or disable passive HTTP connection closing   启用或禁止消极的HTTP连接关闭& J) R8 j9 B9 [$ z2 [
  May be used in sections :   defaults | frontend | listen | backend' |$ a) z4 |: K3 ]6 ~( y4 O) u/ D
                                 yes   |    yes   |   yes  |   yes
4 f$ n9 z% t2 |( Z2 I  Arguments : none
1 n) M$ a& Q3 A& `* f  9 S# f9 H* b0 `$ R$ q. l
  默认的,客户端与服务端的通讯,HAProxy只做分析、日志和分析每个连接的第一个request。如果设置了 "option' ]7 V: H% ?; L" W' e8 O
  httpclose" , 则会检查双向的http头是否有"Connection: close",如果没有则自动添加,使每个客户端或服务端在每次传输后,都会主动关闭TCP连接,使HTTP传输处于HTTP close模式下。任何 "Connection" 头如果不是"close",都会被移除。1 C( q( R% @" L+ Y6 `' ?4 C4 E: V

) Q' w; L5 k5 f; O' a8 y0 v# F. ~  很少会有服务器不正确的忽略掉头,即使收到"Connection: close"也不关闭连接,否则就是不兼容HTTP 1.0浏览器标准。 如果发生这种情况,可以使用"option forceclose",在服务端响应后主动关闭请求连接。选项 "forceclose"还可以及早释放服务连接,而不必等到客户端的应答确认。- i! V& }( d$ U
. |: p, I3 e5 q$ q5 r3 W1 i" `
  这个选项可以设置在frontend或backend上,只要其上可以建立连接。如果同时设置了"option forceclose",那么它比"httpclose"优先。如果同时设置了 "option http-server-close",则会实现"option forceclose"的效果。
option forceclose( f, q6 n; \) ]
no option forceclose
  Enable or disable active connection closing after response is transferred.     启用或禁止response后的主动关闭连接
  May be used in sections :   defaults | frontend | listen | backend8 C, M/ G2 p. _, Z
                                 yes   |    yes   |   yes  |   yes7 J5 r; C4 e. d( F. j
  Arguments : none
' w# C0 U$ r* ]* C8 P$ }/ ?        有的HTTP服务器收到"option httpclose"设置的"Connection: close",也不会关闭连接,如果客户端也不关闭,连接会 一直打开,直到超时。这会造成服务器上同一时段内的大量连接,日志中也会显示较高的全局会话时间。
        此时,可以使用 "option forceclose",当完成响应时,立即关闭对外的服务通道。该选项隐式打开httpclose选项。需要注意,该选项允许解析完整的request 和 response,所以可以很快关闭至服务器的连接,比httpclose更早释放一些资源。. s0 c* I4 f8 ]  N: Y0 s
        如果同时启用了"option http-pretend-keepalive",虽然会禁止发送 "Connection: close"头,但是依然会在整个response被接收后,关闭连接。
+ z2 B3 G! J7 o
. Y. e4 b7 x0 ^3 Y3 E; eoption http-server-close* z3 z3 s9 X3 p+ p/ B
no option http-server-close
2 q; q" j" h8 g9 O- o- w8 p  Enable or disable HTTP connection closing on the server side  启用或禁止关闭服务端的HTTP连接
* L# U# p- d2 ?7 }  May be used in sections :   defaults | frontend | listen | backend4 k* x! c& E9 m1 o( T3 S
                                 yes   |    yes   |   yes  |   yes
1 ~$ f* f7 J) l1 F4 `  Arguments : none) \( b1 R" {# s: z7 i
    默认的,客户端与服务端通讯,haproxy 只是分析、记日志,并处理每个连接的第一个请求。该选项设置server端为HTTP 连接关闭模式,并支持客户端为HTTP keep-alive的pipelining模式。提供了最低的客户端延迟和最快的服务端会话重用,以节省服务资源,类似"option forceclose"。还允许无keepalive能力的服务端在keep-alive模式下为客户端提供服务,但是需要符合 RFC2616。需要注意的是,有些服务器遇到"Connection: close" 时并不总是执行关闭,那么keep-alive 则无法使用,解决方法是启用 "option http-pretend-keepalive".
; r9 [/ t" _+ i) v/ l
$ S. q1 R' K' p0 q6 c! q- ~- r4 ]     目前,日志无法指明请求是否来自同一会话;日志中的接收日期为前一个请求的结束;请求时间为新请求的等待时间;keep-alive request time 存活请求时间为超时时间,绑定 "timeout http-keep-alive" 或 "timeout http-request"的设置。6 \+ K" Z8 a3 q  f- Q. }
     这个操作可以设置在frontend或backend上,只要其上可以建立连接。需要注意的是,这个选项可以与 "option httpclose"结合, 但 "option httpclose"优先级更高,结合后基本实现了forceclose的效果。" l9 H! A7 O, j3 g- E
1 }, G' p5 ~, p
option http-pretend-keepalive (http-假装-长连接)
& `; d. X' W; @; pno option http-pretend-keepalive
) c: c. R- _! \2 K9 v/ x  Define whether haproxy will announce keepalive to the server or not  定义 haproxy 与服务器是否是 keepalive 的。6 i7 V4 `# ?2 j& V: n( G" v
  May be used in sections :   defaults | frontend | listen | backend4 Q6 H' o" H! W+ C; l9 H% u
                                 yes   |    yes   |   yes  |   yes7 }& O/ x" \2 R  r+ s
  Arguments : none3 d6 M2 f" B- X( d5 n, k
    当声明了 "option http-server-close" 或 "option forceclose", haproxy会在给server的request头中添加 "Connection: close" 。然而有些服务器看到这个头,会返回未知长度的response,并自动避免chunked encoding,其实这是不对的。它会阻止haproxy保持客户端长连接,还会使客户端或缓存接收了未完成的响应,却认为响应结束了。
+ G- q5 t0 D# r% K    设置 "option http-pretend-keepalive", haproxy会在服务器端保持长连接,服务端则不会出现前面的问题。当 haproxy 获取了完整的response, 才会以类似forceclose的方式关闭服务端。这样客户端得到一个普通的响应,连接也在服务端被正常关闭。, @- E3 }1 {, h0 h8 i6 T5 r$ f
    建议不将其设为默认值,因为大部分服务器会在发送完最后一个包之后更高效的关闭连接,并释放缓存,而且网络上的数据包也会略微降低整体的峰值性能。但是启用该选项,haproxy会略微少做一些工作。所以如果haproxy在整个架构中是个瓶颈,可以启用该操作,以节省CPU。
3 x; P0 J" y$ H% R/ B3 w" K2 z
9 R% S+ `0 I$ \, ~% @- V% b     这个选项可以设置在frontend或backend上,只要其上可以建立连接。这个选项可以与 "option httpclose"结合, 使服务端keepalive,客户端close,但并不建议这样做。

/ \6 y* L! T+ y" T, M3 O
balance <algorithm> [ <arguments> ]& O- u; A; e" Z! Z6 h" c/ m
balance url_param <param> [check_post [<max_wait>]]. }, ]/ s8 R+ z0 b: \( I# Z
  定义选择后端服务的负载均衡算法
. G* W5 W: y7 }" k  May be used in sections :   defaults | frontend | listen | backend
- a! l1 n1 O# w9 `                                               yes   |    no    |   yes  |   yes8 t# Z( T8 T* p0 `: r: w" p- l: f
  Arguments :. K# q% S7 f  E% `, r* o- q. @5 g& d" e
    <algorithm> 是负载均衡时选择服务器的算法,没有持续信息时可用,或连接重定向到另一个服务器。<algorithm> 可以是以下几种:/ |1 \: l4 {5 {8 g
      roundrobin  每个服务器根据权重轮流使用,如果服务器的处理时间平均分布,这是最流畅和公平的算法。算法是动态的,对于实例启动慢的服务器的权重会在运行中调整。每个backend的活动服务器在设计上限制为4128个。在一些大的群里面, 当服务器很短的宕机后恢复回来,有时会有几百个请求被重新整合到群当中,并开始接收处理。尽管很少发生,但是很正常。这也说明了有机会监视它们,所以不必担心。
# B' [6 `  ~) E! q$ b/ F/ Q; h# q. M8 M7 L9 w0 J
      static-rr  每个服务器根据权重轮流使用,类似roundrobin,但它是静态的,意味着运行时修改权重是无效的。另一方面,它对服务器的数量没有设计上的限制,服务器启动后便会立即进到群中,整个分发方案会重新计算。这会略微降低CPU的运行(约1%)。
8 |0 B( r3 g+ u$ L% Y+ @: g. C
" q' ]+ `6 F! {: x1 n0 o% p      leastconn  连接数最低的服务器优先接收连接。Round-robin用于负载相同的服务器,使每台服务器都被使用。leastconn建议用于长会话服务,例如LDAP, SQL, TSE等,而不是很适合短会话协议,如HTTP。算法是动态的,对于实例启动慢的服务器的权重会在运行中调整。) o9 i0 H8 ~( K- M2 `& Q: i

" t# b! f/ u4 _      source    对源IP地址进行哈希,用可用服务器的权重总数除以哈希值,根据结果进行分配。只要服务器正常,同一个客户端IP地址总是访问同一台服务器。如果哈希的结果随可用服务器数量而变化,那么有的客户端会定向到不同的服务器。该算法一般用于不能插入cookie的TCP模式。它还可以用于广域网上,为拒绝使用会话cookie的客户端提供最有效的粘连。该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是算法会根据"hash-type"的变化做调整。
+ l5 i; W+ M; U' R9 ]% _2 I( F2 T! s% }9 X9 s- P* D/ K2 p  V* H
      uri        对URI左端(问号之前)进行哈希,用可用服务器的权重总数除以哈希值,根据结果进行分配。只要服务器正常,同一个URI地址总是访问同一台服务器。一般用于代理缓存和反病毒代理,以最大限度的提高缓存的命中率。该算法只能用于HTTP后端。该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是算法会根据"hash-type"的变化做调整。
; b+ [. E1 C9 m' q                  算法支持两个可选参数"len" 和 "depth", 都是后跟正整数。“len”参数指定算法只处理URI从头开始的字符数,据此计算哈希。因为大多URI以"/"开头,所以"len"最好不要设为1。"depth" 参数指定URI中最大的路径深度,据此计算哈希。请求中的每个斜线为一级。如果同时声明了这两个参数,则截取URI时必须同时满足。/ q0 ^  P% Y; X" v5 E

1 j/ S( P5 K4 l$ P& |      url_param  在HTTP GET请求的查询串中查找<param>中指定的URL参数。
" \, e3 p1 }( B0 y                 若使用了修饰符"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被用了,则只能检查第一个块。如果参数值被块边界分隔开,则只能随机均衡负载了。
3 J9 b3 A" {5 u- Z* P" y$ t" h3 l) o                  如果参数后面跟着 ('=') 和一个值,则可以根据这个值进行哈希,用可用服务器的权重总数除以哈希值,根据结果进行分配。
2 e4 V3 }! Q* ]6 t6 _0 @7 k                  还可用于跟踪请求中的用户身份,只要服务器正常,同一个用户ID的请求总是发给同一台服务器。如果没有参数或参数没有值,则使用轮询算法。该算法只用于HTTP后端。该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是算法会根据"hash-type"的变化做调整。7 H7 F3 a: B/ r  O& q+ m

5 ~: G0 c2 m- l$ }' T      hdr(name)  在每个HTTP请求中查找HTTP头<name>。与ACL函数'hdr()'一样。括号括起来的头名字不区分大小写。如果缺少头或头没有任何值,则使用roundrobin算法代替。                  ( `  F$ w# l& u
                       启用参数'use_domain_only',哈希算法将只用于一些类似'Host'的特定头的主域部分。例如主机值"haproxy.1wt.eu",则只考虑 "1wt"。该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是算法会根据"hash-type"的变化做调整。
) n6 {% g5 b; v- t4 t8 o: h( z! D9 l' V0 t. a7 u; }4 G
      rdp-cookie
) T( D/ ]! J1 V8 @0 E) o      rdp-cookie(name)* f# j& ]- _. f. W
                  为每个进来的TCP请求查询并哈希RDP cookie <name> (或“mstshash”如果省略) 。与ACL函数 'req_rdp_cookie()'一样,name不区分大小写。该机制用于退化的持久模式,可以使同一个用户(或同一个会话ID)总是发送给同一台服务器。如果没有cookie, 则使用roundrobin算法代替。
# G) O* M$ N  s) l' {                  必须注意该声明要生效,前端必须确保在请求缓冲中已经有RDP cookie,所以必须使用规则tcp-request content accept' 和ACL 'req_rdp_cookie_cnt'相结合。! o4 N. m: F. C0 q, b; B5 `. z3 _! n
                  该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是算法会根据"hash-type"的变化做调整。( [1 S& a0 a) V7 ~# c: P& Q4 T5 F& k

# t( N1 X& K  l1 Q6 D; Y    <arguments> 是用于一些算法的可选参数列表,目前只有"url_param" 和 "uri" 用到,例如:" }) K" T+ ^* v, Y  a- B8 P# T
                balance uri [len <len>] [depth <depth>]1 `' t# C, f8 d  x
                balance url_param <param> [check_post [<max_wait>]]
% C) S" I9 M5 c+ D& F' J: j0 k1 C* E6 v
  如果没有其他算法、模式或选项的设置,后端的负载均衡算法默认为roundrobin。每个后端只能设置一种。, l" o: H* s: F" I8 |( y
  Examples :
' K$ x' R; D. n2 s. h        balance roundrobin
5 t- A7 B$ a, h0 Y' H7 P$ @        balance url_param userid2 U( v% |; u( Z0 M3 d
        balance url_param session_id check_post 64+ K/ ]0 z; o% d3 ?  o
        balance hdr(User-Agent)- l& ]  L, d% Y
        balance hdr(host)
* t% ?6 e! d* z9 W% e        balance hdr(Host) use_domain_only
" s) z2 Z) Q  I# `; l: k
: ^( z4 H) k7 P" ]7 O9 Y  注意:  以下的警告和限制是使用“check_post“扩展和”url_param”所必须考虑 :# o# g+ ]! z, l9 z5 Y
    - 所有POST请求都要考虑,因为在包含二进制数据的体或实体中,没有办法决定是否会找到参数。因此需要另一种方法,限制POST请求的体中不含有URL参数 (见 acl reqideny http_end)
    - 大于请求缓冲大小的 <max_wait> 值是没用的。在build时设置缓冲大小,默认16KB。
9 t% z/ P& s  J8 N* D; a7 o1 y, q    - 不支持Content-Encoding, 参数搜索会失败;负载均衡会改用 Round Robin。
( O) ^' n( |$ B, E0 A    - 预计: 不支持100-continue,负载均衡会改用 Round Robin。$ x7 i7 y7 ^3 ^7 w
    - Transfer-Encoding (RFC2616 3.6.1) 只在第一个块中支持。如果在第一个块中的参数值不完整,选择的服务器就没有定义。(实际上取决于在第一个块中定义的有多小): c" c7 ^& z, _4 Y
    - 该特性不支持生成100, 411 或 501 响应。
) e' K/ y1 a0 K# a    -  有的情况下,需要"check_post"只是要查看整个消息体的内容。检查一般会停在任意数量的空格(LWS: linear
- _' X4 O7 c0 M( m      white space)或控制符上,表示这可能是一个URL参数列表。这可能不是一个关于SGML的类型消息体。! x  o7 b$ a) X/ s' K% v3 l
, P1 ]1 h- Z; w% v2 w$ K2 X
  See also : "dispatch", "cookie", "appsession", "transparent", "hash-type" and "http_proxy".
! J' J! u& x2 f2 c
hash-type <method>: `& Z' W( K$ x& I% c
  将哈希映射到服务器的方法。Specify a method to use for mapping hashes to servers  ^1 j  X' K; c$ ?( ^: _' t3 ?
  May be used in sections :   defaults | frontend | listen | backend$ E% g9 q2 `. x" U
                                               yes   |    no    |   yes  |   yes
$ ~9 G- r' R8 D/ o  Arguments :
( a7 Q$ Q" ^. }    map-based  哈希表是包含所有在线服务器的静态数组。哈希结果很平滑,并考虑了权重,但是会忽略服务器启动时的权重变化,也就是说不能慢启动。另外,服务器是根据数组中的位置所选择的,所以服务器数量变化时,大部分映射也会变化。当一台服务器启动或关闭,或服务器加入到群中,大部分连接会再分配给不同的服务器,这对有缓存的实例会比较麻烦。
    consistent  哈希表是由每个服务器构成的树,会在树上查找哈希Key,并选择最近的服务器。这种哈希是动态的,支持服务器启动时修改权重,所以可以慢启动。它有一个好处是当服务器启动或关闭时,只有其本身的关系被移除,当服务器加入群时,只有一小部分的映射会被重新分配,所以是一个比较理想的支持缓存的算法。但是根据其原理,算法不会非常平滑,有时候必须调整服务器的权重或ID来获得更平衡的分布。要保持多次负载均衡时的相同分布,服务器ID是绝对不能变的。(roloand:haproxy根据服务器的ID初始化其哈希值)* U) B7 c* j) u3 P3 X
   默认值是"map-based",建议大部分情况下使用。
7 R, U3 U& p" B7 m$ t; v  G, Y- n* {& x6 [# w* ^
  See also : "balance", "server"

% E, k- F& w( a/ c2 D) X% fdispatch <address>:<port>- A+ U. y! V4 j0 A1 X- s% i# c0 Q
  设置一个默认的服务器地址& [- ?5 D) B6 c( g5 V
  May be used in sections :   defaults | frontend | listen | backend
* F3 ?4 D" }/ s' O. h: e( _                                               no    |    no    |   yes  |   yes
6 q6 J( l! @( h2 a% j9 z. s  Arguments : none
0 B% T- x2 o) F' k    <address> 默认服务器的IPv4地址,也可以是主机名称,名称只在启动时解析为IP地址。" n( F0 ^2 q4 j8 z' b" B! f
    <ports>  端口号,所有连接都会发送给这个端口,但是不允许像其他服务器一样使用端口偏移(port offsets)。
   "dispatch"关键字指定了一个默认的服务器,用于无可用服务器时的连接的处理。过去常用于前传非持久连接给后备负载均衡器,由于定义简单,还用于简单的TCP中继(TCP relays)。 建议对于明确的连接处理,应使用"server"直接声明。
====================
一:Global parameters1 G2 ~0 O: w9 z% O* u
* Process management and security# W: Z! `; R1 O
- chroot 改变当前工作目录1 j( l7 L8 [) c* L: V; _: p8 {4 k$ O
- daemon 运行方式为后台工作
( p3 f: i: z5 P& K- user - group 工作用户和组; t/ r4 g6 H7 V9 T$ }2 b- t- s
-log <address> <facility>日志输出设备9 O* e9 z, S, Z! R
- nbproc 创建工作的进程数目
: G/ q8 {4 G8 X1 w! A& G& e-pidfile pid文件位置
/ Y: a/ X" T" B+ L- ulimit-n 设置每个进程的可用的最大文件描述符6 \* }' p5 v: s
- stats 创建监控所用的套接字目录1 d  ~' K- Y- E) `: ~+ n
- node 创建另外一个节点名字共用一个IP地址,用来识别哪个节点在处理流量
; I" K& s4 R% e; w- ^( B- description 描述实例的名称4 B) N5 d. |4 I3 ?0 Z* _
maxconn <number> 每个进程可用的最大连接数
- V% G, ^% \0 _' ~maxpipes <number>  每个进程可用的最大管道数
! ]+ I$ P" i- t+ h. _5 mnokqueue  nopoll  nosepoll nosplice  禁用这些功能
! s. x- j$ ^* Gspread-checks <0..50, in percent>  health check 的时间间隔
9 u/ `$ [% ~$ o' T' _+ U9 q0 ~* c/ Ptune.bufsize <number>
* }# K+ s4 A0 @# c6 Etune.maxaccept <number> * H1 f7 [; z& p( ?6 `2 W' U+ z, J- H
tune.maxpollevents <number>
6 c, A2 ?' w8 S1 {tune.maxrewrite <number> 3 v; T' c; r- j4 q, I7 O5 g
tune.rcvbuf.client <number> / `2 p  S; e) G
tune.rcvbuf.server <number>
0 `0 J4 r% F8 N4 w+ N% Ttune.sndbuf.client <number>
3 H$ g$ ?" P  I& T& n6 \tune.sndbuf.server <number> * a  b$ S' ^' q# @
以上凭字面理解吧0 M/ ]. W4 D  J1 j  U( s
debug  调试模式,输出启动信息到标准输出& r& R, c- y5 f1 v9 s1 n- V0 M
quiet   安装模式,启动时无输出3 n% i$ }" _3 J2 ^2 t

  @( ?& _/ f0 [) t6 ~二:defaults 块: I) A3 b/ R1 G: k# b6 L' ^' h
作用于其后紧跟的listen块,直至下一个defaults 块,下一个default 将替换上一个块作用于以后的listen
1 E* w) i! H& Y* E% o5 Afrontend 块,接受请求的端口组
! q% n) {, n0 b; K0 B/ a4 Jbackend块,后端处理的server 组# I7 B2 ?' Z: i  F  X4 R+ b7 n8 b' K
listen块,frontend和backend 块的结合& `+ ~% T/ X  D" J1 ?& n  W0 y
# L& t1 @  e- I" `
三:常用配置命令
" @; [8 z4 Q) T8 [+ ]) I7 {1 v) }3 R- s7 H# i: t: L: b
balance <algorithm> [ <arguments> ] 9 U* m9 T: ^4 V$ s- \- l- u- H. \
balance url_param <param> [check_post [<max_wait>]]   负载均衡模块设置
5 @; R  _( A4 [# `  {
! N+ S7 A4 ?1 `Examples :9 G. I3 Y9 f& X* g
balance roundrobin $ e4 B* P, f0 ^& H/ O5 l! y: `( V+ Z
balance url_param userid  
/ O  o: z6 G1 Y, X: ubalance url_param session_id check_post 64
) t* k# u1 ]' |$ jbalance hdr(User-Agent) 9 |" W  t; N8 _; u! T9 C
balance hdr(host) * R/ C7 n/ m6 R( C
balance hdr(Host) use_domain_only
- O  e$ Y! {! Q" p! f( X' {7 W0 [; d& m- ^! D' r
block { if | unless } <condition>  在7层阻止访问
' B! P: V$ K1 R; D: a6 rExample: % g6 L2 A. @' m2 e1 O4 m! S) }
acl invalid_src src 0.0.0.0/7 224.0.0.0/3  acl定义和squid 很像
9 y- D: r7 n2 k- y9 Sacl invalid_src src_port 0:1023 ; Y, B1 k! V0 d) T# z
acl local_dst hdr(host) -i localhost
  w4 }) J6 I: h$ `8 I) }( Zblock if invalid_src || local_dst % f2 Y) a  y' J  M2 {. V
8 K: @& r8 q: b6 X9 e; R( z
capture cookie <name> len <length>  在请求和回应包中捕捉记录指定长度的cookie,name 为cookie的开头几个字母
0 V! Z" W* i* M- L7 P) Q/ E/ j# W0 T. |1 X# y9 H) X" N
Example:
# p/ ]- S& t! n4 M" {( s; ]capture cookie ASPSESSION len 32 ) Z( d# G7 h( F" |

3 k" ^" K9 }8 `) F2 i- Pcapture request header <name> len <length>
. {0 n' o' r: y  d$ X  kcapture response header <name> len <length> 同上. r' @& m: D: _  i* s4 y
+ y. E% p8 ?& g* p2 V3 {3 `
clitimeout <timeout> (deprecated) . f9 T4 @% Z. q* S: V" y! p
contimeout <timeout> (deprecated)  客户端超时时间,不赞成设置
. x% Q8 Y/ M- l" u0 r; H
, R9 z5 c6 I8 I) {$ e) Q" ^( Tcookie <name> [ rewrite | insert | prefix ] [ indirect ] [ nocache ] [ postonly ] [ domain <domain> ]*   允许持续的基于cookie 的后端连接4 J# X& a. P' f3 j

7 j* \  I" }2 s  k& }. u, Zdefault_backend <backend> 默认应用的后端
* W* s, l+ n4 G8 N! ~" X& D+ {" p: t0 q9 Q+ d; C
Example :
0 _0 ?$ C5 H2 S( e% l8 X8 huse_backend dynamic if url_dyn $ s* E# Q/ {  g, z! x
use_backend static if url_css url_img extension_img
0 U! ^1 N  Y4 a: f* |default_backend dynamic    当没有匹配时就用dynamic. j) S. E3 B( z* X5 e

# h' q' Z$ O7 r- {% D3 k8 i* z9 \errorfile <code> <file> 定义出现错误的代码的返回页
! i# l. [5 k' b& K) S8 `6 GExample :
! x/ I/ e& `( P! S: @0 zerrorfile 400 /etc/haproxy/errorfiles/400badreq.http
/ u8 J2 |3 a, D* Jerrorfile 403 /etc/haproxy/errorfiles/403forbid.http   C9 u% O# o9 J0 E5 ?( ]2 q
errorfile 503 /etc/haproxy/errorfiles/503sorry.http ) Y# R5 ]+ O2 s3 a! G, U

8 j% Z+ U' y/ K& D
  r& c$ _5 G: _! I: M' _errorloc <code> <url> errorloc302 <code> <url>   出错重定向到指定url/ k0 Y. f/ C  g5 [: k% p& j
force-persist { if | unless } <condition>  在特定条件下,强制继续连接down 掉的服务器后端
% j  J1 j% a% S' [& ofullconn <conns>  定义后端组的最大连接数
9 ?8 ~1 @' }$ N+ E" ~2 d# rgrace <time>  haproxy停止后,再持续多长时间用于处理连接+ U3 L' n. {/ L
http-check disable-on-404  如果后端检测返回404,将不再把后端计入负载均衡, n# j3 t5 J) T. l6 |9 b
http-check send-state 允许haproxy 发送 X-Haproxy-Server-State, G7 I9 d: P+ \) g' W
http-request { allow | deny | http-auth [realm <realm>] } [ { if | unless } <condition> ]   七层访问控制
: C& e  ?3 G2 b) x" q- U5 M8 m0 u) TExample:2 ?8 N, c& g5 R4 G. ]$ B
acl nagios src 192.168.129.36 Z! a4 y' H/ G
acl local_net src 192.168.0.0/16
7 t. N' O% p7 z. E  R* d8 i# ?acl auth_ok http_auth(L1)
5 T( V1 |# p; L  y
, ^6 O5 d! d% z, W  dhttp-request allow if nagios( E1 K1 {! T0 f
http-request allow if local_net auth_ok
# \# k# K/ \/ o: B# H: Ohttp-request auth realm Gimme if local_net auth_ok, ]3 A. W% T4 I1 Z: ^
http-request deny3 P. H- s6 Q  e
; k- V2 K$ V( B2 o! u
Example:  g8 M5 w; }: b# C; y; n# D
acl auth_ok http_auth_group(L1) G1  I: M, {% d* B& g) F+ ~) X
3 b5 O6 L1 v1 o4 e1 h& e
http-request auth unless auth_ok" D) l0 u$ `/ Y- k5 o% j

- d( [5 W( Y. M" Y+ Mmode { tcp|http|health }   设定启动的实例的协议类型3 T- Y- ]- \* \, d( v5 l' A, y
monitor fail { if | unless } <condition>  监控失败条件设置
: ?5 a: q1 O$ c1 Y
- Y/ J! z  T% _8 {+ Y. o+ |! g0 boption abortonclose 丢弃由于客户端等待时间过长而关闭连接但仍在haproxy等待队列中的请求# c* G8 o' S/ f4 _
option accept-invalid-http-request  接受无效的http请求,建议关闭(开启可能有安全隐患), p- `) T  V: n* i5 _- N% Z" e
option accept-invalid-http-response 接受无效的response ,建议关闭/ i$ {, i% f- |. k1 l4 `2 {. `
option allbackups  应该是后备服务器,如果正常的后端无法使用,就使用这些后备的设备,balance方式还是用原来的,没有优先的选择,常用来提供错误的页面
& m( o" R2 ~" j& F8 coption checkcache    分析后端response,阻止可缓存的cookie,它对response 进行严格检查,包括"Cache-control", "Pragma" and "Set-cookie" ,查看在客户端代理那边保存是否有风险,如果这个允许的话,符全以下条件 的response 将被允许,其它的将被阻止。
$ \8 E- q1 T4 ~- |4 a% a, D- all those without "Set-Cookie" header ;
6 s, ]' d* \0 g- all those with a return code other than 200, 203, 206, 300, 301, 410,6 @, `. T2 M$ D, y$ d
provided that the server has not set a "Cache-control: public" header ;
9 L) H5 C! g2 d: g( E8 a0 _- all those that come from a POST request, provided that the server has not
! ]9 Y6 n% W2 p, {$ I9 |4 u" |set a 'Cache-Control: public' header ;  |7 @+ I  w( t& }$ t
- those with a 'Pragma: no-cache' header
- Y! |7 e$ P+ _* `- those with a 'Cache-control: private' header
$ r* ]  a' R/ ~- those with a 'Cache-control: no-store' header9 X- @6 E$ _8 Q) ^# k9 c
- those with a 'Cache-control: max-age=0' header
- w! S4 B; S! p$ M9 r- J7 R- those with a 'Cache-control: s-maxage=0' header
) I) O( C: G4 U0 B7 @+ E- those with a 'Cache-control: no-cache' header+ K, G: r; z  p& D
- those with a 'Cache-control: no-cache="set-cookie"' header( f- V+ d8 [7 N* J4 O
- those with a 'Cache-control: no-cache="set-cookie,' header
2 ^" Y2 q. p; S2 `# p; N8 T/ ^! D(allowing other fields after set-cookie)
* v1 J& f; T3 n& I1 K! A# c) `$ m7 [1 P3 F" f* U% \
option clitcpka   是否允许客户端发送tcp keepalive 包,这个和http 的keepalive 没有关系
5 I( n: B+ H4 S$ Hoption contstats   允许连续的流量统计更新' s4 U0 I+ m$ I. @& |' n- h6 b! ]1 N
option dontlog-normal   开启正常连接的日志0 M" z; j0 _3 N& i9 M7 q
option dontlognull   记录空连接
. k$ \' ]5 \6 Aoption forceclose  允许关闭session 在后端把response 发送后
- p3 K3 _4 J/ Z/ z" i: Ooption forwardfor [ except <network> ] [ header <name> ]        允许在request 中加入X-Forwarded-For header 发往server/ s% O2 r$ q9 {* s/ w& u, K5 X
option http-pretend-keepalive    定义是否haproxy要宣布同server keepalive7 v1 B) `0 v: s) F  Q) x
option http-server-close   是否开启在server 端 connection closing/ a! |7 e8 b" L% t8 L# B
option http-use-proxy-header    用non-standard Proxy-Connection 替换 connection+ u" v) s% X) U( W; ?# G

# S) l: Y0 {3 u6 l) J
, F0 j5 a# f, q% j) h  k. z0 g% F$ m- Soption httpchk <method> <uri> <version>  允许用http协议检查server 的健康
  v: l6 H: |8 r2 v: B; o+ y1 |Examples :
) c  O, F3 n' Z0 x, F& z' ?# Relay HTTPS traffic to Apache instance and check service availability+ _; j0 [* G' d
# using HTTP request "OPTIONS * HTTP/1.1" on port 80.9 L0 X8 j9 w9 a2 K
backend https_relay" D) r5 E  W7 G9 k
mode tcp
0 w2 f+ w7 E$ F3 I* goption httpchk OPTIONS * HTTP/1.1\r\nHost:\ www
  ^$ I$ ?( l1 B. d3 ^: fserver apache1 192.168.1.1:443 check port 80
, X; |  J2 K0 p0 v3 K
) a  ]7 ^( @! o9 Q$ v4 Eoption httplog [ clf ] 定制日志格式' v& Y* e+ n, F# _% m) f/ N  ?
option http_proxy  开启http 代理模式,只有最基本的代理功能
2 ~7 W7 N8 y8 {2 E( p( boption ignore-persist { if | unless } <condition> 在某条件下拒绝持续连接,适用于对静态文件的负载均衡
5 [* k7 b2 N5 @+ s5 Doption independant-streams  启用双向超时处理,如socket 的read 和write
, @' J/ G9 m- z' ioption log-health-checks   记录健康检查日志
% u( ^: p8 b, U- u; X# s! ?option log-separate-errors   对非完全成功的连接改变日志记录等级
" N; p2 R; }  ?( e# `option logasap   大传输大文件时可以提前记录日志
6 J" b0 O* S7 n/ W: z$ Voption mysql-check   mysql 健康检查
8 t5 k  v" ^) G+ f8 n6 X+ yoption nolinger  清除肮脏连接后开成的tcp 状态及占用的资源,不过并不是强列要求你用这个选项,当然如果你有thousands of FIN_WAIT1 sessions on your system ,那肯定得用了9 G: q- q% P3 z% o4 Z
option originalto [ except <network> ] [ header <name> ]   允许在requests中加入X-Original-To header 发往server
6 N% B% X5 T, B( A0 V$ r# [% hoption persist     强制将http请求发往已经down 掉的server$ y2 }  C5 D& T
option redispatch   是否允许重新分配在session 失败后
$ Q* W% }5 K$ D! n6 S8 \option smtpchk   smtp 检查/ j& j9 v5 u8 ~5 t
option socket-stats  允许对单个socket进行统计0 f1 a& D0 F9 \$ \3 D& k9 W
option srvtcpka  是否允许向server 发送keepalive
# r* k. ^6 g: q/ M: B9 ioption tcpka 是否允许向server和client发送keepalive/ g! O' K7 R& J& S4 L6 i
option tcplog  允许记录tcp 连接的状态和时间
9 O  [: [$ ]  b6 M( u! K7 B# ~) J4 Zoption transparent   允许客户端透明代理( Q( Q9 h( T- [9 c& P* z
rate-limit sessions <rate> 设置frontend 每秒处理的连接的上限,如果到达上限就停止建立新的connection
+ [: A" V; I0 V+ O4 W$ n# F7 q
" t5 _+ h4 I5 W, ?; }/ Sredirect location <to> [code <code>] <option> [{if | unless} <condition>]! f: q; D" q5 [0 e6 K
redirect prefix   <to> [code <code>] <option> [{if | unless} <condition>] 重定向,相当于rewrite
3 r3 q+ p( L( |
0 f- P# e9 y8 LExample: move the login URL only to HTTPS.
3 }, r' \* n( j+ A* O2 Y. O8 eacl clear      dst_port  800 K( P3 Y: y/ P+ ^$ N
acl secure     dst_port  8080
( \4 z$ O) l& Q# ?8 Q& g1 Jacl login_page url_beg   /login! b2 v1 c+ [# G+ T  i' q
acl logout     url_beg   /logout8 G8 K( O5 H/ L
acl uid_given  url_reg   /login?userid=[^&]+8 T6 q4 X& T5 X" J) A/ h
acl cookie_set hdr_sub(cookie) SEEN=1
& q0 ]  c- F! t8 q- t. `8 Z& Y( L
$ X! t& y7 `) {- yredirect prefix   https://mysite.com set-cookie SEEN=1 if !cookie_set1 M" K# N9 G. t3 }
redirect prefix   https://mysite.com           if login_page !secure$ l% F; H7 n% y3 R2 Z
redirect prefix   http://mysite.com drop-query if login_page !uid_given
1 Z) n2 @' b! y5 [0 P: Jredirect location http://mysite.com/           if !login_page secure! W1 C  y9 j  F" o- A
redirect location / clear-cookie USERID=       if logout9 P6 y- y) {! D6 ]9 Y: o- ?

- @! k2 @) U- {3 [: mExample: send redirects for request for articles without a '/'." G5 N6 |* W6 C; i" d5 K
acl missing_slash path_reg ^/article/[^/]*$6 ~0 h7 x( a7 x' P, _4 u
redirect code 301 prefix / drop-query append-slash if missing_slash
. l( `% k. V  k: h( F2 `: V2 q" R8 Lredisp (deprecated)" g4 u6 L# W3 d! g, j4 P$ k
redispatch (deprecated) 开启session 重新分配在connection连接失败后,不赞成启用
3 P' a/ V, a, j3 z* I& g5 Yreqadd  <string> [{if | unless} <cond>] 在http请示的末尾加上string
# |, p+ ~* y+ S4 u- f
7 ?5 _+ d" i  l$ r6 bExample : add "X-Proto: SSL" to requests coming via port 81
4 f* p9 {2 j0 k( n6 lacl is-ssl  dst_port       81, I  f/ u. w  a3 K8 C' y
reqadd      X-Proto:\ SSL  if is-ssl
9 w0 \1 O6 t  O* {2 q0 b3 F- s* J4 B8 D, i! Z
reqallow  <search> [{if | unless} <cond>]
8 P$ n7 t9 u! ~0 s2 `% F+ L& R( h4 `reqiallow <search> [{if | unless} <cond>] (ignore case)    request 请求访问控制
% k/ D6 Q6 K0 F. T6 n0 j# ?: ]" H) k* K& O1 F4 y/ J
Example :
9 a" t5 a: [' ~  S: V# allow www.* but refuse *.local$ g, S  ~! A! N1 \. p  c  B9 M
reqiallow ^Host:\ www\.
8 J0 q) {8 f- l1 n# \5 r2 c. g) m; Jreqideny  ^Host:\ .*\.local
" r; @$ R0 f2 U2 L
' n6 z0 f  F* @! @0 t* M0 b8 Ereqdel  <search> [{if | unless} <cond>]
0 F: D* c0 _! w" _& jreqidel <search> [{if | unless} <cond>]  (ignore case) 删除请求的head 中的内容7 |. e; _% }" Y8 C0 H! ?1 g6 s
; h( Q+ x, l2 g: R
Example :
$ T  O9 y. g$ d. o6 n! O* G# remove X-Forwarded-For header and SERVER cookie2 ^4 h; ?  }8 O3 ~. i6 u; j, C
reqidel ^X-Forwarded-For:.*; Y" e( g* x. W7 s8 r) h
reqidel ^Cookie:.*SERVER=
. M( p. k6 x& K  N9 p& i+ ~* U6 j/ Q8 D% O
: y) j  S; I; w, u4 F0 w
reqdeny  <search> [{if | unless} <cond>]! l% o3 m& G5 l1 E- U
reqideny <search> [{if | unless} <cond>]  (ignore case) 拒绝访问
, r# U9 n/ _+ C, V1 X8 V6 u, X: s; W+ M  W& u, B! |
reqrep  <search> <string> [{if | unless} <cond>]
; w. l+ f2 `; s7 hreqirep <search> <string> [{if | unless} <cond>]   (ignore case)  request 请求替换
. M+ b3 ~1 o9 tExample :  J( u/ P! x! r
# replace "/static/" with "/" at the beginning of any request path.+ k0 c# ]% `0 X0 ]0 C
reqrep ^([^\ ]*)\ /static/(.*)     \1\ /\2
7 i3 w! J1 C6 A0 h. t# replace "www.mydomain.com" with "www" in the host name.
  u* P9 H9 x0 O$ ^reqirep ^Host:\ www.mydomain.com   Host:\ www# Z) H5 X0 s) x; M  |; j. X) x4 I
/ [$ ^4 z/ f4 d, D' N+ T$ j
reqtarpit  <search> [{if | unless} <cond>]
+ H7 P8 i* C  ~! k  creqitarpit <search> [{if | unless} <cond>]  (ignore case) 阻止http请求中的某些信息$ U' S- d, L2 \: s3 B

% [5 v# x5 Z, u' Z: SExamples :6 Z" a1 p+ q& z  L2 ], h, a
# ignore user-agents reporting any flavour of "Mozilla" or "MSIE", but
$ G8 N; `5 z  }2 h/ g1 a# block all others.
3 o9 d* s3 b8 g8 [0 Freqipass   ^User-Agent:\.*(Mozilla|MSIE); L! A" E5 |' O
reqitarpit ^User-Agent:
  p. s; C1 t4 q& {1 }" j2 Y, A& x$ G- q& t* W9 A. [% `
# block bad guys
5 _2 }! i5 N# g; m  Z; k: T2 V! Sacl badguys src 10.1.0.3 172.16.13.20/28
% y( m& q+ ]  B; d, g. O, U1 ]9 Vreqitarpit . if badguys! \: B7 d! g( ]- t5 R( p

, X( @; i5 b9 pretries <value> 当对server的connection失败后,重试的次数
/ ^1 f1 Z' _; S% O' Lrspadd <string> [{if | unless} <cond>] response 增加信息
- H# C& r9 R3 Zrspdel  <search> [{if | unless} <cond>]
) i6 W. M  E7 i' Y% q9 prspidel <search> [{if | unless} <cond>]  (ignore case)2 K  v* x5 x8 a+ O; q: \
rspdeny  <search> [{if | unless} <cond>]; L$ a: ^' Q* J( m: P
rspideny <search> [{if | unless} <cond>]  (ignore case)
. @0 Q; v  @% L  l+ Orsprep  <search> <string> [{if | unless} <cond>]
% Z" M6 p& I% k8 Xrspirep <search> <string> [{if | unless} <cond>]  (ignore case)1 Q4 [3 q" g) t/ q0 ~2 j( k
以上和request 的差不多) G9 v  U: Y( J! v

! V* O- K% L3 t2 Vsource <addr>[:<port>] [usesrc { <addr2>[:<port2>] | client | clientip } ] 定义从代理出去的连接的对象,用于限定地址可以访问server0 d1 S. J+ f* P7 }5 w/ R

4 b$ c7 n; M) D  E- H( T一些timeout( c7 w% w2 l+ H+ `( f

* C+ _+ F- J: G1 O2 \8 U$ esrvtimeout <timeout> server 处理超时,不赞成设置
- _; b$ P6 W/ _$ n' p9 v9 O$ x- etimeout check                             X          -         X         X5 w/ d. {: K1 G$ O+ m+ B3 d% O
timeout client                            X          X         X         -
6 A, @6 G3 ^1 {8 t2 W" ?: w. u- ^timeout clitimeout          (deprecated)  X          X         X         -, o* [3 f: s$ z% ?4 O" E: o
timeout connect                           X          -         X         X
; }; E( `# ]( V: N6 Vtimeout contimeout          (deprecated)  X          -         X         X
' y9 i' m" [& Y6 Stimeout http-keep-alive                   X          X         X         X
" X0 j: p: H7 k0 z2 }# Qtimeout http-request                      X          X         X         X
, ]9 G# `; n2 y# R$ U0 X; W/ Dtimeout queue                             X          -         X         X9 x( _2 h+ p( c- \9 U  a
timeout server                            X          -         X         X
- u' @5 s. s0 a& X2 S4 ^. i7 ]timeout srvtimeout          (deprecated)  X          -         X         X
1 E* D; L- l' x$ f5 p$ ctimeout tarpit                            X          X         X         X
, {/ l3 N8 ^. b, D. t5 a3 Q' L% |" _) N" _+ W7 E4 z- e/ s
( K1 x: r& p! U
stats auth <user>:<passwd> 监控统计的帐号和密码* l+ J7 ?" [3 A( ~+ y" a5 Z- q+ y3 C
backend public_www9 J. A" `- c  H  D- k1 p: r
server srv1 192.168.0.1:803 r% w( X$ ^5 M- F
stats enable3 C, |, E" o7 V) ~
stats hide-version, n7 A* [/ n" E" Z; f
stats scope   .
% u0 b( E5 H, d2 L, S$ ?/ zstats uri     /admin?stats( a. s0 X7 u) A7 w9 p: s, |6 c+ `& F
stats realm   Haproxy\ Statistics
* L2 F+ e! m! I9 cstats auth    admin1:AdMiN123
3 k( ?- J' X! `0 _- }stats auth    admin2:AdMiN321# c+ q9 A( s; X8 d# J' t

' N$ s" y6 s( g4 t1 o5 d# internal monitoring access (unlimited)- z4 Q; ]' P  \7 J* n
backend private_monitoring! U' |% q+ m  B3 ~8 g
stats enable
; O! I' e1 c: X+ m2 C2 Wstats uri     /admin?stats
8 n6 t9 f! Z. f. q# c/ [+ ostats refresh 5s
+ ]8 A; r& n; x% n) L
; h  t$ j, b% _% g% p还有很多参数,以上能用到的也没有几个,只要满足当前需求就好,对于性能要求高的话,建议把不需要的功能 都关了吧.
====================
HAProxy的配置示例
HAProxy配置中分成五部分内容,当然这些组件不是必选的,可以根据需要选择部分作为配置。$ l2 e7 g/ V; U6 ]
global:参数是进程级的,通常和操作系统(OS)相关。这些参数一般只设置一次,如果配置无误,就不需要再次配置进行修改
9 s; F2 U/ V- M9 Y7 }defaults:配置默认参数的,这些参数可以被利用配置到frontend,backend,listen组件0 I, w) L/ Y  ]
frontend:接收请求的前端虚拟节点,Frontend可以根据规则直接指定具体使用后端的 backend(可动态选择)。: A7 c  j$ v6 r- N" M7 z
backend:后端服务集群的配置,是真实的服务器,一个Backend对应一个或者多个实体服务器。0 B8 b+ V8 |$ X, {+ z. W
listen: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
您需要登录后才可以回帖 登录 | 开始注册

本版积分规则

关闭

站长推荐上一条 /4 下一条

北京云银创陇科技有限公司以云计算运维,代码开发

QQ|返回首页|Archiver|小黑屋|易陆发现技术论坛 ( 蜀ICP备2026014127号-1 )点击这里给我发消息

GMT+8, 2026-4-8 21:37 , Processed in 0.093378 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

© 2012-2025 Discuz! Team.

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