易陆发现互联网技术论坛

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

haproxy配置文件讲解

[复制链接]
发表于 2017-9-8 10:03:56 | 显示全部楼层 |阅读模式

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

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

x
global                                                       # 全局参数的设置/ D- x2 X8 p- V' X6 O/ a: V2 e
    log         127.0.0.1 local2                      # log语法:log <address_1>[max_level_1] # 全局的日志配置,使用log关键字,
4 M( F1 |; b' `' O                                                                     指定使用127.0.0.1: i! l2 s9 u! G/ [6 _
                                                                     上的syslog服务中的local0日志设备,记录日志等级为info的日志; G: C' F% D- l) ^9 O
    chroot      /var/lib/haproxy                 #改变当前工作目录
& g1 c$ n* V/ H$ q) p( j3 l% I5 X    pidfile     /var/run/haproxy.pid          #当前进程id文件
9 @/ m9 L7 D3 z  Q* w$ F8 N    maxconn     4000                                #最大连接数- ~4 ^% R$ q; ], ^
    user        haproxy                                #所属用户; Z) q* Q; n  I, F% c; m
    group     haproxy                                #所属组- h2 {( [$ G3 K6 l
    daemon                                               #以守护进程方式运行haproxy( ?7 j, Y9 _8 u8 A0 L6 l( H' p
    stats socket /var/lib/haproxy/stats* J3 h0 n- Q" i; L7 f2 g
defaults% D6 s! o7 Q! l. b  R. e
    mode                    http                        #默认的模式mode { tcp|http|health },tcp是4层,http是7层,health只会返回OK
( T4 J! E7 O1 O% x' V    log                        global                    #应用全局的日志配置% Q4 k6 T7 X6 y$ ]
    option                  httplog                  # 启用日志记录HTTP请求,默认haproxy日志记录是不记录HTTP请求日志( B5 [* U6 d: n  T$ ]; N
8 k" K8 L* ^8 B4 C
    option                  dontlognull          # 启用该项,日志中将不会记录空连接。所谓空连接就是在上游的负载均衡器
: c4 h# [) P" ~  F  i                                                                   或者监控系统为了探测该 服务是否存活可用时,需要定期的连接或者获取某
: V* k' F8 w5 o! h/ ~; a4 p                                                                  一固定的组件或页面,或者探测扫描端口是否在监听或开放等动作被称为空连接;
3 b) G, P% n2 J: p) ^9 f% c, K$ S                                                                  官方文档中标注,如果该服务上游没有其他的负载均衡器的话,建议不要使用
; f; T2 R9 a; Z# g: S                                                                   该参数,因为互联网上的恶意扫描或其他动作就不会被记录下来
! ]. K& e6 b' o    option http-server-close                   #每次请求完毕后主动关闭http通道
, T$ t8 a/ h8 W; u8 `( D    option forwardfor       except 127.0.0.0/8   #如果服务器上的应用程序想记录发起请求的客户端的IP地址,需要在HAProxy
( `6 Z2 R# u, l8 W" Y0 d* K' p                                                                            上 配置此选项, 这样 HAProxy会把客户端的IP信息发送给服务器,在HTTP5 z4 k1 L! v' l8 n2 M
                                                                            请求中添加"X-Forwarded-For"字段。 启用  X-Forwarded-For,在requests( |% e6 I* [8 D' e/ P! b
                                                                            头部插入客户端IP发送给后端的server,使后端server获取到客户端的真实IP。
4 M  N0 }" S8 D, Z  M" d6 B( K! G+ a    option                  redispatch                      # 当使用了cookie时,haproxy将会将其请求的后端服务器的serverID插入到  \2 t* v1 X8 C
                                                                            cookie中,以保证会话的SESSION持久性;而此时,如果后端的服务器宕掉; s& w6 [6 Y+ Y9 ]- A4 a5 l
                                                                            了, 但是客户端的cookie是不会刷新的,如果设置此参数,将会将客户的请4 j9 F$ x2 q$ r; W8 H
                                                                            求强制定向到另外一个后端server上,以保证服务的正常。" }# i( T5 }, l& ~+ q: B7 y
    retries                 3                             # 定义连接后端服务器的失败重连次数,连接失败次数超过此值后将会将对应后端9 l6 u) ]+ [$ d- }# q0 k+ m
                                                                  服务器标记为不可用9 X3 ?- O' y! }9 H
    timeout http-request    10s             #http请求超时时间
) K' F- ]1 ~  F3 [    timeout queue           1m                 #一个请求在队列里的超时时间9 l4 g7 w% _( k2 E0 O
    timeout connect         10s                #连接超时
4 j& C' ?8 U" O) i0 y    timeout client          1m                   #客户端超时( N4 Y. v" Q- O* W6 ~, ^
    timeout server          1m                   #服务器端超时, {% D% G- e, W# M
    timeout http-keep-alive 10s           #设置http-keep-alive的超时时间+ _* {' W' a- e/ v
    timeout check           10s                 #检测超时
/ O5 x0 j/ y' \4 r1 I: t2 h    maxconn                 3000                 #每个进程可用的最大连接数5 r' g% k! t* {$ _, d
frontend  main *:80                             #监听地址为80( z" Y1 y4 @+ {( F, G" J
    acl url_static       path_beg       -i /static /images /javascript /stylesheets$ d& D) x  j8 G/ t, h
    acl url_static       path_end       -i .jpg .gif .png .css .js: N: j" F3 d- l+ E1 w3 ^
    use_backend static          if url_static
3 n* F8 J7 {; Q; z: b    default_backend             my_webserver     #定义一个名为my_app前端部分。此处将对于的请求转发给后端' H9 M8 Y1 ]3 [' H8 ?
backend static                                                 #使用了静态动态分离(如果url_path匹配 .jpg .gif .png .css .js静态文件则- Q& P) N7 {1 J6 @9 ^0 h! p
                                                                            访问此后端)# O: x' R; y+ U0 x$ O& J
    balance     roundrobin                               #负载均衡算法(#banlance roundrobin 轮询,balance source 保存session值,& n6 p' Z/ Q$ h: ?# t
                                                                           支持static-rr,leastconn,first,uri等参数): q9 l# w) \& z
    server      static 127.0.0.1:80 check             #静态文件部署在本机(也可以部署在其他机器或者squid缓存服务器)
2 N$ x' W' x7 ?* }backend my_webserver                                  #定义一个名为my_webserver后端部分。PS:此处my_webserver只是一个
/ b6 E7 o" J0 u* U- T                                                                            自定义名字而已,但是需要与frontend里面配置项default_backend 值相一致- g$ \, U: Z- y1 ]
    balance     roundrobin                               #负载均衡算法
' f' J4 ]7 R* R7 B) G3 R2 {. V    server  web01 172.31.2.33:80  check inter 2000 fall 3 weight 30              #定义的多个后端0 u( ^9 k* p) P+ G' w+ c/ R, r2 M7 @0 E
    server  web02 172.31.2.34:80  check inter 2000 fall 3 weight 30              #定义的多个后端; u2 i0 x; a4 K, t$ u
    server  web03 172.31.2.35:80  check inter 2000 fall 3 weight 30              #定义的多个后端) }' l* B* k, q4 Z# \8 F
7 U& s' U7 a# O/ b0 Q; f

: \! w& \( ~; y+ ~9 L
 楼主| 发表于 2021-7-12 13:55:30 | 显示全部楼层
常用配置选项:& O# v! j# F3 ~) \' c3 S  L

1 K% A- h, Y; U; `- t2 D# F
8 e/ `- p/ T1 m9 O  |" ~& S! R3 ?( j; D4 i  d% ]
OPTION 选项:
9 ?: l% M0 v' D. @/ R. i
  Z/ K7 T; D# |9 M/ Y# o6 moption httpclose :HAProxy会针对客户端的第一条请求的返回添加cookie并返回给客户端,客户端发送后续请求时会发送
" e  w( |$ f1 h- `- V5 @# c6 H5 o# r4 {( W) a! N5 Z
                             此cookie到HAProxy,HAProxy会针对此cookie分发到上次处理此请求的服务器上,如果服务器不能忽略( k, ?. ^' L/ M( v' p9 f! m
9 a7 [3 o2 k2 {. k" `( y3 N( y
                             此cookie值会影响处理结果。如果避免这种情况配置此选项,防止产生多余的cookie信息。0 |/ Q5 T1 @0 p* X
. ]" k4 l+ l+ K5 T, E% R5 F2 R
option forwardfor :如果服务器上的应用程序想记录发起请求的客户端的IP地址,需要在HAProxy上配置此选项,这样
+ q# N# ^6 Q3 I# _! N3 p3 H3 ~3 n1 O! w2 T6 ^
                               HAProxy会把客户端的IP信息发送给服务器,在HTTP请求中添加"X-Forwarded-For"字段。
2 {+ J( C# Q- t1 L$ ^' q" f) v
+ k9 P2 y% p9 ], K( l' s4 T$ goption originalto :如果服务器上的应用程序想记录发起请求的原目的IP地址,需要在HAProxy上配置此选项,这样HAProxy* k/ D* B# C' N- |% B" v
* z8 s" V/ s, F1 ]
                              会添加"X-Original-To"字段。0 K) b; |# a( m. a0 K5 ]

( e* O9 u- ~; m. G; |option dontlognull :保证HAProxy不记录上级负载均衡发送过来的用于检测状态没有数据的心跳包。
3 W! Q/ J- g; v  f- E, T3 ], G! F7 g0 G  H

% p2 X0 W5 o- g. `5 F: a# _& Y+ e
$ b2 c( G: x$ K* d7 `BALANCE 选项:  N  P  I6 J9 A4 r9 k/ i' p
. X( ]- Y3 L  y4 {4 \# a5 ]9 E3 K
balance source :如果想让HAProxy按照客户端的IP地址进行负载均衡策略,即同一IP地址的所有请求都发送到同一服务3 o7 V8 h- ^( w8 H4 Z
( _- `+ \9 _* J8 O
                             器时,需要配置此选项。, @1 `4 c/ J/ n9 I0 L1 r
0 K' V% l: B+ p* p3 n
balance roundrobin :HAProxy把请求轮流的转发到每一个服务器上,依据每台服务器的权重,此权重会动态调整。最常" I. a( {1 {5 o$ m! n

5 c2 U; R* A/ F; Q* F* Z( ]                                   见的默认配置。
$ A4 e/ X! Z5 T* C6 q- Y2 B7 V( m$ m6 _+ p6 \6 a# X% @
# y' @9 [8 j- ^: H, z

5 T) |  O, S: w# d/ v: @COOKIE 选项:
2 L6 d# N, m% n& }& M. }; w0 ?) o
$ Y; _+ y/ w: w6 K: r: }! ecookie JSESSIONID prefix :如果客户端只支持一个cookie,并且服务器上的应用程序已经对返回设置了cookie,
; n% D6 k% @$ ?$ i) N- l/ P) n: z. Y& m6 t, \
                                               HAProxy设置此选项可以改写应用程序设置的cookie信息,把服务器的信息添加到原cookie中去。# T$ M6 T( w4 ~, r' [% G- v; O

6 y5 V) k" K& u* v: icookie SERVERID indirect :HAProxy会删除添加的cookie信息,避免此cookie信息发送到服务器。
; k9 V9 K/ x8 F* K$ `( V9 r6 E# K) ~" O$ e/ ^# L% h
cookie SERVERID rewrite :8 A# z! I) Z( G( p: g/ o

4 L, i" F( I* c, e  x, E9 _2 @9 j) Scookie SERVERID insert :! g; H+ r5 H' }
3 k5 `; C0 @* D5 c' t
cookie SERVERID insert nocache :7 f% s! E) y2 a- X

  Y* W3 U: ]( R& U* `1 m6 w& ^8 ncookie SERVERID insert postonly :$ ~; I3 }' y( K
4 \8 D9 f8 J4 r' N; E3 \5 M; s$ i; Z
/ V' @3 v& U' e' p* q" ^; A" o  N
! u8 R: y- p% {: ]6 B
option httpclose% E' @3 }1 Z9 f8 P5 J+ v2 j. P
no option httpclose( o4 k3 K* S$ v' p' N
  Enable or disable passive HTTP connection closing   启用或禁止消极的HTTP连接关闭/ Y# F0 ~  S- z/ S2 x
  May be used in sections :   defaults | frontend | listen | backend- _' Z5 F% _) p4 D3 y
                                 yes   |    yes   |   yes  |   yes
. r& v) Y  @3 D  Arguments : none! e8 T3 j! o9 a- A+ m/ u/ n  ~8 V
  
  d1 @8 o2 S' o. I- e( y0 Q  默认的,客户端与服务端的通讯,HAProxy只做分析、日志和分析每个连接的第一个request。如果设置了 "option; V3 g7 t" q. N9 I, I9 m6 B
  httpclose" , 则会检查双向的http头是否有"Connection: close",如果没有则自动添加,使每个客户端或服务端在每次传输后,都会主动关闭TCP连接,使HTTP传输处于HTTP close模式下。任何 "Connection" 头如果不是"close",都会被移除。
$ p6 e& U; R0 h
% O9 p' \$ J  k- P8 J" c% t) c  很少会有服务器不正确的忽略掉头,即使收到"Connection: close"也不关闭连接,否则就是不兼容HTTP 1.0浏览器标准。 如果发生这种情况,可以使用"option forceclose",在服务端响应后主动关闭请求连接。选项 "forceclose"还可以及早释放服务连接,而不必等到客户端的应答确认。: H2 h+ L' \/ [2 ^

" L. |: U2 E9 {! d7 v  这个选项可以设置在frontend或backend上,只要其上可以建立连接。如果同时设置了"option forceclose",那么它比"httpclose"优先。如果同时设置了 "option http-server-close",则会实现"option forceclose"的效果。$ B# R6 E* u1 b+ r1 j, P% I

) o: Z( V! [' }4 t4 R/ poption forceclose
9 Z# k7 b" p: M/ ^no option forceclose
2 M3 W' T, `1 ]! x( m* d- D7 z1 P% J7 I- q$ A
  Enable or disable active connection closing after response is transferred.     启用或禁止response后的主动关闭连接1 Y( L% f/ b6 u3 Z

& F6 f* r" ~( D/ z. v$ i, f( B  May be used in sections :   defaults | frontend | listen | backend
( z2 \4 ~/ |6 e3 G( [: B                                 yes   |    yes   |   yes  |   yes
( Y; Z) V( @5 Q* _/ F' F, e8 V
  Arguments : none
* n' |( a( d) Z# _- H        有的HTTP服务器收到"option httpclose"设置的"Connection: close",也不会关闭连接,如果客户端也不关闭,连接会 一直打开,直到超时。这会造成服务器上同一时段内的大量连接,日志中也会显示较高的全局会话时间。
$ k; ?# @" n% M/ c, o' }) J; x0 P  G3 a5 V1 B
        此时,可以使用 "option forceclose",当完成响应时,立即关闭对外的服务通道。该选项隐式打开httpclose选项。需要注意,该选项允许解析完整的request 和 response,所以可以很快关闭至服务器的连接,比httpclose更早释放一些资源。5 t# L' a) |( D
        如果同时启用了"option http-pretend-keepalive",虽然会禁止发送 "Connection: close"头,但是依然会在整个response被接收后,关闭连接。
! R2 S% R: [8 S- _8 ]. X
* V, H$ b4 |* A0 H9 F* V4 v  \option http-server-close
! Z) W& z1 B! \- w+ F4 cno option http-server-close  i+ m0 f' A, R5 J+ O( D; [) x1 L1 F& ^. e
  Enable or disable HTTP connection closing on the server side  启用或禁止关闭服务端的HTTP连接
, }! F% f- k, j5 v/ _  May be used in sections :   defaults | frontend | listen | backend0 w7 e5 `9 q8 F* r  C& ^
                                 yes   |    yes   |   yes  |   yes
# A; q  `5 o$ ?. K# a. L/ O  Arguments : none
& W1 q$ v( n2 F* E9 k; N    默认的,客户端与服务端通讯,haproxy 只是分析、记日志,并处理每个连接的第一个请求。该选项设置server端为HTTP 连接关闭模式,并支持客户端为HTTP keep-alive的pipelining模式。提供了最低的客户端延迟和最快的服务端会话重用,以节省服务资源,类似"option forceclose"。还允许无keepalive能力的服务端在keep-alive模式下为客户端提供服务,但是需要符合 RFC2616。需要注意的是,有些服务器遇到"Connection: close" 时并不总是执行关闭,那么keep-alive 则无法使用,解决方法是启用 "option http-pretend-keepalive".. l  ?' B* p7 f$ w6 Y' K6 `& u( X

; [  O. G, E! w- b0 h     目前,日志无法指明请求是否来自同一会话;日志中的接收日期为前一个请求的结束;请求时间为新请求的等待时间;keep-alive request time 存活请求时间为超时时间,绑定 "timeout http-keep-alive" 或 "timeout http-request"的设置。
2 A5 i4 k/ E! p( A     这个操作可以设置在frontend或backend上,只要其上可以建立连接。需要注意的是,这个选项可以与 "option httpclose"结合, 但 "option httpclose"优先级更高,结合后基本实现了forceclose的效果。
# N& I8 I; M) D6 z& W, G
: M, n( {) x9 boption http-pretend-keepalive (http-假装-长连接)1 h4 H( w2 p2 A" o+ g
no option http-pretend-keepalive: `( ]2 S/ X) A1 u
  Define whether haproxy will announce keepalive to the server or not  定义 haproxy 与服务器是否是 keepalive 的。7 x' M4 ?( k  d" Y5 L
  May be used in sections :   defaults | frontend | listen | backend! z: a5 \# D: i; K; f3 n7 ^
                                 yes   |    yes   |   yes  |   yes  L5 x" d9 V' B; o# y' w( ^3 j( y
  Arguments : none  g9 ^; Z1 L( G+ g7 Y! B
    当声明了 "option http-server-close" 或 "option forceclose", haproxy会在给server的request头中添加 "Connection: close" 。然而有些服务器看到这个头,会返回未知长度的response,并自动避免chunked encoding,其实这是不对的。它会阻止haproxy保持客户端长连接,还会使客户端或缓存接收了未完成的响应,却认为响应结束了。
6 X$ m5 E4 c% l! t/ S& _    设置 "option http-pretend-keepalive", haproxy会在服务器端保持长连接,服务端则不会出现前面的问题。当 haproxy 获取了完整的response, 才会以类似forceclose的方式关闭服务端。这样客户端得到一个普通的响应,连接也在服务端被正常关闭。
2 p1 L, T* E6 \! |. T. r- \    建议不将其设为默认值,因为大部分服务器会在发送完最后一个包之后更高效的关闭连接,并释放缓存,而且网络上的数据包也会略微降低整体的峰值性能。但是启用该选项,haproxy会略微少做一些工作。所以如果haproxy在整个架构中是个瓶颈,可以启用该操作,以节省CPU。; I9 E0 T5 S" k( l$ S

+ v5 O8 l/ b1 _9 z: {     这个选项可以设置在frontend或backend上,只要其上可以建立连接。这个选项可以与 "option httpclose"结合, 使服务端keepalive,客户端close,但并不建议这样做。
0 V2 h& S! F) U# b( V6 A3 j% X, y5 r, z( e
* r& T* J) z" X' D6 M

5 P6 P) [1 m7 W7 \9 \0 abalance <algorithm> [ <arguments> ]
  t# {4 j, A, i6 ]7 }balance url_param <param> [check_post [<max_wait>]]6 [# L" y" r! T: R2 I3 c# C1 k' X
  定义选择后端服务的负载均衡算法" I6 h5 M, ?5 z# s, Q
  May be used in sections :   defaults | frontend | listen | backend
- Z% i6 z. O$ n/ t, f% Y                                               yes   |    no    |   yes  |   yes! x" s2 _: C/ v$ G, `7 H# Q! P( u. q: T
  Arguments :) h( x0 V% A/ |, T2 l) t
    <algorithm> 是负载均衡时选择服务器的算法,没有持续信息时可用,或连接重定向到另一个服务器。<algorithm> 可以是以下几种:- s! {  K+ |9 |0 S, ?
      roundrobin  每个服务器根据权重轮流使用,如果服务器的处理时间平均分布,这是最流畅和公平的算法。算法是动态的,对于实例启动慢的服务器的权重会在运行中调整。每个backend的活动服务器在设计上限制为4128个。在一些大的群里面, 当服务器很短的宕机后恢复回来,有时会有几百个请求被重新整合到群当中,并开始接收处理。尽管很少发生,但是很正常。这也说明了有机会监视它们,所以不必担心。
  I- L1 F8 H" C; c! j8 r" K
" X. w, B. i0 p( C6 x# [! C      static-rr  每个服务器根据权重轮流使用,类似roundrobin,但它是静态的,意味着运行时修改权重是无效的。另一方面,它对服务器的数量没有设计上的限制,服务器启动后便会立即进到群中,整个分发方案会重新计算。这会略微降低CPU的运行(约1%)。' c6 ]" P8 y4 p/ {/ J  v" o
! G6 W7 H4 d! t  O
      leastconn  连接数最低的服务器优先接收连接。Round-robin用于负载相同的服务器,使每台服务器都被使用。leastconn建议用于长会话服务,例如LDAP, SQL, TSE等,而不是很适合短会话协议,如HTTP。算法是动态的,对于实例启动慢的服务器的权重会在运行中调整。
# K" O+ P& p" A+ @. t: J* c! `# u
      source    对源IP地址进行哈希,用可用服务器的权重总数除以哈希值,根据结果进行分配。只要服务器正常,同一个客户端IP地址总是访问同一台服务器。如果哈希的结果随可用服务器数量而变化,那么有的客户端会定向到不同的服务器。该算法一般用于不能插入cookie的TCP模式。它还可以用于广域网上,为拒绝使用会话cookie的客户端提供最有效的粘连。该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是算法会根据"hash-type"的变化做调整。
2 W" |* O' \6 g* M) I/ O, b# q* g9 o* v7 y' ^
      uri        对URI左端(问号之前)进行哈希,用可用服务器的权重总数除以哈希值,根据结果进行分配。只要服务器正常,同一个URI地址总是访问同一台服务器。一般用于代理缓存和反病毒代理,以最大限度的提高缓存的命中率。该算法只能用于HTTP后端。该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是算法会根据"hash-type"的变化做调整。
3 _  R( u' c+ n/ M3 Q3 k                  算法支持两个可选参数"len" 和 "depth", 都是后跟正整数。“len”参数指定算法只处理URI从头开始的字符数,据此计算哈希。因为大多URI以"/"开头,所以"len"最好不要设为1。"depth" 参数指定URI中最大的路径深度,据此计算哈希。请求中的每个斜线为一级。如果同时声明了这两个参数,则截取URI时必须同时满足。: ~" l& C8 |2 J2 s$ u  }8 l

* Z: u: ^% A3 ~      url_param  在HTTP GET请求的查询串中查找<param>中指定的URL参数。
4 e/ r$ Z6 M( \/ [+ n! m: u                 若使用了修饰符"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被用了,则只能检查第一个块。如果参数值被块边界分隔开,则只能随机均衡负载了。+ I% A* v  Q( e+ L& K8 X1 J
                  如果参数后面跟着 ('=') 和一个值,则可以根据这个值进行哈希,用可用服务器的权重总数除以哈希值,根据结果进行分配。
$ f. r4 Y# \3 }2 s& {3 F* }                  还可用于跟踪请求中的用户身份,只要服务器正常,同一个用户ID的请求总是发给同一台服务器。如果没有参数或参数没有值,则使用轮询算法。该算法只用于HTTP后端。该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是算法会根据"hash-type"的变化做调整。
) _$ z) f+ s4 J* m. Y  Y
" X$ P; R4 H; d( E. _      hdr(name)  在每个HTTP请求中查找HTTP头<name>。与ACL函数'hdr()'一样。括号括起来的头名字不区分大小写。如果缺少头或头没有任何值,则使用roundrobin算法代替。                  8 @) C4 u, Q" P! R: r
                       启用参数'use_domain_only',哈希算法将只用于一些类似'Host'的特定头的主域部分。例如主机值"haproxy.1wt.eu",则只考虑 "1wt"。该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是算法会根据"hash-type"的变化做调整。
/ }; H' S% a0 Z  W4 r9 ^
- b: z% t, U0 a      rdp-cookie0 f7 R' a) [3 p) t
      rdp-cookie(name)
2 h1 [0 B( h: Y0 G5 f) N                  为每个进来的TCP请求查询并哈希RDP cookie <name> (或“mstshash”如果省略) 。与ACL函数 'req_rdp_cookie()'一样,name不区分大小写。该机制用于退化的持久模式,可以使同一个用户(或同一个会话ID)总是发送给同一台服务器。如果没有cookie, 则使用roundrobin算法代替。/ f* q8 U1 Z4 s2 f, z6 S. t# t) r" Z3 y9 @
                  必须注意该声明要生效,前端必须确保在请求缓冲中已经有RDP cookie,所以必须使用规则tcp-request content accept' 和ACL 'req_rdp_cookie_cnt'相结合。
+ c3 i1 V1 d1 ^- b3 G* J                  该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是算法会根据"hash-type"的变化做调整。
& `' O- r. c8 g3 v+ D9 D1 C2 e* t+ M3 k9 q2 U  S2 Y) e. d
    <arguments> 是用于一些算法的可选参数列表,目前只有"url_param" 和 "uri" 用到,例如:1 G: t6 O1 N8 |8 ]8 N! D/ }
                balance uri [len <len>] [depth <depth>]& O' y8 i% x# z: b- ~! Y! O
                balance url_param <param> [check_post [<max_wait>]]% x2 O5 j$ E! _3 W; J1 v2 L$ T
, Y7 o# x3 Y4 u- n  B: l3 @4 g
  如果没有其他算法、模式或选项的设置,后端的负载均衡算法默认为roundrobin。每个后端只能设置一种。; ~  {! V9 W0 K3 ^, k: v8 w$ j0 R% ]
  Examples :
1 T' o$ K3 j( h0 n; x9 {        balance roundrobin/ Z5 @" Q) X" q
        balance url_param userid- ^  L' C, F$ h
        balance url_param session_id check_post 64
" m2 S  c6 q$ K8 ~' D2 ?$ r: ~+ p9 W# H        balance hdr(User-Agent), b+ V$ S+ a+ g+ c! {0 q& \+ i
        balance hdr(host)
, J3 E: ?% n) w        balance hdr(Host) use_domain_only
0 D) f; J4 n0 \. N/ Q; r( @1 z: Y4 z2 g7 B# C7 n
  注意:  以下的警告和限制是使用“check_post“扩展和”url_param”所必须考虑 :
' [4 V9 `# C+ N/ [+ M    - 所有POST请求都要考虑,因为在包含二进制数据的体或实体中,没有办法决定是否会找到参数。因此需要另一种方法,限制POST请求的体中不含有URL参数 (见 acl reqideny http_end)
& K9 u( c4 j: F+ C$ [
. z/ @1 A1 D  \9 P    - 大于请求缓冲大小的 <max_wait> 值是没用的。在build时设置缓冲大小,默认16KB。7 X5 @, ]$ `, I7 i
    - 不支持Content-Encoding, 参数搜索会失败;负载均衡会改用 Round Robin。2 p. m% o) u6 ^4 Q& J5 c
    - 预计: 不支持100-continue,负载均衡会改用 Round Robin。
) a# i+ i  E$ x; d2 o( L    - Transfer-Encoding (RFC2616 3.6.1) 只在第一个块中支持。如果在第一个块中的参数值不完整,选择的服务器就没有定义。(实际上取决于在第一个块中定义的有多小)
; G' r* h% c  W9 t$ o* P+ ~7 z' \    - 该特性不支持生成100, 411 或 501 响应。
' ?# ?  E. B. N. w# A' p    -  有的情况下,需要"check_post"只是要查看整个消息体的内容。检查一般会停在任意数量的空格(LWS: linear8 W$ ~1 a3 s6 F8 Y' a% X1 ^9 H
      white space)或控制符上,表示这可能是一个URL参数列表。这可能不是一个关于SGML的类型消息体。* x% h; q7 d* b8 D7 j4 i

! m/ j2 x5 p4 \2 `+ h  See also : "dispatch", "cookie", "appsession", "transparent", "hash-type" and "http_proxy".
" p. K+ p$ w7 h& l% R6 c9 ^, K2 K
$ _% a, r) J$ Z1 P- g* _' g8 @" p
2 o1 M( i6 Z- T5 H0 P. s/ u; p: V9 H
+ J* N% Y: D# s+ W8 C# B- Ohash-type <method>
7 g' L& [& N; a+ a- K# r) ]  将哈希映射到服务器的方法。Specify a method to use for mapping hashes to servers/ g* t1 o- N3 X( P0 l1 h
  May be used in sections :   defaults | frontend | listen | backend
7 |# e# ~3 _, u2 H% ^2 Y+ c                                               yes   |    no    |   yes  |   yes7 Q0 z: R6 G$ G
  Arguments :
8 H# }- j# ~- y; Z% A* C1 z    map-based  哈希表是包含所有在线服务器的静态数组。哈希结果很平滑,并考虑了权重,但是会忽略服务器启动时的权重变化,也就是说不能慢启动。另外,服务器是根据数组中的位置所选择的,所以服务器数量变化时,大部分映射也会变化。当一台服务器启动或关闭,或服务器加入到群中,大部分连接会再分配给不同的服务器,这对有缓存的实例会比较麻烦。
+ K5 [2 V. j0 Y/ y& _
& e: ?7 U! h2 z; V8 \    consistent  哈希表是由每个服务器构成的树,会在树上查找哈希Key,并选择最近的服务器。这种哈希是动态的,支持服务器启动时修改权重,所以可以慢启动。它有一个好处是当服务器启动或关闭时,只有其本身的关系被移除,当服务器加入群时,只有一小部分的映射会被重新分配,所以是一个比较理想的支持缓存的算法。但是根据其原理,算法不会非常平滑,有时候必须调整服务器的权重或ID来获得更平衡的分布。要保持多次负载均衡时的相同分布,服务器ID是绝对不能变的。(roloand:haproxy根据服务器的ID初始化其哈希值)
/ V  W7 O, A1 Z  \   默认值是"map-based",建议大部分情况下使用。8 S0 D* R3 `& ?6 G  J2 |7 t7 w) y

/ s, d8 f' {9 Z  n8 F  See also : "balance", "server"
  {4 X7 }! V' S/ p2 g, W6 B6 A& g# u8 T8 G2 V

/ K+ K% C. B; Y, p  wdispatch <address>:<port>
: Y% S4 ^/ X5 Q3 L- u  设置一个默认的服务器地址
2 x# X* \. j; [9 B5 U/ J  May be used in sections :   defaults | frontend | listen | backend
- A1 O1 j6 E# v                                               no    |    no    |   yes  |   yes4 v5 z4 Q4 b" B/ g) ^
  Arguments : none
  H8 z1 l. t% v* |  L! e( ~3 K    <address> 默认服务器的IPv4地址,也可以是主机名称,名称只在启动时解析为IP地址。
) r5 |* j) Y0 R" L% p$ g, Y9 k    <ports>  端口号,所有连接都会发送给这个端口,但是不允许像其他服务器一样使用端口偏移(port offsets)。
- w& C0 d$ {( x- D& p! n: G% k* ?2 {
   "dispatch"关键字指定了一个默认的服务器,用于无可用服务器时的连接的处理。过去常用于前传非持久连接给后备负载均衡器,由于定义简单,还用于简单的TCP中继(TCP relays)。 建议对于明确的连接处理,应使用"server"直接声明。
9 V6 U2 q% J2 @  n* l3 }) Y4 }% }
! T# u$ `3 ^% V+ {; I====================- V; c; M/ Z- j$ K% U. @

9 R; A8 J8 i$ z0 Z$ r1 v: n2 N+ M一:Global parameters
! x/ H0 i% ]& \1 G* Process management and security
% Q0 z, v* Q6 q1 j* _- chroot 改变当前工作目录
+ P, a: Q- G) Y- daemon 运行方式为后台工作. i; {4 ]8 T' `4 x! `
- user - group 工作用户和组6 O0 A5 j: W* ~6 d, l# g0 z
-log <address> <facility>日志输出设备
4 F  `8 c5 @6 x! T. {! h! \" A) B- nbproc 创建工作的进程数目: K" ?7 L% Z1 X/ C8 |$ m6 X: q
-pidfile pid文件位置( W* [6 ]2 o+ y4 ^
- ulimit-n 设置每个进程的可用的最大文件描述符
$ M' ~+ F: i4 P- stats 创建监控所用的套接字目录: u" K, }$ a' z3 ~) |
- node 创建另外一个节点名字共用一个IP地址,用来识别哪个节点在处理流量# y! e) `8 c5 U
- description 描述实例的名称* a/ G- R" u, T7 E. C3 b
maxconn <number> 每个进程可用的最大连接数
, B3 c! h( `* S! e6 |  X* `$ d2 V  i: rmaxpipes <number>  每个进程可用的最大管道数
5 |$ b$ l1 j  i$ ?  Enokqueue  nopoll  nosepoll nosplice  禁用这些功能
7 Y2 I8 Z' u# N5 T3 ospread-checks <0..50, in percent>  health check 的时间间隔
8 ^* F7 w( o/ U5 U& Q& D! T6 }tune.bufsize <number> : i$ e* h8 x; o* X8 `
tune.maxaccept <number>
. P" F& o# Z# X) k8 htune.maxpollevents <number> , D0 [' K5 {% F5 u0 x& _
tune.maxrewrite <number> % t6 b$ t+ Q$ M4 ^  X) y, k" _4 N, n
tune.rcvbuf.client <number> ! H4 ^5 d  F; i: i; O3 a/ u
tune.rcvbuf.server <number>
) n; D7 a% n. U' Ptune.sndbuf.client <number> 4 f8 I: n  i+ l/ i' @6 r3 U8 B
tune.sndbuf.server <number>
, n6 m5 @& p9 O9 Y以上凭字面理解吧
2 C9 c, h1 R6 O  v/ M- t  Jdebug  调试模式,输出启动信息到标准输出1 _( `# O  l9 f
quiet   安装模式,启动时无输出
6 @7 R: Q+ T% G7 q5 N3 m# V. D; B6 }$ Z1 u
二:defaults 块
" o5 L2 u9 |. K作用于其后紧跟的listen块,直至下一个defaults 块,下一个default 将替换上一个块作用于以后的listen# ]+ e) ^4 [( w1 J$ ~& w
frontend 块,接受请求的端口组3 l# ]3 F/ y0 f% M. }" }- a" N
backend块,后端处理的server 组" v, |0 Q# k4 v9 H# u
listen块,frontend和backend 块的结合
& z6 t# S' I6 {
: S9 ^8 G3 \- ]% n, i) X% M. g三:常用配置命令; Y/ J+ Z* \/ o. L  _

7 |. a! v7 i' x% |balance <algorithm> [ <arguments> ]   E* p# m8 J- d; Z3 U' Z/ Y8 ^
balance url_param <param> [check_post [<max_wait>]]   负载均衡模块设置4 ~$ F* k0 f9 x$ [- G3 f( D

  s  g! j3 @. P. o+ xExamples :
7 p1 E) Z& U" V* Z6 c( Sbalance roundrobin
& {: ]4 N' ^7 N" q+ z5 C$ wbalance url_param userid  7 T! e% m  Z4 _1 H  A  J+ p; G2 N
balance url_param session_id check_post 64   Q9 l; a" C; ?; X, d
balance hdr(User-Agent)
& V7 b5 f, n# K6 o) [balance hdr(host) % q, r9 {+ A% m7 d7 |. i
balance hdr(Host) use_domain_only
5 t4 X8 @0 a; M. j! d1 Z3 s( Y6 s- j
block { if | unless } <condition>  在7层阻止访问8 O5 E$ O9 J8 z5 u! N; s
Example:
3 ]+ {, _1 s, X: k7 Tacl invalid_src src 0.0.0.0/7 224.0.0.0/3  acl定义和squid 很像
: P) s) n) ^1 iacl invalid_src src_port 0:1023
# g" O' z2 [) t& y$ o' L5 aacl local_dst hdr(host) -i localhost * y7 ~4 |1 C0 N2 I& i( x2 S+ ]
block if invalid_src || local_dst 7 Z* k4 U% Z# b. n& P/ q% O

7 K3 L5 |; V7 s0 i$ v3 g2 Ucapture cookie <name> len <length>  在请求和回应包中捕捉记录指定长度的cookie,name 为cookie的开头几个字母
3 {1 b/ P$ G' t& F; F  a/ J! U# ?; o  {
Example:, C  u" [) G0 ^. |% ^% V" O
capture cookie ASPSESSION len 32
: e5 [. g. u7 M. {- [; C5 s5 `7 x% Q4 Q
capture request header <name> len <length>
4 v& y% z( \, u% xcapture response header <name> len <length> 同上" e- F! q3 P+ g; L; Y  l
9 t1 V4 G* K( i2 g( F5 j
clitimeout <timeout> (deprecated) $ B1 W8 Y: t# N
contimeout <timeout> (deprecated)  客户端超时时间,不赞成设置
" m, z- x/ E  ]: n: d4 n  B0 k7 j- A1 P
cookie <name> [ rewrite | insert | prefix ] [ indirect ] [ nocache ] [ postonly ] [ domain <domain> ]*   允许持续的基于cookie 的后端连接
7 G& ~% J8 ^3 R$ N7 k% f! k# L9 ?" L, ?
default_backend <backend> 默认应用的后端- o8 _9 A& y. @' Y8 |

' U! m% a9 T/ g6 {2 R* ]Example : % Q- n+ b1 K3 J/ q& p0 B
use_backend dynamic if url_dyn ; H. `3 p# w' _2 ]  M
use_backend static if url_css url_img extension_img 4 t) ^4 {6 T# w# a& }5 F  e: }
default_backend dynamic    当没有匹配时就用dynamic- N2 p0 r" w3 L& i2 W4 c! ]
( ]8 O  D% b0 v: b- q9 x
errorfile <code> <file> 定义出现错误的代码的返回页
  r* t9 U, z) s0 M2 c6 V/ yExample :
" f6 \  W, r3 @# x" qerrorfile 400 /etc/haproxy/errorfiles/400badreq.http
3 }0 c6 w! c7 R: `4 h3 @4 j' U  Rerrorfile 403 /etc/haproxy/errorfiles/403forbid.http 3 j1 U# W" d) @  S7 V' C7 ^
errorfile 503 /etc/haproxy/errorfiles/503sorry.http % A) {  E9 {+ R: w

# a: x* l8 G5 q4 F* h7 o$ M5 \8 s6 x/ {
errorloc <code> <url> errorloc302 <code> <url>   出错重定向到指定url
1 f% {% @8 X" {9 O5 kforce-persist { if | unless } <condition>  在特定条件下,强制继续连接down 掉的服务器后端- y; n. V9 t" O! f
fullconn <conns>  定义后端组的最大连接数$ P% ~0 n2 r# L3 {1 r6 v3 E1 I  k
grace <time>  haproxy停止后,再持续多长时间用于处理连接- Q* G7 q8 E' A. y8 |! E
http-check disable-on-404  如果后端检测返回404,将不再把后端计入负载均衡
% p. P  T% i5 J5 n( \: nhttp-check send-state 允许haproxy 发送 X-Haproxy-Server-State7 S) U" |: m& b+ {3 Y- R
http-request { allow | deny | http-auth [realm <realm>] } [ { if | unless } <condition> ]   七层访问控制
0 P: |  b) P% B3 D# \+ CExample:
0 e8 W. R  O; _1 ?1 }: ]+ Uacl nagios src 192.168.129.3
) c' `  r, R/ T7 {acl local_net src 192.168.0.0/16
5 {" }  q; g3 M% }2 tacl auth_ok http_auth(L1)- j, _/ b- ^8 I, d0 P
7 h4 B8 p) v6 P5 T+ }( T4 }2 B5 g
http-request allow if nagios) X$ n( K7 ^4 k7 U  A2 Y# ^7 Y
http-request allow if local_net auth_ok$ }' }. R' i$ s4 f. F
http-request auth realm Gimme if local_net auth_ok0 ], G* K% p4 ~4 C+ E
http-request deny( _3 P6 h! R2 H- F- j* l6 n
. p  {4 Z( X; g! ]
Example:
& ^( V0 V: G' M# v! n7 Oacl auth_ok http_auth_group(L1) G1
3 l: C# k& a- Q+ Q5 ]: l. I" ^6 d4 b4 P
http-request auth unless auth_ok
: p+ l( u! G5 r. T* U
6 o& X+ q- t* Jmode { tcp|http|health }   设定启动的实例的协议类型8 R- {1 H9 q! e$ N" a7 u
monitor fail { if | unless } <condition>  监控失败条件设置+ Q6 S6 S8 s; V- d; h# i

: V3 r* @- J* u8 W/ R) a! `option abortonclose 丢弃由于客户端等待时间过长而关闭连接但仍在haproxy等待队列中的请求
$ ]6 g# Z" I1 ~9 F/ C7 j8 [( woption accept-invalid-http-request  接受无效的http请求,建议关闭(开启可能有安全隐患); H8 X; Y* Z. Q) d/ J
option accept-invalid-http-response 接受无效的response ,建议关闭7 l1 Q$ ?# M, u) G' U! f: w1 k- V0 W
option allbackups  应该是后备服务器,如果正常的后端无法使用,就使用这些后备的设备,balance方式还是用原来的,没有优先的选择,常用来提供错误的页面
* k: j4 e' T+ d0 o. qoption checkcache    分析后端response,阻止可缓存的cookie,它对response 进行严格检查,包括"Cache-control", "Pragma" and "Set-cookie" ,查看在客户端代理那边保存是否有风险,如果这个允许的话,符全以下条件 的response 将被允许,其它的将被阻止。( F' G+ o  ]# Z
- all those without "Set-Cookie" header ;9 u! Z# ~8 }" a% V/ a  T
- all those with a return code other than 200, 203, 206, 300, 301, 410,
! \7 N5 Z8 K4 P9 y; h: tprovided that the server has not set a "Cache-control: public" header ;2 ?$ Q, E% ]8 n3 y
- all those that come from a POST request, provided that the server has not
: a8 \/ J: e6 b. v: n5 sset a 'Cache-Control: public' header ;
# X! k1 }  @- p% I" a+ s6 g- those with a 'Pragma: no-cache' header) I/ E  S0 A1 B. h# r
- those with a 'Cache-control: private' header8 q! a3 c" ~0 v) b! o
- those with a 'Cache-control: no-store' header
9 O+ J3 {3 R) z) I9 A. x  c- those with a 'Cache-control: max-age=0' header# y6 Z$ T* Z) f( g0 h8 R" Y7 l& F
- those with a 'Cache-control: s-maxage=0' header
& C; X* x* N: A- V8 D- those with a 'Cache-control: no-cache' header
$ [; D3 H8 Z' M2 t; U# Y3 O! W: R- those with a 'Cache-control: no-cache="set-cookie"' header: O( r% T% S  _6 y6 T$ n' [  A
- those with a 'Cache-control: no-cache="set-cookie,' header
& z" y8 D; Q' Y3 f" |(allowing other fields after set-cookie)1 ^( A+ ?3 Y% G8 ~# U$ V

3 u; N3 V4 q# j. J2 S" `! Ioption clitcpka   是否允许客户端发送tcp keepalive 包,这个和http 的keepalive 没有关系+ Z( x$ r% D' M% {! Z( J7 r
option contstats   允许连续的流量统计更新
. D- y) o# D7 B1 C' Ioption dontlog-normal   开启正常连接的日志
5 N( w; u. z( d) A8 ioption dontlognull   记录空连接
6 e" W" B5 \$ c: B/ {% o1 Loption forceclose  允许关闭session 在后端把response 发送后1 x! q/ H1 [3 M7 `( {" D: ~' B" O
option forwardfor [ except <network> ] [ header <name> ]        允许在request 中加入X-Forwarded-For header 发往server5 z3 E1 k& `, K! r" H3 G7 K1 a) E
option http-pretend-keepalive    定义是否haproxy要宣布同server keepalive
+ m6 c! `2 q; W, ioption http-server-close   是否开启在server 端 connection closing3 R7 [" s3 d9 T5 i
option http-use-proxy-header    用non-standard Proxy-Connection 替换 connection
" Z; K2 ?$ Y! N. }( ~/ W2 p* _2 H# `! A/ _+ M; i" H3 P
8 I: Y# d0 b8 V" N5 W6 g  l; p
option httpchk <method> <uri> <version>  允许用http协议检查server 的健康
) W0 O- r) ]0 Y0 ^& QExamples :4 @" O, S- B2 Y; C' q: b$ s' i
# Relay HTTPS traffic to Apache instance and check service availability
$ l8 |  O3 D* W# using HTTP request "OPTIONS * HTTP/1.1" on port 80.
; k% O0 I* h$ s. H, Z8 I6 kbackend https_relay9 z. ]7 i5 ?7 N. E) y
mode tcp$ Q5 j3 z. a) G5 c2 y
option httpchk OPTIONS * HTTP/1.1\r\nHost:\ www, o, P& H6 F# P1 m2 }: \
server apache1 192.168.1.1:443 check port 80
$ w, [) s  Z/ W3 `2 h
- n; O* p; s) poption httplog [ clf ] 定制日志格式
2 f& ], T8 m7 ^- _, X( [option http_proxy  开启http 代理模式,只有最基本的代理功能3 z6 ?5 t$ I8 w- l4 @# s6 b
option ignore-persist { if | unless } <condition> 在某条件下拒绝持续连接,适用于对静态文件的负载均衡/ w+ \; h; L0 D# g, E* Z7 \# K
option independant-streams  启用双向超时处理,如socket 的read 和write : t& d5 F2 d7 g, H0 C7 D
option log-health-checks   记录健康检查日志1 M& b/ U% M- F# A! R5 M# O
option log-separate-errors   对非完全成功的连接改变日志记录等级" V( ?9 b2 ^: V" v2 h9 c4 L
option logasap   大传输大文件时可以提前记录日志
* w7 q, \0 o: t0 t! ^* U0 ^3 eoption mysql-check   mysql 健康检查
2 f! P( Y* s7 {7 _option nolinger  清除肮脏连接后开成的tcp 状态及占用的资源,不过并不是强列要求你用这个选项,当然如果你有thousands of FIN_WAIT1 sessions on your system ,那肯定得用了! c" r: s+ Y- W  a; _
option originalto [ except <network> ] [ header <name> ]   允许在requests中加入X-Original-To header 发往server  v8 U4 ?& w+ P3 j
option persist     强制将http请求发往已经down 掉的server
8 j7 J/ d+ z  t1 `9 T" Coption redispatch   是否允许重新分配在session 失败后
, i3 \4 |  @4 N/ g0 coption smtpchk   smtp 检查
2 C: u! r/ C" F5 B1 W+ x) h8 e7 U" \option socket-stats  允许对单个socket进行统计
. s. @) k' M3 Z9 F  s2 G3 U; ^option srvtcpka  是否允许向server 发送keepalive: @4 f, W) U. K$ y) X2 Q9 X2 \$ }
option tcpka 是否允许向server和client发送keepalive
5 F3 g( Z1 P2 X  T8 K" Aoption tcplog  允许记录tcp 连接的状态和时间
* j0 z: Z% N  U' ^( moption transparent   允许客户端透明代理. j+ R$ E; G* g! l, K* h9 D
rate-limit sessions <rate> 设置frontend 每秒处理的连接的上限,如果到达上限就停止建立新的connection; w* ?* ^, B+ J, x! r
$ e1 Q) U7 l* J  W, @/ y
redirect location <to> [code <code>] <option> [{if | unless} <condition>]
, ]7 g: E) h! j" g2 Mredirect prefix   <to> [code <code>] <option> [{if | unless} <condition>] 重定向,相当于rewrite4 h# s. r, t& m7 h" I

4 q) T3 N) v0 r: w) ]Example: move the login URL only to HTTPS.; I8 A  A1 K! `: l
acl clear      dst_port  80
  i1 Z* E# c" V) ~! |3 k5 }& V) racl secure     dst_port  8080
; }- o4 d6 R0 h& ~7 I, Xacl login_page url_beg   /login
0 }3 K# l1 J( M5 ~% Z4 t% q* o7 X9 _acl logout     url_beg   /logout
4 I) X% `' ]; b- \" J) G0 ^  ?9 |$ H; Wacl uid_given  url_reg   /login?userid=[^&]+' Y* _, a! w1 S
acl cookie_set hdr_sub(cookie) SEEN=1- H( L  i* C. }9 Z( c) }
, T) X7 o  h% f0 H1 g1 {( d- a
redirect prefix   https://mysite.com set-cookie SEEN=1 if !cookie_set
) X9 m+ \5 j$ h- ^redirect prefix   https://mysite.com           if login_page !secure; T: c& |( L& c) S
redirect prefix   http://mysite.com drop-query if login_page !uid_given/ e& U; Z" ?- s7 u. |9 |6 g5 F* ]
redirect location http://mysite.com/           if !login_page secure. c! O" p! D& c6 L: t
redirect location / clear-cookie USERID=       if logout; v. x4 X" W$ g
! s5 I. S7 `* t8 q5 v
Example: send redirects for request for articles without a '/'.
% k/ ]! c) c  z* s7 Q" m$ Q6 Zacl missing_slash path_reg ^/article/[^/]*$
7 L' z' [6 f( f" O& j. Aredirect code 301 prefix / drop-query append-slash if missing_slash
0 K3 A! {, k+ W' v: W  dredisp (deprecated); ~, e& E# z* Z8 G
redispatch (deprecated) 开启session 重新分配在connection连接失败后,不赞成启用, f) k) W; w+ y- n9 z: s) R0 G, n
reqadd  <string> [{if | unless} <cond>] 在http请示的末尾加上string
- m( E0 ~( B  r& E# M1 S$ c) h( R; m6 D: Q' z9 A. D
Example : add "X-Proto: SSL" to requests coming via port 81* S; F% h; ^6 {, z' `
acl is-ssl  dst_port       81
4 K$ G9 g! n& |9 f$ N$ E8 t2 y) Rreqadd      X-Proto:\ SSL  if is-ssl
, {( c' `; A/ ]6 V2 h
* ?8 C# K5 g2 R/ Greqallow  <search> [{if | unless} <cond>]! f& A4 ]$ g0 P& M, @/ G
reqiallow <search> [{if | unless} <cond>] (ignore case)    request 请求访问控制
2 D" f$ W, f' F; B8 {& }/ e' q! C# P/ D, M
Example :$ u7 \- L: `% W8 s& U1 w
# allow www.* but refuse *.local3 }) ?# Q) v: R( o( q1 O
reqiallow ^Host:\ www\.
9 E1 s+ \/ l1 m/ ^$ `  jreqideny  ^Host:\ .*\.local9 R$ [, B" o: ~; b1 Z9 g1 j" A

: u; v  r8 V$ r& _* j5 L" ^* |. Ereqdel  <search> [{if | unless} <cond>]& V7 @% A2 K- L0 h# [# g5 r
reqidel <search> [{if | unless} <cond>]  (ignore case) 删除请求的head 中的内容
& O* _4 R4 o+ E) C- i
3 p1 Y' w  L# F0 _# e+ Q# vExample :5 R9 `8 \; h# @
# remove X-Forwarded-For header and SERVER cookie
; p$ t! U0 _% `0 {2 ^reqidel ^X-Forwarded-For:.*# w* l& h9 K( u; Y4 W
reqidel ^Cookie:.*SERVER=' p* Q/ Z1 G% k# A' M. K* B+ [% @

  j5 I: E  z! ?+ h
! C8 \0 O" U+ u' z% {4 Preqdeny  <search> [{if | unless} <cond>]
, C; a' j- r( G4 j. s; ^  X$ vreqideny <search> [{if | unless} <cond>]  (ignore case) 拒绝访问; d# _) j4 a& R& x% d: j$ Z

! E) s' Z  I' Breqrep  <search> <string> [{if | unless} <cond>]/ o: x7 g1 i! j
reqirep <search> <string> [{if | unless} <cond>]   (ignore case)  request 请求替换
$ F3 V5 b! C" M) S, gExample :
) s8 W+ ]/ n9 s8 ?% ~) W# replace "/static/" with "/" at the beginning of any request path.
0 Y5 v, s0 x5 m" J4 hreqrep ^([^\ ]*)\ /static/(.*)     \1\ /\2
+ L  O& [0 c7 m) |# replace "www.mydomain.com" with "www" in the host name.
' N1 V7 V) M3 v$ Breqirep ^Host:\ www.mydomain.com   Host:\ www
1 \; }* [/ T& k. z' g$ C$ q8 y- |8 w9 V8 _' e' q
reqtarpit  <search> [{if | unless} <cond>]9 d7 e# X" {9 J, F9 }0 ?* c
reqitarpit <search> [{if | unless} <cond>]  (ignore case) 阻止http请求中的某些信息
% ]2 l: P) x2 Y) c6 D# Q; l* k' v* T: u! u4 g
Examples :
" n2 O. e+ Z5 [. g5 z' Q* M# ignore user-agents reporting any flavour of "Mozilla" or "MSIE", but
+ J5 H5 C9 E. q# ]3 L! F& `5 L# block all others.2 R4 w1 M  D1 H! K$ Q  k
reqipass   ^User-Agent:\.*(Mozilla|MSIE)% l' m: S- r% j( \6 f0 k/ v( h
reqitarpit ^User-Agent:
+ M7 ?  J, o& m6 O0 U# C" J. c
; I2 d6 @9 C. n8 M. S# block bad guys: N# k- B  k; F8 n7 Z& Y
acl badguys src 10.1.0.3 172.16.13.20/28
; F* T# M' s# Dreqitarpit . if badguys
0 M/ N* i$ c6 _: v9 G) P1 i- a% j, i. ^* ?/ I7 R% z
retries <value> 当对server的connection失败后,重试的次数
  P: H1 z' p8 O( Rrspadd <string> [{if | unless} <cond>] response 增加信息4 `0 C6 t3 B# c- T5 U' X; ?
rspdel  <search> [{if | unless} <cond>]: Z" t2 {1 ?- K3 @* D: _8 a
rspidel <search> [{if | unless} <cond>]  (ignore case)* J, |! g( j4 T' r4 N
rspdeny  <search> [{if | unless} <cond>]
; M/ y$ e# ]6 Wrspideny <search> [{if | unless} <cond>]  (ignore case)
, w2 U; J' [& W+ O* xrsprep  <search> <string> [{if | unless} <cond>]
( O5 T* {+ J& @( \( q$ r6 B0 _, prspirep <search> <string> [{if | unless} <cond>]  (ignore case)
; N* f. |' a+ I+ \以上和request 的差不多
$ ?' E6 P, N. y& J/ e9 y1 O' p9 K
6 ^8 O$ r- J8 h/ C& T4 [source <addr>[:<port>] [usesrc { <addr2>[:<port2>] | client | clientip } ] 定义从代理出去的连接的对象,用于限定地址可以访问server
! K4 W7 g0 {: }" [$ ^7 \- w$ D1 J: e
一些timeout
, |- T0 p, H; f" J. f/ M1 d, V1 D& O4 j% x9 [
srvtimeout <timeout> server 处理超时,不赞成设置
1 ^1 S! [) X) k, f" o/ \% |timeout check                             X          -         X         X
- i. [) K; I' o& u. m# ?6 itimeout client                            X          X         X         -) z: _6 P6 Z& u+ J3 o8 Q3 t; H% k
timeout clitimeout          (deprecated)  X          X         X         -
( F3 q% @! s/ T0 rtimeout connect                           X          -         X         X
& G; H  p5 Y' E/ @timeout contimeout          (deprecated)  X          -         X         X. i6 v2 t) Y* c
timeout http-keep-alive                   X          X         X         X7 T6 [6 J9 s3 [9 E: o$ F7 X
timeout http-request                      X          X         X         X) Q) e! c0 P) ^- [5 m
timeout queue                             X          -         X         X2 f1 [$ \5 N7 D9 L  J& ]
timeout server                            X          -         X         X
& F% d$ Z9 x: V4 E' v9 Btimeout srvtimeout          (deprecated)  X          -         X         X9 L4 s& ^8 p. W5 J
timeout tarpit                            X          X         X         X
* e' r; Q/ {1 H' x% \6 o+ m  c$ ^  m4 m
+ I  Z. V# {' ^! K! I0 @: ?
stats auth <user>:<passwd> 监控统计的帐号和密码/ u+ j. O4 \3 L# [% q
backend public_www
6 [& g3 D6 G: c! Q6 jserver srv1 192.168.0.1:80" t) w: W8 f6 X! o4 G
stats enable# q$ {4 v+ q, B, g. B
stats hide-version
* c5 b" N, o: S" l6 U5 @stats scope   .! G2 x0 V7 o2 G# x+ q4 U
stats uri     /admin?stats
2 e# ~7 `) u3 istats realm   Haproxy\ Statistics
$ |: y( j. x; rstats auth    admin1:AdMiN123# C( _* c0 T( q  F
stats auth    admin2:AdMiN321# @. t. P4 |$ S' T
, P9 H6 ?9 a- q2 t3 X" r+ ^
# internal monitoring access (unlimited)
1 a0 }$ h2 d" N) Bbackend private_monitoring
, |* V& h; v) t0 I, y! zstats enable
. p) Z1 j  z# i  t$ f6 cstats uri     /admin?stats6 M; h# `1 r: ?" `& P. F
stats refresh 5s
5 Q# a7 S" ^6 s- x' Y1 R" C; s/ E3 \: v8 n
还有很多参数,以上能用到的也没有几个,只要满足当前需求就好,对于性能要求高的话,建议把不需要的功能 都关了吧.
7 c& w0 {4 m9 \
4 T  e" A' }2 q7 W& Q====================
+ s& t, D  {) s: T6 H* f4 @; w( ]3 y9 ~) H  e& z: B
HAProxy的配置示例
: Q& R. H# ]+ @9 n% I% a
; ]6 f4 L, G/ ~HAProxy配置中分成五部分内容,当然这些组件不是必选的,可以根据需要选择部分作为配置。" I6 }1 a( N3 T2 F& G
global:参数是进程级的,通常和操作系统(OS)相关。这些参数一般只设置一次,如果配置无误,就不需要再次配置进行修改, z9 C$ G8 l  _: U- x) z& e
defaults:配置默认参数的,这些参数可以被利用配置到frontend,backend,listen组件
- p4 j2 r! i: ?/ [9 Jfrontend:接收请求的前端虚拟节点,Frontend可以根据规则直接指定具体使用后端的 backend(可动态选择)。
. U" i) }6 Q5 i" Q1 mbackend:后端服务集群的配置,是真实的服务器,一个Backend对应一个或者多个实体服务器。
4 J; P; U6 p$ f9 r# Ylisten:Frontend和Backend的组合体。( f" \9 i5 ?# T1 ^5 Z' u
' R# @1 J* `: ]6 Z3 ~+ S
下面是HAProxy的一些常用的配置,这个配置是用来说明HAProxy的一些常用功能的配置,具体详细配置请查看安装目录下的doc目录下的文档文件,或者到http://cn.haproxy.org/下载中文配置说明文档& ~5 p  e! j. ~- D0 G  n! B6 E
0 B4 G  a& V9 _( D- s
配置具体实例,后附说明:% N0 m# d: a+ K3 {

/ l  C+ `& C" K' K3 G: vglobal
- e+ _0 a& h- {5 |; Z7 N$ ]7 H7 d! K" T
#全局的日志配置 其中日志级别是[err warning info debug]# @3 g$ W& }6 _* E

6 P, S+ Z, J" L#local0 是日志设备,必须为如下24种标准syslog设备的一种: $ h% C% @# \; r: e# q! S
8 u9 f2 Y  B7 y% a, y
#kern user mail daemon auth syslog lpr news 8 W$ a( ]- O( a) e% Q' V% O7 V2 z) S
/ V" L  r5 L* G3 g
#uucp cron auth2 ftp ntp audit alert cron2 * \( |8 n# j8 ]! x5 I

7 M+ I! m; {$ s#local0 local1 local2 local3 local4 local5 local6 local7 ) i1 |3 s( g; p6 s
5 V8 i: T& ^5 n1 o- J9 ^" p
#但是之前在/etc/syslog.conf文件中定义的是local0所以* k" {* i3 V- N4 l; z! U0 G& |! t
2 E, o( M7 h. V' t' _) s
#这里也是用local0
% H9 q2 S  ], \" d3 S# |" M3 k+ z9 }: N% Q$ j( Z" u% e: f4 @
log 127.0.0.1 local0 info #[err warning info debug]# I- V8 k8 \2 e9 X* C$ D) P" {

) P/ Z) d7 q$ e+ V5 J#最大连接数
: d$ w+ ?, ?* x! M; X
# ]# r/ N- ]" q, o! z' }maxconn 4096
. s- \* c) Y# y; a/ k
6 u+ a1 t8 i: F  r; ^" i# ^7 V#用户
% n  B1 \. |! \, A4 z) x0 a
, l( @4 A5 q: B# Q% W7 Z: f! juser admin0 Z" |( x1 ?, A
4 {. C/ r6 ^) @. P
#组' T3 x4 Z% Z! I* K
1 M+ u6 k* c# a% W+ h8 b
group admin
; ^8 p, O" D0 h1 I. d5 w  u$ F# p" `6 W
# g  s0 m4 v" o, R+ @' E#使HAProxy进程进入后台运行。这是推荐的运行模式7 f0 X9 M  U. P& p$ g

5 u5 c$ P- k: e& Edaemon2 ^% f' L) L5 Q+ O9 a& X: V: i$ g
9 q* ~! i5 Q4 L) z1 a. i* F
#创建4个进程进入deamon模式运行。此参数要求将运行模式设置为"daemon"
& e, H! ]* K, q' W  X! Q' b8 D2 l% x. n1 T- R$ A
nbproc 4& \* i- ^2 j8 C' d; x* ~

: k/ y7 Y  b- ^5 s#将所有进程的pid写入文件 启动进程的用户必须有权限访问此文件。
) @- x4 v8 [$ [( a. c& v' s" \
+ L9 Y, b. H  a+ ?2 zpidfile /home/admin/haproxy/logs/haproxy.pid5 z9 W" r* Q$ R, u" C

; Z5 m+ x3 ^9 E, k( b& P2 e* c2 Fdefaults
4 g9 A3 `( r# t2 V+ [/ c
! r$ p0 Y2 J' c# l4 A9 a3 Y#默认的模式mode { tcp|http|health },tcp是4层,http是7层,health只会返回OK
% J4 R# p" p7 G/ t3 k8 y+ o4 p# p# A* g3 ~8 s) O; `
mode http" Q/ Y$ v. U- B

' F# }. {; \/ E2 l1 i" W- O4 [#采用http日志格式0 M2 y- P2 U( k7 z& p$ Z3 `

6 m; v! ^# i, R2 d# Woption httplog6 N  d& b" m3 D( a; }4 H- c! F: x. F
( |' _1 S9 J, a7 K7 I+ ^! X
#三次连接失败就认为是服务器不可用,也可以通过后面设置
3 j" n; s; g3 b! l" H2 q: v: o: W4 \: |/ v( Z# p
retries 3
5 ~% P. z% u( r
' x) m- x; F! F2 X3 e如果cookie写入了serverId而客户端不会刷新cookie,! i7 j0 l- D& j  k; s

4 Z/ h4 Q" A/ j! X$ q- Y" X6 Q#当serverId对应的服务器挂掉后,强制定向到其他健康的服务器
/ ~4 i( X& `5 ^! b0 P7 |
  O' n. s2 k+ q) ooption redispatch# J, d& n! L" J/ a; l* C+ q
8 l3 @' H0 N/ r8 D8 i
#当服务器负载很高的时候,自动结束掉当前队列处理比较久的链接/ H3 r& V' o* T$ @# F+ ^

2 v9 @, A; P5 p2 n4 y% a' ^option abortonclose
8 C) `) o% d2 \- v, k" ~1 {& S0 T7 f7 }* `2 f# G
#默认的最大连接数
8 \) K3 l- q6 X/ ^9 X
/ T4 ^( i( d! }4 q5 q! y9 h4 dmaxconn 4096
2 }$ b) }0 Y. b6 E7 U
  V8 I+ S  q% ?#连接超时
& n5 }3 c6 P/ X4 l) W: O
: G! ]3 o. A( s; v0 Kcontimeout 5000
3 [* d  H0 H/ e6 v* `3 I, ?
0 C. E* z8 K% p4 w- G5 ~6 N# g#客户端超时* ?$ m' @/ s5 P% A
* X, f: `+ Y* ~) u8 c  x+ O
clitimeout 30000# N5 A: s, w' H& h- B
( A8 V& ]! }: g1 D) o
#服务器超时2 E2 c0 d/ b! P7 J
& }2 L# J8 i* D; J2 A' e
srvtimeout 30000
0 p! J, r! \) W9 a8 w; z5 K! t$ ?. k+ b) R6 |
#=心跳检测超时
& V+ ?4 {: D; _9 m: u- s' ]& Z+ k# l: N( I* |; g0 d3 H" x! l; A$ E- Q
timeout check 2000
& c8 O) U) W/ x: |; U" A% ^) `1 x  M, e0 R
#注:一些参数值为时间,比如说timeout。时间值通常单位为毫秒(ms),但是也可以通过加#后缀,来使用其他的单位。
& i) B. n' r  T& M6 v3 D- n
. J! b1 \: S9 B& T/ N% r- a#- us : microseconds. 1 microsecond = 1/1000000 second, T( I5 S0 q' \" S5 |/ d$ N
. S' I) v' V+ r  B
#- ms : milliseconds. 1 millisecond = 1/1000 second. This is the default.3 m: q# L! T! k( n* {/ @
5 v- w8 ~( R, h4 c
#- s : seconds. 1s = 1000ms. {: Q) ^1 l3 G
2 |4 r& A" b8 P# d
#- m : minutes. 1m = 60s = 60000ms/ Q2 G/ v: s* ^/ a3 V
8 O& y6 E9 s5 ~+ T5 e
#- h : hours. 1h = 60m = 3600s = 3600000ms
) R9 C0 [# U, k: N
3 G( i# K; z) h: G#- d : days. 1d = 24h = 1440m = 86400s = 86400000ms
( z! x) Z1 [4 j. b( h
( R6 M' Y" a9 n. l* i; Y########统计页面配置############; z) B% z- U9 ?* B1 ~0 T

& J- f3 g* t& G* Tlisten admin_stats- K2 _* }+ t/ I3 c6 z) Y

( c8 b' N' j) n4 V#监听端口
  F7 p1 o7 {8 ^, |; ]: q" U4 @/ F% p" k* }5 Q2 P5 R! z  A7 [( [
bind 0.0.0.0:1080; v; `  X% `+ n9 U* K2 `8 l, q
0 Z  o  |, _; u* [  K$ E. ]$ t0 b
#http的7层模式
+ D$ k& X# n( N0 ]& b' n& H
9 ~; E5 ~* u) R5 i. p# w2 o) vmode http
$ J% J! p9 d& Y# S* \/ f& }! a
& q3 _8 r# M5 u! h- k7 t#日志设置  Q- h% @: a- `
& i0 Z7 S8 I/ ^3 s8 j9 k6 b
log 127.0.0.1 local0 err #[err warning info debug]
( y, e2 E( X9 s2 ^+ [. I# n1 c6 z1 f3 a  D$ q8 g: @% w# F$ K
#统计页面自动刷新时间
9 P7 ^9 K4 R$ O' v( I. B; [  T, W- l* c$ x7 b
% i0 C" t5 Z/ T7 Z2 B8 G3 j: m* Gstats refresh 30s
7 O" L1 x: ~( _& Q- M: e+ e# ^- `, N
#统计页面url
: v- U$ g) ^) U. J/ Z
- r) Y% l2 O% m, Bstats uri /admin?stats, H& e  P+ Q8 x6 U. B' p. @
, }' f7 X4 g  G& e
#统计页面密码框上提示文本3 F) B' D; f, m0 {

4 y2 |* w% d* c" E% q8 X: u& Tstats realm Gemini\ Haproxy& D' D& L7 Z8 y9 _: r. ~

5 m" H' F; y* f4 x3 L7 c#统计页面用户名和密码设置  Y7 F" P) f% Y
) S( V+ q9 E+ K7 Q
stats auth admin:admin
2 e" H9 T# j8 {3 a8 D
9 E  q/ B8 t% b: J4 p3 jstats auth admin1:admin1/ P! e5 V  q8 @. C0 M

7 y% s' A# H) x/ n* C#隐藏统计页面上HAProxy的版本信息
3 C- K; J! S, t
$ J" y3 X% C8 Kstats hide-version' ~4 x" U8 K! `
; D+ F( N/ ?" l5 o' |
#######网站检测listen定义############  v1 k  k' n. K- H0 w" g( e

" }( u. m: C" K: U! }listen site_status1 h3 B$ e1 }( ?& V) [) T
2 \" J) Q% `, l+ ?* g" n
bind 0.0.0.0:1081% l6 F8 u; c1 u
3 g/ t# }$ D  R; x
mode http
% X0 a; ~. U  h1 e) t6 c, l2 |! M, j! P1 A; o+ Z2 @
log 127.0.0.1 local0 err #[err warning info debug]8 H, D% I4 t  D5 u( o( x5 `7 f. v. X! u
8 \( E8 S4 I- S1 C5 n( k6 ~* Z
#网站健康检测URL,用来检测HAProxy管理的网站是否可以用,正常返回200,不正常返回5009 T0 p( v& A8 u6 |

  ]7 g) l  _- }( \4 @6 ^monitor-uri /site_status
) \2 I- j1 ]$ a8 t. `) G; G4 h( e8 ^- c& |" ?/ A( p
#定义网站down时的策略. @. c/ R0 S; u$ l+ Y
# y7 P" y# W7 `, r
#当挂在负载均衡上的指定backend的中有效机器数小于1台时返回true
' }  H  M. e/ u. G1 C+ F, |2 B) v
! K* a/ W6 |  A$ j4 g" _  Iacl site_dead nbsrv(denali_server) lt 1
1 @' u: _; a" L
& p! Q' N, Z( F; X9 R: sacl site_dead nbsrv(tm_server) lt 1   x% h& Q" P, r
9 @" @2 E8 P. A5 U0 o
acl site_dead nbsrv(mms_server) lt 1( J  C8 C. `& P
8 ?3 B( W- k3 J, r, p: f
#当满足策略的时候返回500
) y$ [* f  _: Z: ~% y
" B2 i( ]) `6 i4 Lmonitor fail if site_dead. K# k+ Q/ h: Y1 r3 O

/ U# ]# e. |0 R' T#如果192.168.0.252或者192.168.0.31这两天机器挂了3 V9 k6 }& P6 e  x2 h
4 F: `2 c% N1 \. b: v3 x4 X$ A
#认为网站挂了,这时候返回500,判断标准是如果mode是& u. K3 d/ b9 w, `" {5 @

" x/ ~4 `( H7 e% c$ J#http返回200认为是正常的,如果mode是tcp认为端口畅通是好的4 N3 P2 i; o7 Q" v# X

1 t& E# }+ @: |3 k2 X3 O+ z) Xmonitor-net 192.168.0.252/31. t" \) U6 J% a. w/ U0 }2 r  ^  `

# c+ O. @, L1 l! S7 Y4 l& a$ r0 f3 q########frontend配置############
: S, |* D) y, W+ X; R6 Q- n& q# k) }, ~
frontend http_80_in$ f: B2 o* k: [

! W8 o6 u/ ~- r% `9 c#监听端口
+ Y' c+ Q0 t( m" E; f, Q9 L& y
* l; e& b& ]/ I/ W9 ebind 0.0.0.0:80' Q5 Y- |0 X, t  k, S9 }, k
; v  ^+ J7 e. ^" S7 h" A- N# A! w
#http的7层模式
$ N1 G1 H5 r0 z- V5 i; Z# ^. i1 D; S0 D( Y9 g
mode http! }- p3 l1 C7 Y0 z# F" G

% h4 Y' ]; j9 ]$ D0 V5 J4 \# X0 Q( T#应用全局的日志配置
5 U1 [$ X! P7 d8 @
% `- [: G9 w6 _- d* H- C: }1 C) qlog global% F  o( z- p* Z& i6 h: j* }

  v9 ]1 _8 X7 ]8 @8 M3 x#启用http的log( [4 w6 p% e: C
; ?% J- E. s5 X, T
option httplog: J1 j3 ^/ @4 P  D1 y. A7 [/ u
, _# N& o$ H1 a* H7 g
#每次请求完毕后主动关闭http通道,HA-Proxy不支持keep-alive模式% t$ c+ f- _3 P  ^

+ X! k6 U3 B/ \- o3 b+ w6 Xoption httpclose
8 w% D0 q( p/ t. p- l
0 I" D+ m5 l4 H) ^#如果后端服务器需要获得客户端的真实IP需要配置次参数,将可以从Http Header中
. o8 `9 ^2 h/ e8 y+ ~$ y
8 e; |2 {4 m8 }# [# d6 z#获得客户端IP
) o% Q" ~# I7 p: n' g+ q! v% Y/ f" d: `
option forwardfor; Z) `' A2 @, ?4 q- y$ j0 H

+ d( p: V) D7 I' V' `7 U  `/ |$ k###########HAProxy的日志记录内容配置##########& ]- K$ a9 N" L/ l- W- g& O

  ~9 }, J+ {( {3 w/ B# Qcapture request header Host len 40
* M, H0 |3 `2 d) K; Q" d$ l; S* ]; @9 `- c
capture request header Content-Length len 10# k/ _+ _2 f; ]% k3 g0 r8 N% C& B8 u

4 y# J$ o! e; O* kcapture request header Referer len 200) \' P5 H5 ?- t$ X" _* y  x
( p; f8 j( i, v( v( N
capture response header Server len 40* B  @( q9 w# B. e  ~, v
& w0 o% C- t( m) h, y! s5 L% Q
capture response header Content-Length len 10
% I$ T2 A$ P$ |8 l
& X4 |" ?; v, _; zcapture response header Cache-Control len 8
) Q& [8 U# C: t3 A8 A* a# ^  Z1 B' q
9 H, e' |1 ~' O####################acl策略定义#########################
* d% K( ?* x( L4 u
% V! f4 K" h% Y4 y5 m' P5 I8 c( @8 _( ~#如果请求的域名满足正则表达式返回true -i是忽略大小写
9 J& Z! `7 S% ]; I1 J" ^. Y% C- @; M2 O+ |1 v
acl denali_policy hdr_reg(host) -i ^(www.gemini.taobao.net|my.gemini.taobao.net|auction1.gemini.taobao.net)$' f4 H1 V" b5 K, |% j+ s

4 A) \$ m; [3 I& f% U) J  e  z#如果请求域名满足trade.gemini.taobao.net 返回 true -i是忽略大小写# H6 e' z6 Q* q4 g# ~

. w7 H0 v+ E9 Y7 {- |% S" Bacl tm_policy hdr_dom(host) -i trade.gemini.taobao.net
- A/ c: S1 V, \2 Y" C1 |
% ?" L9 K1 Q$ j: n9 M! W##在请求url中包含sip_apiname=,则此控制策略返回true,否则为false
. _. X  ^' C" m" A6 J7 D& N; T( C/ g# P  o0 q, _. e; N
acl invalid_req url_sub -i sip_apiname=
8 G' s2 e- u2 c) v; T- @% h& ]1 J' f% c+ }/ {/ o
##在请求url中存在timetask作为部分地址路径,则此控制策略返回true,否则返回false
8 R. I7 U- U: V: @, F# q
, l; |) r1 v4 o# X/ T% t9 u( }acl timetask_req url_dir -i timetask: ]" d, Q) A/ {% i

, q9 l1 L$ X" ?. e+ j8 d$ Q#当请求的header中Content-length等于0时返回 true
8 t7 ]% s( c: s% v* @- O1 M( `% q! r: N0 Z6 U; N. y: Q* p
acl missing_cl hdr_cnt(Content-length) eq 0
0 y8 c! A2 b; g6 d: r3 c/ V; Y0 Q
+ c' H- u" S1 ]2 F7 i######################acl策略匹配相应###################9 L! m9 ?+ K# Z1 |
+ i4 ]& P* E' v) ?7 M
##当请求中header中Content-length等于0 阻止请求返回4030 ?: U+ M+ z/ Z

7 p* k4 @/ B. ~0 n/ nblock if missing_cl
' f; f6 y5 T+ a% D0 {6 g! X
6 a9 I8 M+ Y0 f: P1 l6 u  l##block表示阻止请求,返回403错误,当前表示如果不满足策略invalid_req,或者满足策略timetask_req,则阻止请求。
% t9 R) n- M$ E. r8 M3 S/ ~" R9 X) ]- o* i5 H4 W. m& ]
block if !invalid_req || timetask_req
& j- a$ B# s! @& r, j- ]- E: h+ v! P3 }- p
#当满足denali_policy的策略时使用denali_server的backend
0 U, ?- n5 p! P( s2 m& C
8 r( |2 B* \: j. ], A- Ruse_backend denali_server if denali_policy
& {8 f2 q* s3 ]* `' B& ]) g7 ?% z* t) M9 A1 g# _
#当满足tm_policy的策略时使用tm_server的backend- O9 E4 U9 R+ F4 ]4 F
+ g( v1 ], }- t1 H" {9 m7 j
use_backend tm_server if tm_policy
. t5 V) v' G% P8 t2 R2 D/ l. E
% h! w( d. {/ o8 Q#reqisetbe关键字定义,根据定义的关键字选择backend3 ]- |: c' T- Y

7 }4 f3 q7 H0 breqisetbe ^Host:\ img dynamic
. T, T$ k( w/ z! c3 z7 b5 s8 y6 N5 D0 {* E& d
reqisetbe ^[^\ ]*\ /(img|css)/ dynamic6 a6 [' `, }7 j3 ^- j

9 Q9 a: T6 J8 d8 ereqisetbe ^[^\ ]*\ /admin/stats stats
6 Z( N& W6 n. m" n+ `% d0 c. P
#以上都不满足的时候使用默认mms_server的backend
7 _0 L( w5 d3 v# \  l1 g! z5 A2 g9 `0 z; i0 ^7 R, X6 C+ q
default_backend mms_server
# \% U/ W& Y, M: b7 {
' Q$ W" g$ ~8 M3 x#HAProxy错误页面设置
' j$ J! H  |' o! C: v
; ?# Z6 F$ c- Nerrorfile 400 /home/admin/haproxy/errorfiles/400.http
0 g6 U2 M6 Y8 A& s
; O! e5 D) r% c5 ~$ j! [' {$ r. kerrorfile 403 /home/admin/haproxy/errorfiles/403.http, U; _8 M  E" F( @& {
8 [0 M) H% N0 K2 i
errorfile 408 /home/admin/haproxy/errorfiles/408.http
  o1 }. g: ~6 e% v3 `8 D" ~) T5 U/ h
errorfile 500 /home/admin/haproxy/errorfiles/500.http
+ @% v! f7 j+ S" G1 i% K" X& f8 v3 P1 i% Z5 R
errorfile 502 /home/admin/haproxy/errorfiles/502.http
: P+ ~7 o8 `' w/ \1 n5 c, p. |$ `8 f2 C
) h5 u+ a9 k1 Z7 i1 V* S0 derrorfile 503 /home/admin/haproxy/errorfiles/503.http
: Z9 g$ Y" Z# e/ b7 c$ j% m
- E) O3 ?5 |, _, y: Cerrorfile 504 /home/admin/haproxy/errorfiles/504.http2 W+ t9 ]. E+ z1 |( ~0 _
5 w( n6 W8 Q/ C
##########backend的设置##############
; Q6 o6 p; F# Q8 C1 I0 T: D4 _" p3 v# A* D  T8 U2 A9 c5 g
backend mms_server
& t+ q/ U9 h/ R4 ?: M1 @% i; W- \$ F4 b% H  \+ y
#http的7层模式' r# S0 V' r+ b7 ^

4 K/ Y6 ^* o2 g3 x& J- M+ Zmode http. C, W) X% h. ^9 O# k
1 L* h6 {9 i4 I9 X( |8 l2 N
#负载均衡的方式,roundrobin平均方式' F* `, M+ W7 r0 r! T

! b* q9 x! w% Bbalance roundrobin: {/ \. Z2 f  k3 r5 W

* x3 w" U5 c* Y  i+ h#允许插入serverid到cookie中,serverid后面可以定义
  n  F% H1 b! @8 Z0 l. I0 I# x$ x* ~. T- w% h# X
cookie SERVERID/ R5 |; {8 U7 p& v: @

# a* j( k! r2 I9 l2 z9 _4 q#心跳检测的URL,HTTP/1.1¥r¥nHost:XXXX,指定了心跳检测HTTP的版本,XXX为检测时请求) j4 g8 G- t6 b& c) x" ]! e
: Y  W. P( M8 b- ?$ c- {
#服务器的request中的域名是什么,这个在应用的检测URL对应的功能有对域名依赖的话需要设置! R3 E4 ~: f$ _; s0 p9 o

$ y1 c( P: I  t( ooption httpchk GET /member/login.jhtml HTTP/1.1\r\nHost:member1.gemini.taobao.net* K6 c/ o. h* [- m, }0 Z
% t0 j6 P% U8 ]3 i- k, q
#服务器定义,cookie 1表示serverid为1,check inter 1500 是检测心跳频率4 A1 P7 E7 A: K
/ z5 }/ y) @, m  C6 F9 A2 p- c
#rise 3是3次正确认为服务器可用,fall 3是3次失败认为服务器不可用,weight代表权重& d! r/ p- p( E# u( z8 e: Y: |1 F
6 `1 w  L/ n( M; o" y
server mms1 10.1.5.134:80 cookie 1 check inter 1500 rise 3 fall 3 weight 1
$ N8 R: G: N7 \7 W) T- e& g; u7 p
server mms2 10.1.6.118:80 cookie 2 check inter 1500 rise 3 fall 3 weight 2% N7 H" D4 i3 U4 H8 q

  e* e. e. E) l; d6 o1 e- xbackend denali_server. k: Q& g2 ?- O! e4 f! ~

  O6 H; s# e& \8 C4 r* h; lmode http9 ^' c4 y& A* r9 g
& p& _! J/ {3 N2 m+ G; m6 ~1 G$ e( N: y
#负载均衡的方式,source根据客户端IP进行哈希的方式% j/ D( h* m2 I* J% T% g/ S0 K
, V/ K6 u( f  P5 s. M0 o' N
balance source
5 l0 L9 m- M' q4 e3 I
' W: }4 s% a" Y4 G* `3 [+ z#但设置了backup的时候,默认第一个backup会优先,设置option allbackups后6 D" C" [; B8 f5 P; G1 i$ h+ Q

( n* _- c/ Q: p9 X, M# J% C#所有备份服务器权重一样/ h& p& [: e. L

" R1 Y  \0 @, eoption allbackups- o/ n2 @5 a4 U$ e6 X' R7 r% }
- P7 j( H8 T; c( u% C: d
#心跳检测URL设置' x  ~: n: }3 {, W. B6 z7 j
1 F* g6 ]+ r7 ~9 t
option httpchk GET /mytaobao/home/my_taobao.jhtml HTTP/1.1\r\nHost:my.gemini.taobao.net
$ \: L8 ^; t" E+ ]* H! ~, Z6 E& w2 x9 d+ t% L' ]; L
#可以根据机器的性能不同,不使用默认的连接数配置而使用自己的特殊的连接数配置; z$ t8 q5 `. d* I
& j. u1 S  ]0 K9 W; [
#如minconn 10 maxconn 20, i- `& z; G/ S( R

9 q" W  w2 I. D9 e$ eserver denlai1 10.1.5.114:80 minconn 4 maxconn 12 check inter 1500 rise 3 fall 33 X5 d( t" I; g0 W* i) d7 u2 y
' ?) W' }6 \% a9 h
server denlai2 10.1.6.104:80 minconn 10 maxconn 20 check inter 1500 rise 3 fall 3# Z+ k4 Q0 N- W: m" R
1 A* v) o' Z/ t4 F
#备份机器配置,正常情况下备机不会使用,当主机的全部服务器都down的时候备备机会启用
& B) a' [  Q" \8 Q4 T
  d6 N. g9 M7 Q" n8 S0 aserver dnali-back1 10.1.7.114:80 check backup inter 1500 rise 3 fall 3
  J+ o9 W6 E% j8 `# n- @/ A' ^  Y6 C/ d3 j/ o# k# A1 F/ t" z- v
server dnali-back2 10.1.7.114:80 check backup inter 1500 rise 3 fall 3
8 A/ C  F2 q; t' ^& H" N4 e  J8 h
backend tm_server/ f6 ~4 Q( R- z2 J  o" d' B4 U

; l1 d" X- l% P- ?mode http: Y- h# Y, O! e) T5 t4 Y# r

! }4 N5 ~$ p: @) O$ r8 P#负载均衡的方式,leastconn根据服务器当前的请求数,取当前请求数最少的服务器
: g( {7 \+ B4 e) {2 m
+ C0 l. l  P( E( y2 Jbalance leastconn
, [+ `4 x. h: \) t$ n
  T+ b/ H. e) G, goption httpchk GET /trade/itemlist/prepayCard.htm HTTP/1.1\r\nHost:trade.gemini.taobao.ne8 t7 V* @4 z8 j& Y: G2 p0 _
' n5 A9 D: h7 M. z& F7 L* A( M  U
server tm1 10.1.5.115:80 check inter 1500 rise 3 fall 3' }4 T- E* Q! m3 f
* S4 G3 e* P7 u' w. o
server tm2 10.1.6.105:80 check inter 1500 rise 3 fall 30 M$ ^, l* v1 W8 r8 y3 t, \% c
! D7 {- E1 I; e
######reqisetbe自定义关键字匹配backend部分#######################1 H& ~4 S/ N) z2 C; [) b
- \+ {3 M9 x) \) f2 R( U
backend dynamic
. E! q5 E/ m) s1 R# e2 T. @" Z3 I# U2 `, C8 c" _& b
mode http
! i" M) h. R7 e0 b0 Z$ b  a6 {" E% I  R! h
balance source
( l5 _: k5 u5 _: V+ T! u# ~6 C. q, l; }  V: r5 G7 w
option httpchk GET /welcome.html HTTP/1.1\r\nHost:www.taobao.net0 V. E" I1 g9 w0 f1 ?

' u( z; ]  t  _server denlai1 10.3.5.114:80 check inter 1500 rise 3 fall 30 y' \9 B( ?4 J. f5 I. r6 j
1 v7 H8 J) d: f# U+ h$ v5 J
server denlai2 10.4.6.104:80 check inter 1500 rise 3 fall 3+ }- k0 `9 }( E# a- m3 F
, O; I( [# M  f
backend stats" L6 }  I' a9 P1 f! B. G, M* ~9 W4 _+ @
1 e- w0 S# G# e4 R+ N' F
mode http5 I2 W2 g1 T. ?7 q+ j% p
4 I) S7 a: ]2 S" X) l
balance source
( f# U' \* [+ p) K$ w; g8 U7 X; k& p* F
option httpchk GET /welcome.html HTTP/1.1\r\n Host:www.163.com
5 y( ~. f& S8 C% e& J0 c- G  f9 x$ ~; y) d1 |
server denlai1 10.5.5.114:80 check inter 1500 rise 3 fall 3
% N2 W* F0 V/ @' h  w3 S$ @3 T
; D% k7 h3 E6 B1 ?6 R, x1 c+ Yserver 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:39 , Processed in 0.056111 second(s), 23 queries .

Powered by Discuz! X3.4 Licensed

© 2012-2025 Discuz! Team.

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