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

haproxy配置文件讲解

[复制链接]

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
发表于 2017-9-8 10:03:56 | 显示全部楼层 |阅读模式
global                                                       # 全局参数的设置
* q8 t/ q* C; \    log         127.0.0.1 local2                      # log语法:log <address_1>[max_level_1] # 全局的日志配置,使用log关键字,+ w/ l: p- i$ n
                                                                     指定使用127.0.0.1
- F1 }# K3 {5 A                                                                     上的syslog服务中的local0日志设备,记录日志等级为info的日志
3 K  W  d8 b! Z7 U: k$ W    chroot      /var/lib/haproxy                 #改变当前工作目录
: |. m& d, C. [3 ]' S    pidfile     /var/run/haproxy.pid          #当前进程id文件: k  F( N5 E# c7 U2 W
    maxconn     4000                                #最大连接数
4 G/ X7 g2 F; R2 J) `5 N: D    user        haproxy                                #所属用户
. P7 b( ?; W6 y4 C4 ~9 U    group     haproxy                                #所属组  ]8 b. w- m" K) J% O
    daemon                                               #以守护进程方式运行haproxy
% [% y9 y  [4 R- A    stats socket /var/lib/haproxy/stats1 G. S7 M- [3 d9 }* Z
defaults
; f) J* j8 N5 Y6 L, O& F    mode                    http                        #默认的模式mode { tcp|http|health },tcp是4层,http是7层,health只会返回OK
8 I4 q8 {3 h1 S3 P0 t! v# T5 N1 w    log                        global                    #应用全局的日志配置
# J, w6 P2 _5 T! f    option                  httplog                  # 启用日志记录HTTP请求,默认haproxy日志记录是不记录HTTP请求日志
+ J* T# [' F' u/ l6 _4 {  o" C
6 W1 X) [9 R" Q( T; G    option                  dontlognull          # 启用该项,日志中将不会记录空连接。所谓空连接就是在上游的负载均衡器
# c2 h6 H2 z, F" v+ v/ Z2 O4 N                                                                   或者监控系统为了探测该 服务是否存活可用时,需要定期的连接或者获取某
+ z) J% J# g( p8 w8 i' [0 P                                                                  一固定的组件或页面,或者探测扫描端口是否在监听或开放等动作被称为空连接;
& Q3 a+ d! q( C4 A% g8 T                                                                  官方文档中标注,如果该服务上游没有其他的负载均衡器的话,建议不要使用
5 q. f" R  ]1 W# x( D                                                                   该参数,因为互联网上的恶意扫描或其他动作就不会被记录下来
  T, o0 q% Q2 R    option http-server-close                   #每次请求完毕后主动关闭http通道* L0 D# @- D9 Y9 A
    option forwardfor       except 127.0.0.0/8   #如果服务器上的应用程序想记录发起请求的客户端的IP地址,需要在HAProxy& l- E. n$ J# H+ ~9 K
                                                                            上 配置此选项, 这样 HAProxy会把客户端的IP信息发送给服务器,在HTTP
$ z8 U+ X+ j/ ~/ k6 w- u9 Q: Y6 M                                                                            请求中添加"X-Forwarded-For"字段。 启用  X-Forwarded-For,在requests7 E+ ^5 G& a! u* M8 ~% w
                                                                            头部插入客户端IP发送给后端的server,使后端server获取到客户端的真实IP。
. {! e, V; y) `" @9 `    option                  redispatch                      # 当使用了cookie时,haproxy将会将其请求的后端服务器的serverID插入到( \+ @! s% M1 K$ z  G! g
                                                                            cookie中,以保证会话的SESSION持久性;而此时,如果后端的服务器宕掉
" R: D7 v; j3 u                                                                            了, 但是客户端的cookie是不会刷新的,如果设置此参数,将会将客户的请
: J; ?0 w: h+ l                                                                            求强制定向到另外一个后端server上,以保证服务的正常。
- |" ?% Q+ B; t2 Q- X    retries                 3                             # 定义连接后端服务器的失败重连次数,连接失败次数超过此值后将会将对应后端. X0 K3 e; Z2 u* o. `, N% L1 {
                                                                  服务器标记为不可用) D+ V0 j* [" r
    timeout http-request    10s             #http请求超时时间
1 w. o$ J) m( `. c0 A7 w    timeout queue           1m                 #一个请求在队列里的超时时间
7 K+ j+ k4 Q0 ]- g7 T& K1 b    timeout connect         10s                #连接超时
, W% A5 R% N! P1 g# D" s    timeout client          1m                   #客户端超时
( o7 g7 C- J3 @# n' Z    timeout server          1m                   #服务器端超时0 ?. K6 f# r. K. c
    timeout http-keep-alive 10s           #设置http-keep-alive的超时时间
/ H, Z5 K) V- m6 _, c8 \% m! F    timeout check           10s                 #检测超时
) t$ Q! I+ [+ W& X3 x; {$ V! p. m    maxconn                 3000                 #每个进程可用的最大连接数2 q; D3 x& i; [  ?
frontend  main *:80                             #监听地址为80$ I7 \' }7 i0 c2 d- `, S
    acl url_static       path_beg       -i /static /images /javascript /stylesheets6 l: T  q8 U# e, E$ f
    acl url_static       path_end       -i .jpg .gif .png .css .js9 a- U  X+ e6 }  f  H( U+ n: m
    use_backend static          if url_static3 m0 S3 ]% o( g$ k
    default_backend             my_webserver     #定义一个名为my_app前端部分。此处将对于的请求转发给后端" l" z& L0 @0 u! q* l9 G) }; [
backend static                                                 #使用了静态动态分离(如果url_path匹配 .jpg .gif .png .css .js静态文件则
' `2 f0 c# \7 {3 r                                                                            访问此后端)
6 c  D% f0 N& b# n3 d4 M( V    balance     roundrobin                               #负载均衡算法(#banlance roundrobin 轮询,balance source 保存session值,7 n( z2 s, r+ ?  Z+ Y2 B
                                                                           支持static-rr,leastconn,first,uri等参数)
, j2 P1 i3 Z2 v+ w* B: }$ {    server      static 127.0.0.1:80 check             #静态文件部署在本机(也可以部署在其他机器或者squid缓存服务器)
" t4 a; G  O/ x" k4 Zbackend my_webserver                                  #定义一个名为my_webserver后端部分。PS:此处my_webserver只是一个1 x+ S7 \  t+ G2 M  @& }0 ]
                                                                            自定义名字而已,但是需要与frontend里面配置项default_backend 值相一致
& s' u6 H& i8 q8 t& O* J    balance     roundrobin                               #负载均衡算法
! J, L+ c/ g* G' X2 Z/ ~# J    server  web01 172.31.2.33:80  check inter 2000 fall 3 weight 30              #定义的多个后端7 x1 ~8 y! x$ d; R
    server  web02 172.31.2.34:80  check inter 2000 fall 3 weight 30              #定义的多个后端0 V6 U" i* a, g  E/ T" f$ K
    server  web03 172.31.2.35:80  check inter 2000 fall 3 weight 30              #定义的多个后端
7 p9 K! t/ z7 p5 _) h. p2 x0 f* ~9 \+ _! h6 z3 u# v
% m% v0 q% b' M, D% Z$ a

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2021-7-12 13:55:30 | 显示全部楼层
常用配置选项:
9 K4 m  Z6 l" n& D4 ^  r3 e2 Y2 G; l: p3 g

# i" u3 y: E: g) R1 ~' A, D% m. O% @( M! L* w. e" Z! I* R3 f" n
OPTION 选项:
8 F( R( a, Q  B. ?2 f3 I' Z0 e# o# _- z
; @* m4 w+ p. t! n, O+ Doption httpclose :HAProxy会针对客户端的第一条请求的返回添加cookie并返回给客户端,客户端发送后续请求时会发送
: X  P- F7 C' S4 Y, e5 T* P& E5 J" h6 U: n
                             此cookie到HAProxy,HAProxy会针对此cookie分发到上次处理此请求的服务器上,如果服务器不能忽略
3 U' ?7 o* Z+ s  D1 B& x! l7 S/ I  w' t4 d
                             此cookie值会影响处理结果。如果避免这种情况配置此选项,防止产生多余的cookie信息。
" k0 V+ a8 ]) z  Q# d5 E2 b2 o( p5 h7 c
option forwardfor :如果服务器上的应用程序想记录发起请求的客户端的IP地址,需要在HAProxy上配置此选项,这样, M$ N1 L- ]/ L# C! |

( U' p. o9 \: V                               HAProxy会把客户端的IP信息发送给服务器,在HTTP请求中添加"X-Forwarded-For"字段。
+ Z$ y0 C9 E3 C1 J, [4 |/ H
, R4 d' i, P+ }* e8 [option originalto :如果服务器上的应用程序想记录发起请求的原目的IP地址,需要在HAProxy上配置此选项,这样HAProxy
: C1 d- C1 R" o( _9 D! R2 Z5 z5 c5 X4 j$ [
                              会添加"X-Original-To"字段。; |4 E% W% F+ k0 T$ e7 ?
+ `( M) b+ u- p
option dontlognull :保证HAProxy不记录上级负载均衡发送过来的用于检测状态没有数据的心跳包。
9 r( E" d* A- h% c- B0 B
" a! @" `* ~% p7 }$ B
6 ^6 R$ M; i: [3 s: ?* u2 r% W9 N2 g5 R: z8 d4 S5 L
BALANCE 选项:* w8 C8 M/ [  K  H1 E" C' n, k

- H7 Z- i) Q+ Qbalance source :如果想让HAProxy按照客户端的IP地址进行负载均衡策略,即同一IP地址的所有请求都发送到同一服务
7 i% q; i" H  k* ^5 Y, t9 u& p+ R6 _
                             器时,需要配置此选项。
) c8 z' m0 z3 g0 i5 `; {$ K9 S, V& X
) r0 m' O* P- A+ j- [9 ebalance roundrobin :HAProxy把请求轮流的转发到每一个服务器上,依据每台服务器的权重,此权重会动态调整。最常: U) r3 A  V6 z# L

! r1 \! n/ ]# i( s! ?                                   见的默认配置。
& q! t" b2 D, `( k' X2 M" v! B8 \- c# t( e+ G/ r* C5 d
, ^5 v& f' }$ ^: Y7 e0 Y8 }$ v- R

* i6 F8 ~! j  N- @, b6 B1 B, w7 f% {COOKIE 选项:
& P. u. e- v) X4 u, u
1 L: H  j& P( }- vcookie JSESSIONID prefix :如果客户端只支持一个cookie,并且服务器上的应用程序已经对返回设置了cookie,. H9 I# L, F" {+ [

( M" Z- R. M4 H# ~6 `# T                                               HAProxy设置此选项可以改写应用程序设置的cookie信息,把服务器的信息添加到原cookie中去。
4 H% h( X+ b0 R: r/ n% m
9 X. C8 [7 X0 v7 `; u$ c, ccookie SERVERID indirect :HAProxy会删除添加的cookie信息,避免此cookie信息发送到服务器。
* U; u! l$ o' Y6 w% W) U% S
: q7 Q4 x/ Z) I# o) p% r4 |0 Qcookie SERVERID rewrite :  ^9 _' j  F. b: y) }

% l3 w) o: K: L5 u3 E( L, Wcookie SERVERID insert :
/ r8 a  Y$ `0 m4 {5 }# Y! h) ^- p
cookie SERVERID insert nocache :
( ^3 ?( c) A8 k3 ]4 y( f7 _: h
# c+ Q$ H9 w, q  |2 gcookie SERVERID insert postonly :: H! j: h& n) K7 I' g
& H  b4 r, `; \0 \9 ^) ]& i/ a

0 m  }$ ]# M  \1 \$ m: U6 E7 c% S6 Q
$ ^  D9 u( E- N+ Z& soption httpclose3 P, T' ?& U5 [* y
no option httpclose. p! B1 @, B! P8 r( b
  Enable or disable passive HTTP connection closing   启用或禁止消极的HTTP连接关闭0 r. m, @; E" a
  May be used in sections :   defaults | frontend | listen | backend
# k: j1 U$ X2 J. ?9 n/ h                                 yes   |    yes   |   yes  |   yes4 j) W0 K2 }5 i& g
  Arguments : none
, o6 W9 i& S; \! y6 ]2 R: X  g  
! b) x6 U$ W( f1 |& o  默认的,客户端与服务端的通讯,HAProxy只做分析、日志和分析每个连接的第一个request。如果设置了 "option
4 K( q! w& ?; T8 _& n; W  httpclose" , 则会检查双向的http头是否有"Connection: close",如果没有则自动添加,使每个客户端或服务端在每次传输后,都会主动关闭TCP连接,使HTTP传输处于HTTP close模式下。任何 "Connection" 头如果不是"close",都会被移除。
) S8 V8 `" t" Q% k7 M6 k, H
- P5 e3 t/ M. c, Z" q: s8 k  很少会有服务器不正确的忽略掉头,即使收到"Connection: close"也不关闭连接,否则就是不兼容HTTP 1.0浏览器标准。 如果发生这种情况,可以使用"option forceclose",在服务端响应后主动关闭请求连接。选项 "forceclose"还可以及早释放服务连接,而不必等到客户端的应答确认。
2 f" d0 W" O" c" S7 F! Q- C
; _1 _$ r8 c& }! J  R4 J  这个选项可以设置在frontend或backend上,只要其上可以建立连接。如果同时设置了"option forceclose",那么它比"httpclose"优先。如果同时设置了 "option http-server-close",则会实现"option forceclose"的效果。2 R( t4 E( [3 D" A: c

, Z  Q" \" l: Ooption forceclose
( F' b) a) M9 ?. hno option forceclose
( P5 G5 G% n6 ]* n" G' k, o1 x' w8 l$ [6 ~# [& j
  Enable or disable active connection closing after response is transferred.     启用或禁止response后的主动关闭连接
6 A& ?6 x3 K+ ~5 u. i( D6 V, J' {& S+ c5 K6 C0 P! G
  May be used in sections :   defaults | frontend | listen | backend
  T, A6 F; R: \5 Z; L7 d                                 yes   |    yes   |   yes  |   yes
: b2 l* q9 ]( s! P/ M8 D4 k
/ y# p7 R$ ]" @  Arguments : none
0 w: `0 a8 p; l3 [$ `: p        有的HTTP服务器收到"option httpclose"设置的"Connection: close",也不会关闭连接,如果客户端也不关闭,连接会 一直打开,直到超时。这会造成服务器上同一时段内的大量连接,日志中也会显示较高的全局会话时间。3 c2 E$ L* V) Y0 B! v2 ]# S8 [
9 _: {! m! {$ d* u0 S7 C9 B: D
        此时,可以使用 "option forceclose",当完成响应时,立即关闭对外的服务通道。该选项隐式打开httpclose选项。需要注意,该选项允许解析完整的request 和 response,所以可以很快关闭至服务器的连接,比httpclose更早释放一些资源。
1 ^- k" s) K8 F% K8 M0 j' o        如果同时启用了"option http-pretend-keepalive",虽然会禁止发送 "Connection: close"头,但是依然会在整个response被接收后,关闭连接。! i, O* Q: z# U( ]# _; j
! g  x3 G; X. M7 Q
option http-server-close
% ]/ `4 j5 L1 k8 p$ E! f7 r- Vno option http-server-close( ~+ B+ d4 b( M& e# s
  Enable or disable HTTP connection closing on the server side  启用或禁止关闭服务端的HTTP连接
" o3 {9 _$ K8 }* I2 b- d3 ?  May be used in sections :   defaults | frontend | listen | backend
( V7 D5 F, U2 `5 G                                 yes   |    yes   |   yes  |   yes
- i3 d4 z9 L  Y3 R/ k6 @; \  Arguments : none* Q4 }# L1 {" W
    默认的,客户端与服务端通讯,haproxy 只是分析、记日志,并处理每个连接的第一个请求。该选项设置server端为HTTP 连接关闭模式,并支持客户端为HTTP keep-alive的pipelining模式。提供了最低的客户端延迟和最快的服务端会话重用,以节省服务资源,类似"option forceclose"。还允许无keepalive能力的服务端在keep-alive模式下为客户端提供服务,但是需要符合 RFC2616。需要注意的是,有些服务器遇到"Connection: close" 时并不总是执行关闭,那么keep-alive 则无法使用,解决方法是启用 "option http-pretend-keepalive".
6 y( L. U* |: a. E2 t, q/ a5 V# O0 }# o4 [; _: ?
     目前,日志无法指明请求是否来自同一会话;日志中的接收日期为前一个请求的结束;请求时间为新请求的等待时间;keep-alive request time 存活请求时间为超时时间,绑定 "timeout http-keep-alive" 或 "timeout http-request"的设置。3 |' Q9 g& T& [
     这个操作可以设置在frontend或backend上,只要其上可以建立连接。需要注意的是,这个选项可以与 "option httpclose"结合, 但 "option httpclose"优先级更高,结合后基本实现了forceclose的效果。
* [9 g" Y4 m3 o& Y% [0 ^. P( B3 K2 A
. s" w1 H3 i7 l# h8 f" r) Aoption http-pretend-keepalive (http-假装-长连接)
3 r. f( b" N. V3 {no option http-pretend-keepalive
; n: |) S& l# ~% Y  Define whether haproxy will announce keepalive to the server or not  定义 haproxy 与服务器是否是 keepalive 的。& y, K7 K# ?2 D8 d9 \" V) G3 {: E
  May be used in sections :   defaults | frontend | listen | backend5 x% H7 M" B7 c
                                 yes   |    yes   |   yes  |   yes2 D& p2 g$ p: M9 N9 u- e1 v9 b
  Arguments : none. p2 M0 y. j0 {5 G
    当声明了 "option http-server-close" 或 "option forceclose", haproxy会在给server的request头中添加 "Connection: close" 。然而有些服务器看到这个头,会返回未知长度的response,并自动避免chunked encoding,其实这是不对的。它会阻止haproxy保持客户端长连接,还会使客户端或缓存接收了未完成的响应,却认为响应结束了。7 A  t( K+ P6 i' Z# E& J
    设置 "option http-pretend-keepalive", haproxy会在服务器端保持长连接,服务端则不会出现前面的问题。当 haproxy 获取了完整的response, 才会以类似forceclose的方式关闭服务端。这样客户端得到一个普通的响应,连接也在服务端被正常关闭。
/ j1 m! G8 F3 y  y* o, T    建议不将其设为默认值,因为大部分服务器会在发送完最后一个包之后更高效的关闭连接,并释放缓存,而且网络上的数据包也会略微降低整体的峰值性能。但是启用该选项,haproxy会略微少做一些工作。所以如果haproxy在整个架构中是个瓶颈,可以启用该操作,以节省CPU。
8 U# q' _; f2 H
0 O1 {; c+ ^9 G: K) u& C% H     这个选项可以设置在frontend或backend上,只要其上可以建立连接。这个选项可以与 "option httpclose"结合, 使服务端keepalive,客户端close,但并不建议这样做。: n7 G: P' d5 x( B- ]
& e- B7 |: A- `

* c2 j. i# s0 }# }
$ `$ @2 N0 v+ d% ~balance <algorithm> [ <arguments> ], I: }' g* p: x- W! G5 R- w
balance url_param <param> [check_post [<max_wait>]]2 f1 q9 w0 ]% c/ z) Q: j
  定义选择后端服务的负载均衡算法/ r* g1 K( L6 |8 u
  May be used in sections :   defaults | frontend | listen | backend7 o+ w# x2 d6 B/ m) |3 J/ ^
                                               yes   |    no    |   yes  |   yes; _! c3 a: o: g. q6 ]$ U( Q
  Arguments :' \; R; k: D. Q- a1 A2 Q' L
    <algorithm> 是负载均衡时选择服务器的算法,没有持续信息时可用,或连接重定向到另一个服务器。<algorithm> 可以是以下几种:& h9 ^6 s& m5 p' X- H
      roundrobin  每个服务器根据权重轮流使用,如果服务器的处理时间平均分布,这是最流畅和公平的算法。算法是动态的,对于实例启动慢的服务器的权重会在运行中调整。每个backend的活动服务器在设计上限制为4128个。在一些大的群里面, 当服务器很短的宕机后恢复回来,有时会有几百个请求被重新整合到群当中,并开始接收处理。尽管很少发生,但是很正常。这也说明了有机会监视它们,所以不必担心。+ c) c% r( x# \  W& X
: Z: Z* M% d: b$ r% V" w3 ]
      static-rr  每个服务器根据权重轮流使用,类似roundrobin,但它是静态的,意味着运行时修改权重是无效的。另一方面,它对服务器的数量没有设计上的限制,服务器启动后便会立即进到群中,整个分发方案会重新计算。这会略微降低CPU的运行(约1%)。
2 j$ I5 K2 y3 q5 R$ b! K# j1 |% z/ e7 \
8 h+ d. \; b* }( W! k0 ?3 N% c* b      leastconn  连接数最低的服务器优先接收连接。Round-robin用于负载相同的服务器,使每台服务器都被使用。leastconn建议用于长会话服务,例如LDAP, SQL, TSE等,而不是很适合短会话协议,如HTTP。算法是动态的,对于实例启动慢的服务器的权重会在运行中调整。
# r( O' I" d4 b8 D( I
& s- x. |8 |' |( s4 \+ {5 A  B      source    对源IP地址进行哈希,用可用服务器的权重总数除以哈希值,根据结果进行分配。只要服务器正常,同一个客户端IP地址总是访问同一台服务器。如果哈希的结果随可用服务器数量而变化,那么有的客户端会定向到不同的服务器。该算法一般用于不能插入cookie的TCP模式。它还可以用于广域网上,为拒绝使用会话cookie的客户端提供最有效的粘连。该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是算法会根据"hash-type"的变化做调整。
+ }5 u! f) y( N4 Y5 X8 i
; ?$ [, F. m! u& W      uri        对URI左端(问号之前)进行哈希,用可用服务器的权重总数除以哈希值,根据结果进行分配。只要服务器正常,同一个URI地址总是访问同一台服务器。一般用于代理缓存和反病毒代理,以最大限度的提高缓存的命中率。该算法只能用于HTTP后端。该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是算法会根据"hash-type"的变化做调整。, n) B7 W  x$ D2 d6 O! m5 C- c
                  算法支持两个可选参数"len" 和 "depth", 都是后跟正整数。“len”参数指定算法只处理URI从头开始的字符数,据此计算哈希。因为大多URI以"/"开头,所以"len"最好不要设为1。"depth" 参数指定URI中最大的路径深度,据此计算哈希。请求中的每个斜线为一级。如果同时声明了这两个参数,则截取URI时必须同时满足。
5 ], h; m0 D) w7 p+ t7 k+ e
1 G4 g- q9 F3 |      url_param  在HTTP GET请求的查询串中查找<param>中指定的URL参数。
9 q+ j3 V4 T$ d. o' E; @; r                 若使用了修饰符"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被用了,则只能检查第一个块。如果参数值被块边界分隔开,则只能随机均衡负载了。
4 l' Z, W$ R1 v& Q8 j  k1 e8 o  X                  如果参数后面跟着 ('=') 和一个值,则可以根据这个值进行哈希,用可用服务器的权重总数除以哈希值,根据结果进行分配。
3 t2 H4 [# C+ x& G3 L                  还可用于跟踪请求中的用户身份,只要服务器正常,同一个用户ID的请求总是发给同一台服务器。如果没有参数或参数没有值,则使用轮询算法。该算法只用于HTTP后端。该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是算法会根据"hash-type"的变化做调整。
. J  K* ?+ O/ ^& {% q4 J$ M1 `. b- I4 K+ i, ^0 J0 @
      hdr(name)  在每个HTTP请求中查找HTTP头<name>。与ACL函数'hdr()'一样。括号括起来的头名字不区分大小写。如果缺少头或头没有任何值,则使用roundrobin算法代替。                  0 d; u1 S/ F$ _, f4 }4 C; K/ X
                       启用参数'use_domain_only',哈希算法将只用于一些类似'Host'的特定头的主域部分。例如主机值"haproxy.1wt.eu",则只考虑 "1wt"。该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是算法会根据"hash-type"的变化做调整。
' `: {: h) @) M& |  a( E# x6 N. c* s) x
      rdp-cookie8 u2 |0 i! P1 C9 D/ S6 P, f
      rdp-cookie(name)% _$ V, h8 ~+ R
                  为每个进来的TCP请求查询并哈希RDP cookie <name> (或“mstshash”如果省略) 。与ACL函数 'req_rdp_cookie()'一样,name不区分大小写。该机制用于退化的持久模式,可以使同一个用户(或同一个会话ID)总是发送给同一台服务器。如果没有cookie, 则使用roundrobin算法代替。
' M8 X2 _0 k) @: o3 H- N                  必须注意该声明要生效,前端必须确保在请求缓冲中已经有RDP cookie,所以必须使用规则tcp-request content accept' 和ACL 'req_rdp_cookie_cnt'相结合。3 Z: b, [1 N/ x7 D
                  该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是算法会根据"hash-type"的变化做调整。; o) z1 |" T  @0 A! ^

# R8 f5 _) J( G    <arguments> 是用于一些算法的可选参数列表,目前只有"url_param" 和 "uri" 用到,例如:
: r% i' g1 r* K# \/ \                balance uri [len <len>] [depth <depth>]
+ b5 M+ u, k: Z                balance url_param <param> [check_post [<max_wait>]]" ~7 X+ s; A. [) z" S/ ?

, n: ~* M9 _+ d* l  如果没有其他算法、模式或选项的设置,后端的负载均衡算法默认为roundrobin。每个后端只能设置一种。
/ k' R0 S) t  h$ c  Examples :
0 J9 C  {& o2 `3 i! Y5 B3 z4 L        balance roundrobin
& R1 d; m- \6 Y0 J8 w2 @        balance url_param userid) J1 j) ~  [# c" t' f5 Q
        balance url_param session_id check_post 64
+ p( k) U3 n3 d& @  ]# X        balance hdr(User-Agent)2 }* U: ?2 |1 j+ Y& ]
        balance hdr(host): E9 n, Z3 w0 e' ~# o* W
        balance hdr(Host) use_domain_only/ }$ A% D: ?: @/ ?3 A
) N( N9 \# ~- {8 G( k. L" M
  注意:  以下的警告和限制是使用“check_post“扩展和”url_param”所必须考虑 :4 e5 P4 H! M  A& ~7 ^
    - 所有POST请求都要考虑,因为在包含二进制数据的体或实体中,没有办法决定是否会找到参数。因此需要另一种方法,限制POST请求的体中不含有URL参数 (见 acl reqideny http_end)
+ v8 Y1 o' q8 m4 [  X/ p% M( I& u1 \
    - 大于请求缓冲大小的 <max_wait> 值是没用的。在build时设置缓冲大小,默认16KB。
" Z( c2 a: ~: `: P    - 不支持Content-Encoding, 参数搜索会失败;负载均衡会改用 Round Robin。
* a6 i6 W* y/ e! Q5 j/ K& j    - 预计: 不支持100-continue,负载均衡会改用 Round Robin。% I) m8 o2 Z# m# @# y6 q, t% v% E
    - Transfer-Encoding (RFC2616 3.6.1) 只在第一个块中支持。如果在第一个块中的参数值不完整,选择的服务器就没有定义。(实际上取决于在第一个块中定义的有多小)
  M$ P# z7 Y, n& T    - 该特性不支持生成100, 411 或 501 响应。  ]! c+ m$ C; x) i% i
    -  有的情况下,需要"check_post"只是要查看整个消息体的内容。检查一般会停在任意数量的空格(LWS: linear
/ K; i. C; f3 c# x      white space)或控制符上,表示这可能是一个URL参数列表。这可能不是一个关于SGML的类型消息体。
( C1 P$ [; d# @( N
- q1 V) I# S* n/ g7 C  See also : "dispatch", "cookie", "appsession", "transparent", "hash-type" and "http_proxy".0 z6 d- I+ r2 Z( U; K# w
  _0 P% K$ l! B( ?
8 h7 u! p$ U7 p. A8 ~* f& \, x
7 L# L2 v! Y$ a/ ^
hash-type <method>0 t9 X3 V1 Z' e; Q
  将哈希映射到服务器的方法。Specify a method to use for mapping hashes to servers
9 {" V9 N6 ?1 A6 R# h  May be used in sections :   defaults | frontend | listen | backend0 o1 {, H! V8 ^) A3 `5 Y; a: \$ Y
                                               yes   |    no    |   yes  |   yes
( A, S( s7 j7 ^3 O# p  H0 `  Arguments :
  j3 r0 B' w: [" `. |/ u    map-based  哈希表是包含所有在线服务器的静态数组。哈希结果很平滑,并考虑了权重,但是会忽略服务器启动时的权重变化,也就是说不能慢启动。另外,服务器是根据数组中的位置所选择的,所以服务器数量变化时,大部分映射也会变化。当一台服务器启动或关闭,或服务器加入到群中,大部分连接会再分配给不同的服务器,这对有缓存的实例会比较麻烦。
, R- [' e7 O5 }- m, i: J" a/ T
6 C& w- x+ U* S# l* u9 ]    consistent  哈希表是由每个服务器构成的树,会在树上查找哈希Key,并选择最近的服务器。这种哈希是动态的,支持服务器启动时修改权重,所以可以慢启动。它有一个好处是当服务器启动或关闭时,只有其本身的关系被移除,当服务器加入群时,只有一小部分的映射会被重新分配,所以是一个比较理想的支持缓存的算法。但是根据其原理,算法不会非常平滑,有时候必须调整服务器的权重或ID来获得更平衡的分布。要保持多次负载均衡时的相同分布,服务器ID是绝对不能变的。(roloand:haproxy根据服务器的ID初始化其哈希值)
0 C1 _. H7 K  a   默认值是"map-based",建议大部分情况下使用。" H+ A2 D$ I" \8 c' f

5 Q  z* t$ u8 |% n  See also : "balance", "server"% O/ d, A7 y" G1 d* I9 i  G

1 T/ w+ s1 \  H$ N7 Q  s, i5 C! Q0 H/ `& y5 L- y+ n0 ~1 \
dispatch <address>:<port>
/ \& \# r+ ?- D/ f) b# X/ w* G2 ]3 s2 M  设置一个默认的服务器地址, y. P. P" U0 h! m- `
  May be used in sections :   defaults | frontend | listen | backend
. J) k8 D" H. }, Y, Z! X                                               no    |    no    |   yes  |   yes
, P" K1 p; P% |; A6 P5 F; @; U' \  Arguments : none
7 I8 b7 R. Q# C5 v+ T' x0 h    <address> 默认服务器的IPv4地址,也可以是主机名称,名称只在启动时解析为IP地址。1 `# T, T' A: t  }: k' |$ Q5 G
    <ports>  端口号,所有连接都会发送给这个端口,但是不允许像其他服务器一样使用端口偏移(port offsets)。
+ Q1 ~2 g+ ^  D$ Y1 P7 {$ g$ y5 i, t
   "dispatch"关键字指定了一个默认的服务器,用于无可用服务器时的连接的处理。过去常用于前传非持久连接给后备负载均衡器,由于定义简单,还用于简单的TCP中继(TCP relays)。 建议对于明确的连接处理,应使用"server"直接声明。& s( |. z+ U' h& D" r5 D
4 ~$ T/ Y! @) c! D2 @
====================' N, u4 C0 K& N5 f) e* o

! _. `1 {- q3 {2 o一:Global parameters
  I2 j* H* f% H9 D0 g. @2 t* Process management and security
5 ~/ G! \: i6 P7 I% @3 i- chroot 改变当前工作目录! Q9 c4 h( `8 Z: o5 r
- daemon 运行方式为后台工作1 {9 X. u& ^9 ~
- user - group 工作用户和组+ ]* H& k" _' |6 W  U
-log <address> <facility>日志输出设备
1 N3 \/ {: r! K/ U+ V4 }, {- nbproc 创建工作的进程数目' l: @* O3 n" v3 L8 C- `8 V
-pidfile pid文件位置+ k2 M& F# y3 N2 S* ]
- ulimit-n 设置每个进程的可用的最大文件描述符. W- I+ o! C7 H4 X- q8 n
- stats 创建监控所用的套接字目录  D* G  }% V) j  G- W
- node 创建另外一个节点名字共用一个IP地址,用来识别哪个节点在处理流量, N* s& W9 q$ d/ {
- description 描述实例的名称' R- @7 Y" F7 q3 x  K, t* R* s7 ^; ~
maxconn <number> 每个进程可用的最大连接数
+ u! Q1 s0 e  ]6 M4 Ymaxpipes <number>  每个进程可用的最大管道数; `, T4 I6 H+ E7 }! U- P
nokqueue  nopoll  nosepoll nosplice  禁用这些功能
1 `4 l8 R0 Y& M6 b7 _spread-checks <0..50, in percent>  health check 的时间间隔) E! I; S) H; X' {6 B
tune.bufsize <number>
. ?% W+ h' \8 V: itune.maxaccept <number>
  d+ C1 a) q3 a( g6 U8 |5 @tune.maxpollevents <number>
5 A* k0 I/ V; B" Rtune.maxrewrite <number> 1 e: V( C/ s9 O* X7 J: C
tune.rcvbuf.client <number> 2 T" R1 G% w  F1 B3 L
tune.rcvbuf.server <number> + D$ ~3 ^% I# U
tune.sndbuf.client <number> ; T) {1 Y- R( Z- r
tune.sndbuf.server <number>
8 X+ H: ]; D  b以上凭字面理解吧% f8 k' n. B5 T3 ]
debug  调试模式,输出启动信息到标准输出
  N* X5 c" }5 a- Aquiet   安装模式,启动时无输出
7 x5 s) U! R" r% J( A6 j, v
4 H/ A6 M8 r: c5 s/ a二:defaults 块. X7 o& O, e, d  z3 c  ~$ S( J
作用于其后紧跟的listen块,直至下一个defaults 块,下一个default 将替换上一个块作用于以后的listen$ T. N$ g& z7 p2 A& d  ^
frontend 块,接受请求的端口组# F) D: `3 e$ L5 ~+ C
backend块,后端处理的server 组3 Y- Y$ I# k# b; U* H3 b  T
listen块,frontend和backend 块的结合
, g9 _1 m, d) v2 F, ], P- @* u' k& |" b0 Q+ Q) o% \
三:常用配置命令
3 Y. _% k( R% S! o% }8 a# w
8 {  C- l8 L' t7 d- T9 Wbalance <algorithm> [ <arguments> ]
! O( [3 T2 ~2 M6 m$ \balance url_param <param> [check_post [<max_wait>]]   负载均衡模块设置4 H: |$ \" X' {. z7 E

$ s, S% h0 q* v* AExamples :. B0 J; s! H( I0 T' R( I7 ]
balance roundrobin
: A2 f8 C8 ?' D" z: Gbalance url_param userid  
: X/ u5 u; v! J% k7 `5 }balance url_param session_id check_post 64
+ p- \& b1 w/ ]0 j. q: `balance hdr(User-Agent) & Q  x4 J. ]( a  Q( n) A
balance hdr(host) ' R; s% p. R! H
balance hdr(Host) use_domain_only # g  z2 z' h! q& S2 C. H6 `- d) j

# y6 O0 E- S0 D- ^! N  dblock { if | unless } <condition>  在7层阻止访问! n5 p7 ~9 z6 t* N% [8 n
Example:
& D" f" n% v' D, ]; a8 Jacl invalid_src src 0.0.0.0/7 224.0.0.0/3  acl定义和squid 很像1 P% u1 }' b+ W9 s) }7 t9 q
acl invalid_src src_port 0:1023
" {. o0 n3 Y) k: ]& Zacl local_dst hdr(host) -i localhost
* [: {  @9 T; yblock if invalid_src || local_dst $ Z' N4 O- e3 Y9 v

) C: \0 @7 k" V& Q! F5 \capture cookie <name> len <length>  在请求和回应包中捕捉记录指定长度的cookie,name 为cookie的开头几个字母
8 B  t" A. l: e- r8 ~3 k6 x
- R, u: O4 l# `+ X- S: aExample:
. J8 q7 O- X+ H) ?3 J2 m" bcapture cookie ASPSESSION len 32 & }6 R3 {) T2 A, z  t. f
# N6 d  J6 H. w" r7 V9 |* `
capture request header <name> len <length>
8 m/ r. q: j4 w- i. }' g) Scapture response header <name> len <length> 同上" h1 f5 _# q6 I/ s0 n6 v! y

6 a5 `6 I$ w( x, Iclitimeout <timeout> (deprecated) * |0 y0 X0 ?& ?+ Y/ y* J1 E5 e
contimeout <timeout> (deprecated)  客户端超时时间,不赞成设置, j4 {" O# N0 c& N8 h0 c, r: n
7 ]; l3 N8 t7 J3 T
cookie <name> [ rewrite | insert | prefix ] [ indirect ] [ nocache ] [ postonly ] [ domain <domain> ]*   允许持续的基于cookie 的后端连接
& }& L  P) H: E( v" Q. Y/ [
' q5 A  A3 I) Ndefault_backend <backend> 默认应用的后端
/ h# t8 A0 H3 Y+ |
: m( Z# E1 s. ]# i8 {' DExample :
# O! p3 c: z, xuse_backend dynamic if url_dyn : b" ]7 M& e0 J) p0 ?
use_backend static if url_css url_img extension_img . P. t' ~' b5 B3 N7 Z$ y
default_backend dynamic    当没有匹配时就用dynamic
1 m; B& Q) J$ u3 r8 a
0 d8 D$ T. C4 A: R& serrorfile <code> <file> 定义出现错误的代码的返回页
2 M4 X$ \' K* E% ZExample : & ]/ G7 g+ d% ~6 \
errorfile 400 /etc/haproxy/errorfiles/400badreq.http ) r3 Y. X% X5 f9 n" A/ j0 V6 R" S1 Q
errorfile 403 /etc/haproxy/errorfiles/403forbid.http
  W" ~; }# ?) Q+ C( J8 eerrorfile 503 /etc/haproxy/errorfiles/503sorry.http 3 t, \0 L3 c+ f5 E6 B

1 r% m1 s5 s* ?/ t2 A$ R  f1 Y& {) a! _7 o/ i% \& {7 V
errorloc <code> <url> errorloc302 <code> <url>   出错重定向到指定url& v" k1 L" S$ |& L$ _+ R
force-persist { if | unless } <condition>  在特定条件下,强制继续连接down 掉的服务器后端2 e6 N: \! k7 w8 g3 a! f: i
fullconn <conns>  定义后端组的最大连接数
1 I2 {+ h9 Z# B8 y8 {grace <time>  haproxy停止后,再持续多长时间用于处理连接
' G8 [: Y' z1 J$ t9 X2 Ahttp-check disable-on-404  如果后端检测返回404,将不再把后端计入负载均衡5 f7 u6 M+ l# q  k3 a# ~
http-check send-state 允许haproxy 发送 X-Haproxy-Server-State
( V+ O+ v+ y. E. Nhttp-request { allow | deny | http-auth [realm <realm>] } [ { if | unless } <condition> ]   七层访问控制
$ Q0 Q+ {+ y- h) p6 m/ {: U( j1 VExample:2 [* \3 x' {6 d+ S+ S
acl nagios src 192.168.129.3
; U0 k+ o# s$ M, l, V& Y2 W+ W0 jacl local_net src 192.168.0.0/166 x% H6 [6 w# g! p
acl auth_ok http_auth(L1)  A8 I3 C4 H) M, M( t: p4 j9 u0 v5 k

3 ^* Y" e* _" V, v' Nhttp-request allow if nagios
/ b0 A6 t+ W4 I% ?& ?http-request allow if local_net auth_ok
) v4 X) \8 |( f. n) [1 m/ T/ B/ X7 O, V  Ohttp-request auth realm Gimme if local_net auth_ok( b/ I* E' a% i# H% L
http-request deny/ h5 j% t: e! O/ [; p

/ s# v# R& x9 e$ B1 QExample:
1 W) a8 h! L) y! J, H- P7 {acl auth_ok http_auth_group(L1) G1
- _! H! x; y+ r$ g2 ^
9 X* W9 n% h/ z9 w+ ?$ Dhttp-request auth unless auth_ok
. Q2 w2 F! Y0 \2 s3 q. o
! y9 \+ o; J. ]mode { tcp|http|health }   设定启动的实例的协议类型- T, ^4 @5 K3 ]5 e  y) w
monitor fail { if | unless } <condition>  监控失败条件设置
0 E- [* r& a/ m/ ]" W' H% a+ m
) p" D% W$ _' o4 ?option abortonclose 丢弃由于客户端等待时间过长而关闭连接但仍在haproxy等待队列中的请求! V) {' ^1 y% M6 A9 c5 C+ [
option accept-invalid-http-request  接受无效的http请求,建议关闭(开启可能有安全隐患)' l" g2 W0 N) ^9 O7 F& I8 a: {
option accept-invalid-http-response 接受无效的response ,建议关闭" q  R* ?7 [% c2 V1 A
option allbackups  应该是后备服务器,如果正常的后端无法使用,就使用这些后备的设备,balance方式还是用原来的,没有优先的选择,常用来提供错误的页面
3 |1 M8 J! p; o9 Y( toption checkcache    分析后端response,阻止可缓存的cookie,它对response 进行严格检查,包括"Cache-control", "Pragma" and "Set-cookie" ,查看在客户端代理那边保存是否有风险,如果这个允许的话,符全以下条件 的response 将被允许,其它的将被阻止。$ |- x0 M$ D( o0 F' ~' z
- all those without "Set-Cookie" header ;
% F0 C* T& |9 p9 M# p1 H  L" z' c- all those with a return code other than 200, 203, 206, 300, 301, 410,  d( q! @% C5 n+ E3 k3 D
provided that the server has not set a "Cache-control: public" header ;8 @1 L# |2 \4 I. ]
- all those that come from a POST request, provided that the server has not
' X* l$ c) O- n' C4 w& Jset a 'Cache-Control: public' header ;7 U. V5 Q6 O! d! V6 A- _4 @
- those with a 'Pragma: no-cache' header) V1 h1 M8 t# U0 Y2 {+ c0 t
- those with a 'Cache-control: private' header- m' ]- K4 W7 |% G
- those with a 'Cache-control: no-store' header
7 s* r( i) H( N* T- those with a 'Cache-control: max-age=0' header, m0 m# K! N6 [  f( W% t
- those with a 'Cache-control: s-maxage=0' header
, _! c$ n" ^1 H+ v2 _- [- those with a 'Cache-control: no-cache' header
% @1 R5 v$ d9 j' P- Z3 B2 I- those with a 'Cache-control: no-cache="set-cookie"' header
- A! g; \: Q( o9 y% b1 W/ z" _- those with a 'Cache-control: no-cache="set-cookie,' header; n0 L) O/ e6 i6 C+ B/ \& y* u; K
(allowing other fields after set-cookie)
! }2 n. u2 M4 e; c7 N0 @/ `- {2 A5 a+ R- n" B
option clitcpka   是否允许客户端发送tcp keepalive 包,这个和http 的keepalive 没有关系8 @) ^6 C" E0 M2 a, h
option contstats   允许连续的流量统计更新" M' W7 g  K/ w9 J- t- ^  c
option dontlog-normal   开启正常连接的日志
7 |* ?. g: _& v/ k! i1 Z( C, d7 coption dontlognull   记录空连接
/ n! H0 g" ~5 j# y9 O* Ioption forceclose  允许关闭session 在后端把response 发送后7 z9 ?- {: f: g" Y7 U' `1 }
option forwardfor [ except <network> ] [ header <name> ]        允许在request 中加入X-Forwarded-For header 发往server$ R/ B, f; C6 M" Z7 A* S
option http-pretend-keepalive    定义是否haproxy要宣布同server keepalive- }2 P2 s( a' K: z
option http-server-close   是否开启在server 端 connection closing0 r( ~  r' n4 N0 Y
option http-use-proxy-header    用non-standard Proxy-Connection 替换 connection
+ I; e) [3 k+ B" R, K# \$ m# ~* _1 Z/ _0 B  w1 u7 h

6 ^: _; D$ e1 s2 k& L9 koption httpchk <method> <uri> <version>  允许用http协议检查server 的健康8 D/ p% ?7 d, f$ I' @1 q  k
Examples :2 {# ?! D9 C$ X/ y& I. ~
# Relay HTTPS traffic to Apache instance and check service availability
; q+ G" `; M1 q+ d# using HTTP request "OPTIONS * HTTP/1.1" on port 80.
. S; A( i1 @! z4 {7 vbackend https_relay1 V9 e8 U4 z5 ~0 w3 z
mode tcp* H3 B9 j7 t! I; T* }: n
option httpchk OPTIONS * HTTP/1.1\r\nHost:\ www
, E- _+ g% A& @4 P" }server apache1 192.168.1.1:443 check port 80* m: F) c* v  m2 x. n" ]+ E7 v
9 W8 y3 w- F2 g* i# K5 t
option httplog [ clf ] 定制日志格式
4 P5 ]. v) [! H4 ^option http_proxy  开启http 代理模式,只有最基本的代理功能
; z- l" |1 D1 S2 t" Woption ignore-persist { if | unless } <condition> 在某条件下拒绝持续连接,适用于对静态文件的负载均衡) `; n3 Y1 r! U
option independant-streams  启用双向超时处理,如socket 的read 和write
% R. M$ R$ C6 J8 g( b% [( Aoption log-health-checks   记录健康检查日志
" `% v* r4 Z: v4 H+ b. }( Q; poption log-separate-errors   对非完全成功的连接改变日志记录等级
. ]! y( ]: X' a# p8 X4 i8 F4 ]option logasap   大传输大文件时可以提前记录日志
+ l* I- y& q+ d0 ooption mysql-check   mysql 健康检查
0 p: [! l/ t& v; Y8 S0 a8 A. Toption nolinger  清除肮脏连接后开成的tcp 状态及占用的资源,不过并不是强列要求你用这个选项,当然如果你有thousands of FIN_WAIT1 sessions on your system ,那肯定得用了$ n/ _! e3 x4 N! C" r# T3 [
option originalto [ except <network> ] [ header <name> ]   允许在requests中加入X-Original-To header 发往server9 ~4 M9 a" ]  P! e( E/ {% M6 `+ l
option persist     强制将http请求发往已经down 掉的server
; I) c6 W9 ^+ b! V( r! K9 doption redispatch   是否允许重新分配在session 失败后
% y& D( Z  I- c1 F+ F5 D& o& Roption smtpchk   smtp 检查% d6 T) x% x$ L1 N, Q- P
option socket-stats  允许对单个socket进行统计% ~- j( R: ]# m1 N" @3 S5 }
option srvtcpka  是否允许向server 发送keepalive+ m% O. I4 e& }" c0 [2 T* t
option tcpka 是否允许向server和client发送keepalive
, ~, T- [; m4 K0 d. j3 g/ _option tcplog  允许记录tcp 连接的状态和时间
% X+ }5 l9 _  Q' J& }2 j2 Foption transparent   允许客户端透明代理
9 \& {$ |0 F7 s8 W5 b4 ?( Nrate-limit sessions <rate> 设置frontend 每秒处理的连接的上限,如果到达上限就停止建立新的connection: M: [. y; C" l( c
; ]' C* b* r' K# v# g) S
redirect location <to> [code <code>] <option> [{if | unless} <condition>]+ h  `, k0 f# c6 m! `/ b$ m
redirect prefix   <to> [code <code>] <option> [{if | unless} <condition>] 重定向,相当于rewrite
4 G  g. P& M! ]- v' D3 b; z9 P2 @" D0 p$ W& i) S0 R7 ~5 c  f
Example: move the login URL only to HTTPS.
) \2 v9 J; Y0 I* W1 v9 Macl clear      dst_port  80- W$ s# w8 c) q2 \/ }2 }  }' N
acl secure     dst_port  8080
) a4 I' d$ h6 r- uacl login_page url_beg   /login
$ Q+ v% O1 p  E  t' tacl logout     url_beg   /logout
/ n/ C, ~) V' K( z+ c9 I2 P. [" pacl uid_given  url_reg   /login?userid=[^&]+  t) r3 t9 P) j9 @1 X
acl cookie_set hdr_sub(cookie) SEEN=1
& X& j5 v2 y) T0 F2 D9 Q* F
6 b0 y9 p2 o. l6 G( e% `+ M9 F6 sredirect prefix   https://mysite.com set-cookie SEEN=1 if !cookie_set; @0 H+ b3 u$ e; }
redirect prefix   https://mysite.com           if login_page !secure3 m( g' N/ G  Y" G- }
redirect prefix   http://mysite.com drop-query if login_page !uid_given
9 |0 ]3 l: l1 yredirect location http://mysite.com/           if !login_page secure
5 q. W% r& o% T9 C! B6 i! |redirect location / clear-cookie USERID=       if logout
: A% j5 k0 W4 |( H
! I, O) o. s8 F/ Q9 U6 _Example: send redirects for request for articles without a '/'.
# l6 A! H0 v/ Eacl missing_slash path_reg ^/article/[^/]*$
( X5 J: y) K3 P" r0 b8 \6 Oredirect code 301 prefix / drop-query append-slash if missing_slash" v7 [1 s0 [& F( j( p6 t
redisp (deprecated)  ~8 r0 Z2 X( w: l
redispatch (deprecated) 开启session 重新分配在connection连接失败后,不赞成启用5 r& O5 c% |- `
reqadd  <string> [{if | unless} <cond>] 在http请示的末尾加上string: `& u0 b) e$ l

5 [3 I+ {$ ~# v' yExample : add "X-Proto: SSL" to requests coming via port 81
3 T% f/ M5 E% b( n9 yacl is-ssl  dst_port       81
3 ~% P' X# N! Y5 v- R' breqadd      X-Proto:\ SSL  if is-ssl
/ Q& M$ n; d" L3 K2 T5 K7 A  A& @. H7 o, X) e5 ]
reqallow  <search> [{if | unless} <cond>]
; u. R) M9 u% P/ t" g" areqiallow <search> [{if | unless} <cond>] (ignore case)    request 请求访问控制8 G4 r  `3 m" D. b5 E+ {

) Y6 s+ P/ [0 fExample :0 [: t; ]1 r2 F  h! N) j5 J
# allow www.* but refuse *.local
4 @* g+ `% |+ |, L7 y; Oreqiallow ^Host:\ www\.# _: U2 A: @& s2 r
reqideny  ^Host:\ .*\.local
( i/ g# Q: k( b/ D! g6 ^: g* T2 \7 Z0 f1 j$ K" f
reqdel  <search> [{if | unless} <cond>]
; {  \% S$ W4 v: Oreqidel <search> [{if | unless} <cond>]  (ignore case) 删除请求的head 中的内容
$ i, S$ T1 _' b! c) c, O/ c4 `* L9 Q* G. Z( ^5 H) c
Example :
& x+ q9 U: w3 _1 F$ Y: ~" s# remove X-Forwarded-For header and SERVER cookie$ E# p8 W( m- S: b0 \
reqidel ^X-Forwarded-For:.*/ A) l- h3 ?0 X
reqidel ^Cookie:.*SERVER=
) i" a; P3 l8 q5 `. e1 t4 q# `0 T3 x) ]. |  o* r9 C! z. i
+ b9 V) B: N& F8 X+ ?
reqdeny  <search> [{if | unless} <cond>]
/ P4 `- k( ]* s5 G+ Mreqideny <search> [{if | unless} <cond>]  (ignore case) 拒绝访问
# ^( \+ P: X5 b( J* m% I4 O& g0 M2 A4 {  o% o
reqrep  <search> <string> [{if | unless} <cond>]
* l' H# w1 N! t; Hreqirep <search> <string> [{if | unless} <cond>]   (ignore case)  request 请求替换
$ S- l% ?8 C8 j9 ~# U1 x9 K7 NExample :) K6 t- ]  m: V. a' d
# replace "/static/" with "/" at the beginning of any request path.$ l; i8 d7 L( G1 F  `( G, l
reqrep ^([^\ ]*)\ /static/(.*)     \1\ /\2
) ^- ?9 m# a/ C3 K: t! K4 g# replace "www.mydomain.com" with "www" in the host name.
5 Y3 X0 s5 Z( ]$ G+ w& G( ?# |reqirep ^Host:\ www.mydomain.com   Host:\ www5 r* S& W. L& p6 a! m" V
5 C4 d' P& O! C3 W
reqtarpit  <search> [{if | unless} <cond>]
. j: I- I, @% treqitarpit <search> [{if | unless} <cond>]  (ignore case) 阻止http请求中的某些信息) h; W: b7 W% L/ e8 O

5 @0 [0 I/ h& LExamples :
' \" ^* b7 o$ d% q# ignore user-agents reporting any flavour of "Mozilla" or "MSIE", but
% \$ Y# s7 n/ d) K5 ?/ S, q6 X; Z# block all others.$ H8 I/ A! F$ q7 A- {. J
reqipass   ^User-Agent:\.*(Mozilla|MSIE)4 g2 m( c" Z1 o* N9 H- S
reqitarpit ^User-Agent:
; ?+ M/ l/ d, c+ Z+ N) K
; F3 O) \$ S3 D: D% }) f' M# block bad guys
! j- ~! p# w$ L% x$ ~: iacl badguys src 10.1.0.3 172.16.13.20/286 a9 B+ G. V/ m: b# n# s5 y$ t
reqitarpit . if badguys0 l4 q0 h4 g! @5 t3 {
8 M! \3 K3 F2 \$ z/ c
retries <value> 当对server的connection失败后,重试的次数2 f2 v9 ?2 l, q% G* y
rspadd <string> [{if | unless} <cond>] response 增加信息! I( }' f  T  W# X
rspdel  <search> [{if | unless} <cond>]' A4 J8 B0 \* Z% L' e, V: ]
rspidel <search> [{if | unless} <cond>]  (ignore case): {8 j* b) Y5 l! B8 J
rspdeny  <search> [{if | unless} <cond>]. ~- ~6 w/ E3 c. P7 I
rspideny <search> [{if | unless} <cond>]  (ignore case)
& b8 O5 b9 U; Hrsprep  <search> <string> [{if | unless} <cond>]
# p( k, L9 Z' s$ Srspirep <search> <string> [{if | unless} <cond>]  (ignore case)) i6 z. g$ y& X  w6 x6 O$ i6 E% v
以上和request 的差不多
+ {9 u  {; `, S' ?8 g/ `
6 ^/ K8 _: O8 x' N" _* csource <addr>[:<port>] [usesrc { <addr2>[:<port2>] | client | clientip } ] 定义从代理出去的连接的对象,用于限定地址可以访问server4 S0 V! l& P, I  |
0 e1 w9 E' g( i+ \5 ^
一些timeout
/ h1 y% a7 c7 q. M; @8 r6 ~- b& t
srvtimeout <timeout> server 处理超时,不赞成设置
1 f6 V- w- \( ]# c7 B3 W& |timeout check                             X          -         X         X
" i/ e5 T" }5 H) t0 Utimeout client                            X          X         X         -
& Z7 D1 R! T% U9 otimeout clitimeout          (deprecated)  X          X         X         -
0 I( u' {) I3 x, r+ }2 Wtimeout connect                           X          -         X         X
7 g4 P- A. C8 M4 btimeout contimeout          (deprecated)  X          -         X         X; m1 ]% F+ r: l; [- R: ^
timeout http-keep-alive                   X          X         X         X, e1 U, N* @$ ^- u) V8 `* t# ?( U
timeout http-request                      X          X         X         X) @2 z6 {$ ~  ^: B( G' B1 N
timeout queue                             X          -         X         X
& H5 ^4 d: l; w) V* @$ M0 k; gtimeout server                            X          -         X         X
* s, C) t; j: H& ?/ gtimeout srvtimeout          (deprecated)  X          -         X         X
9 s9 @) d3 ?4 {9 H0 ~timeout tarpit                            X          X         X         X
: b0 ~. x3 q9 c# k3 g/ V( A8 r$ a4 D# e. p8 c# B
( y7 G2 _, J- s
stats auth <user>:<passwd> 监控统计的帐号和密码+ j/ Q  c, n  `9 a+ I5 D( ]6 s
backend public_www$ R$ M; k; d# A. Z! w# N% r
server srv1 192.168.0.1:80: M2 G# @! E7 Z6 t
stats enable
' d! S9 @# h- }* ystats hide-version
# s& X/ [6 h* w& f& \3 ~stats scope   .4 o8 d( [( c+ m  s, O: v$ q  x% m1 Y
stats uri     /admin?stats
2 z) j$ _" N% ~2 Istats realm   Haproxy\ Statistics1 J$ T% w* n. g& z8 b' s& x
stats auth    admin1:AdMiN123' h/ w$ X5 Q  D2 ~. J+ z
stats auth    admin2:AdMiN321
% t  d) Q; k( Y. |
' G9 Y' R) T' M  R* Z- Z1 o# internal monitoring access (unlimited)
$ a2 ]+ ^! Z; i9 ?% Ybackend private_monitoring
/ y/ M9 W. T+ r' gstats enable: P0 B5 }* K6 k* Y- a
stats uri     /admin?stats
0 ?- \- T' r/ K1 d4 V) `stats refresh 5s$ E, w, G, |' f5 K6 c* ]
# \+ Z: [4 p) A, ?$ v
还有很多参数,以上能用到的也没有几个,只要满足当前需求就好,对于性能要求高的话,建议把不需要的功能 都关了吧.. H- @, H$ {3 v( ^& r$ W

, d5 S; [+ ?  H  n, X====================
& g. ~* J' ^, H1 t# Q% m! j
% t, L* U' p6 T# R2 M5 ?. uHAProxy的配置示例& q) T! i9 V: K, d+ l
7 n7 Y6 S: Y% R# v0 p
HAProxy配置中分成五部分内容,当然这些组件不是必选的,可以根据需要选择部分作为配置。
# Y' w4 T+ u* V, a5 Yglobal:参数是进程级的,通常和操作系统(OS)相关。这些参数一般只设置一次,如果配置无误,就不需要再次配置进行修改! g2 i+ s, Q" f7 b9 D2 Z. [
defaults:配置默认参数的,这些参数可以被利用配置到frontend,backend,listen组件
+ E# u( y# J9 g6 V8 U# l0 Rfrontend:接收请求的前端虚拟节点,Frontend可以根据规则直接指定具体使用后端的 backend(可动态选择)。
3 ~7 W' Z( {$ Cbackend:后端服务集群的配置,是真实的服务器,一个Backend对应一个或者多个实体服务器。0 d3 k  i$ _& }2 A1 b& C7 J
listen:Frontend和Backend的组合体。( J2 ~0 F9 h0 H- w
$ L7 @1 s9 ]0 w' n( y+ c" \
下面是HAProxy的一些常用的配置,这个配置是用来说明HAProxy的一些常用功能的配置,具体详细配置请查看安装目录下的doc目录下的文档文件,或者到http://cn.haproxy.org/下载中文配置说明文档" Y1 c9 S' [0 h; g& q5 ^* Y% T7 ~/ g
' M+ ^4 i* }: f- P- w* P
配置具体实例,后附说明:
+ F6 z7 l  R7 G+ g
  N6 t3 e' w5 A3 X" t& b. `/ Bglobal
: g# l8 M! ?8 F# H8 r+ Q
( X" H7 v. `$ i; l2 }% T5 \: }#全局的日志配置 其中日志级别是[err warning info debug]6 L( e# b, ~$ D% j* L/ r

4 v4 M% k5 V0 b, C) I#local0 是日志设备,必须为如下24种标准syslog设备的一种: 9 ^; n3 R1 [2 ]0 _+ g
3 E: j! W& p4 m; D. P) ^* _/ o0 _
#kern user mail daemon auth syslog lpr news
6 t5 z6 O# p2 c9 w
, i' a; x' A" P& ], r#uucp cron auth2 ftp ntp audit alert cron2
3 A- O8 p; N/ K" K; {0 T% C3 Q+ n
2 `4 [" ?7 m; I+ o$ G* e5 M$ u#local0 local1 local2 local3 local4 local5 local6 local7
3 e: Q9 @( B0 Y
( ]! }# {. r4 ]6 Y+ P0 W" }#但是之前在/etc/syslog.conf文件中定义的是local0所以
5 v' @, P% E! _* u! Q" S5 M, T0 o! M, A
#这里也是用local0' C/ G. s5 z# F' E4 L; W' g% i

9 Y& @5 l% Y0 vlog 127.0.0.1 local0 info #[err warning info debug]/ a7 q1 b" T( C% ^2 }3 j

9 h( Q# X; W: b* v. h( I#最大连接数# Q+ O! V; u' \0 U5 Z8 ?2 E! d

6 v/ I8 x' u4 s2 e: @' [maxconn 4096; w" N4 K; J# L6 X* ]9 S2 X

: q" C* h  Z/ V7 X  F7 Z6 z0 }#用户4 [! D+ v& ~7 x1 Z4 F* w
" K2 b2 P* z& L1 R+ ?9 ~8 x
user admin
' C+ R" n0 s5 N5 y+ N& Q1 [7 ~* A6 {! x* T0 b
#组6 y  L2 j/ v2 `5 }2 _9 U

+ V9 V' Q# p- n+ T5 {6 C& N, Q3 N9 qgroup admin- [0 X$ g7 a  L+ P/ V
4 L+ O3 y2 H$ M8 o3 R: Q
#使HAProxy进程进入后台运行。这是推荐的运行模式5 j6 T, m! V0 @9 k. w" O( J7 `* i0 \
/ W, ^4 C1 V" |2 L4 F
daemon
- ^* k, ^! T% g
5 G. e# J2 {# z% p6 {#创建4个进程进入deamon模式运行。此参数要求将运行模式设置为"daemon"
0 l# h" D6 v+ @" G1 X6 G# E/ z! f! P' z) ^1 Q3 K; N
nbproc 43 n! k4 R4 K! l5 k  a
4 V" J% F, _9 z
#将所有进程的pid写入文件 启动进程的用户必须有权限访问此文件。) ]2 t" R8 K7 w, B' Z# D

4 {6 k( S; B. `  j2 wpidfile /home/admin/haproxy/logs/haproxy.pid
* [" i6 C# ?/ `3 {' q1 V+ A1 O- W
- o3 F! }5 o& J" p2 W1 Qdefaults
0 p+ q1 w; _. t+ b. [& T
; L, C* p8 A- h/ S" r#默认的模式mode { tcp|http|health },tcp是4层,http是7层,health只会返回OK$ D. {+ L- {$ Z% F' T

7 ~7 [4 R$ M0 W7 p" `mode http
9 b& e0 d4 ^/ A+ U5 H& G7 g% `" V; U: _
#采用http日志格式
( z# o3 i) U. o7 M  D. M* u) ~1 S& l  ]* U
option httplog
' \' a# v: _% L% [" C+ W4 r7 |9 F2 B, A" n
#三次连接失败就认为是服务器不可用,也可以通过后面设置0 d( Y$ w) I7 P+ e* }  L$ W8 ~

( k/ s, R9 H: m7 D7 q9 zretries 3& j( o( T/ |' @# D) O/ p/ Z2 |. j

; q, w& ]3 K2 y! y如果cookie写入了serverId而客户端不会刷新cookie,7 |8 j3 E0 |. Q0 i8 _

/ j1 k  y# b- ~: F; u" L& T#当serverId对应的服务器挂掉后,强制定向到其他健康的服务器3 }; U2 o" z: z2 _0 X

! H, y% F& i/ O0 Q" \option redispatch
. e" `  P% C3 w+ O0 R- F* C' {' J% d4 S% @2 L
#当服务器负载很高的时候,自动结束掉当前队列处理比较久的链接5 O. X* R. l* b8 P  a+ t3 Y

( ^! b5 K- Y6 ?5 |/ E* Doption abortonclose
5 q, M% I3 Y9 k4 O' Z
/ ~- h1 f3 L# t5 Z, w#默认的最大连接数- F$ T8 X7 _3 e7 s- ~3 S: y

# G! V, l8 b# V/ q! bmaxconn 4096
& V" a6 o' a* a. z- I  r# c; V
' k" g1 a3 T! ~! w2 ]6 u4 u#连接超时/ g  l7 u1 ~, \' N* n
" N8 X: G0 b: [7 C
contimeout 5000) z$ n4 J  }4 \
, K3 u  K5 m0 r+ ~
#客户端超时. }8 {( H& ~' j- ]  z, M
; J) }8 ?( Q, Y& H8 N( F) g
clitimeout 300004 n) l; j" @% c% d

4 I) U9 t) b9 n/ G#服务器超时% {0 a2 i  N% l$ G6 M

2 I$ Y2 S# k; `8 lsrvtimeout 30000" n1 l. Q! e' z; D' p1 N

9 i# u' k2 n9 l& _#=心跳检测超时
' E# d" L% [6 F( ]9 c) _- R/ s& o" o
) j6 F  F2 T2 ~timeout check 2000' {& R5 ?) [  n( `* t- A
3 Y  u; K: K% V" j
#注:一些参数值为时间,比如说timeout。时间值通常单位为毫秒(ms),但是也可以通过加#后缀,来使用其他的单位。
, u5 E8 F5 F. R3 e6 S: r& ?' M: C3 U# C0 W
#- us : microseconds. 1 microsecond = 1/1000000 second$ ^* }  \2 M/ k! o
3 B. q8 |/ k7 q, W  L% q, p. I
#- ms : milliseconds. 1 millisecond = 1/1000 second. This is the default.9 v6 m! E; S' i* i- M: W
$ {$ H9 ?: Z! p+ o( P. A$ v
#- s : seconds. 1s = 1000ms
. m- I) x& s& e+ J2 k1 G* N' I6 C7 z
#- m : minutes. 1m = 60s = 60000ms! j; [9 \' X; K, t4 X1 x' Q' {
) N: I/ k  D% z! M( `0 _4 x
#- h : hours. 1h = 60m = 3600s = 3600000ms
3 j  Q& F; X/ m. }" j, z7 g
2 ?2 ?, `1 b) m4 N" R0 E9 \' p#- d : days. 1d = 24h = 1440m = 86400s = 86400000ms
' A+ f$ v6 X% @! r- |+ C! O7 d0 J1 h. q8 x9 h' `" z2 |7 s
########统计页面配置############# ]7 h. t2 B6 e( B8 A* D# o

: a' f) ^6 w. z3 }listen admin_stats
7 R3 }7 t% c& o, b1 u! O0 k. P" m  E' g
#监听端口# z9 C$ I& A  d3 \

* P5 M$ r; s% e9 G% rbind 0.0.0.0:1080# B* ^8 |7 I1 M  Q

8 B: J- q) [  y  [9 t#http的7层模式
% k, v" g/ o% q  M0 F! t3 x& f# q$ [1 S2 H; E3 u8 P, r+ E/ n
mode http
" {. Q: l: P% Y
9 ~9 [4 e0 P( |$ Z( r1 V2 {# J# v#日志设置
1 s6 B3 H# Q6 ?0 k& \' |' a5 J  C* B$ C8 {9 x+ T; s2 p  c& D
log 127.0.0.1 local0 err #[err warning info debug]" s& q; b2 R4 Y' S
6 U  p% M/ q# V! U1 r
#统计页面自动刷新时间
4 X! `  z0 v# d; h' C" u( _! R* d3 k) Y
stats refresh 30s1 g1 O0 Q# W6 E$ q  h* f

/ N% z; t  c8 |% U#统计页面url
& M3 x6 v7 r1 R$ i3 y3 p/ |4 \+ H7 g/ l6 U: g* Z5 D
stats uri /admin?stats
: B* u* _0 Z3 b, X8 u0 h1 O- b2 A: ]* \1 l
#统计页面密码框上提示文本; F1 m  U' v0 r- B0 J8 o/ X( _! V$ V1 j
- b) L/ w  R" Y  v9 J
stats realm Gemini\ Haproxy9 o+ Q( j( Z% {' j* q

: G  j3 b9 H, ^& p) Z! E' u) F# c#统计页面用户名和密码设置) t, z9 K9 o2 ?1 T! J. m; v
* m$ N+ @/ u! {( X, c
stats auth admin:admin8 o- g/ b; B5 q; z' O/ A% U
6 L/ d1 e& k/ l0 [  Z2 A7 Z8 ~6 J
stats auth admin1:admin1& c" D, J( f8 q

( d5 v; u8 ~0 Z2 G* Q#隐藏统计页面上HAProxy的版本信息$ }# d: Y5 o5 r* O+ Z
5 a2 _0 `! _* p" K9 L* B+ o" ], @3 `
stats hide-version
1 V; B& p- K7 k0 }/ A' D
" U: X  z8 I5 L1 b% F: z#######网站检测listen定义############9 M" s2 m8 q# ]0 w: T

2 I$ L; B, v( d- tlisten site_status: @4 o; H# Q( }, B2 z5 a
" w6 d3 F( a, W8 a7 `
bind 0.0.0.0:1081/ @4 ?6 R" h2 Q$ {$ _- z& ^2 g

  {7 A+ a2 g) h3 Hmode http
- ^3 P& P. U( m+ T* L+ z. n6 M9 [
' Z  U5 T" i8 }1 j4 Vlog 127.0.0.1 local0 err #[err warning info debug]: _+ K& w4 Q2 S2 V

3 y$ K! R; r9 T) J7 V#网站健康检测URL,用来检测HAProxy管理的网站是否可以用,正常返回200,不正常返回500
- z" A% P7 t) X" r
; w, k' J3 ?. T! v; J$ K1 u4 Tmonitor-uri /site_status. v1 c4 A" Q1 c2 ~
, k& Y8 J: u( c* ?& e0 D& m  a' s
#定义网站down时的策略$ G) t4 ^0 Y% r, k% |
" \+ @2 }4 x* ?2 d+ \( A, b
#当挂在负载均衡上的指定backend的中有效机器数小于1台时返回true
1 {) p7 h& v! [% v
% p: t' Z5 T; H3 F- a' E5 hacl site_dead nbsrv(denali_server) lt 1
; |3 Z4 j( S5 z" Q- U' D% _9 S; w$ c1 ]5 y' x
acl site_dead nbsrv(tm_server) lt 1
. y. E/ r; g& R
. t4 |6 k3 _1 w% X2 J0 xacl site_dead nbsrv(mms_server) lt 19 i6 }" n6 N/ g5 k
5 Y/ C8 G5 h' r2 O) E: Q3 J
#当满足策略的时候返回500& O5 [. y+ P+ m3 ]9 C$ t

) W7 e1 h0 L/ R, \# omonitor fail if site_dead
$ d- y/ |6 B$ S$ ~
! W* @" D- f3 r#如果192.168.0.252或者192.168.0.31这两天机器挂了2 g$ d2 ]0 M3 Z7 q

0 S5 a! E  a6 L#认为网站挂了,这时候返回500,判断标准是如果mode是
2 `* ~6 k8 f' L7 ]: ~; f
# ^3 o( W8 f2 _; y6 b7 }3 ?#http返回200认为是正常的,如果mode是tcp认为端口畅通是好的
5 J1 N* n+ x& j7 V) Q. [
& n; c' s; S0 dmonitor-net 192.168.0.252/31
5 s! q0 d# f8 U# {" _/ `) l. ~% c( }! `: f) E
########frontend配置############
+ n0 i5 `& ?0 A* D. k, X/ `: b; y- t9 k) k) E  n, d8 K
frontend http_80_in
6 q7 `- g' I2 Q  a; }0 p9 k2 z8 |3 L9 {0 a- L3 l
#监听端口; i. O& z9 S& I& _7 t
3 o% Q! j! h; J
bind 0.0.0.0:80
7 [0 _' z& B4 f. ^3 _
+ m  e  ?0 @& Z8 S' Z% A! s/ o#http的7层模式
4 r5 R# ^$ h, }3 R1 \0 y2 k4 }9 q7 S5 ^# H
mode http
) Q5 h  W9 I8 \
" R; M& ?# \% B1 G2 r" X#应用全局的日志配置
  z# w, v/ ]+ d  J5 Z& P" [, k# a" q
log global2 [: Q. v2 c/ C! P! u3 ?

. s" y  o, P8 k; a: V#启用http的log4 d- m2 I! Y+ W2 x. e7 q

4 H6 z5 F. |+ T9 z( k" Aoption httplog
% r( L2 u8 S7 j; d  U; V1 X" ?3 T$ i, S0 ~9 Y5 b5 z5 D1 n8 d
#每次请求完毕后主动关闭http通道,HA-Proxy不支持keep-alive模式) F: @3 X) [8 P  w
, j4 E  M8 D9 z9 A: }- z
option httpclose& D% J# N% ^& J3 D7 ?

% W+ ?- o# o) \0 B9 w#如果后端服务器需要获得客户端的真实IP需要配置次参数,将可以从Http Header中. h. O% V( H. d4 A2 W( q' y

+ a# @& D2 b% L2 s* l8 k0 u5 D- i#获得客户端IP
& {5 }0 E3 X3 q; L- E0 ^7 x7 p! \+ Q1 n3 u6 }( i
option forwardfor
) m, P$ A3 ^8 |0 _9 ~( P& v
) d; j& C6 |+ T% g###########HAProxy的日志记录内容配置##########
8 M) f5 M0 h9 v
, J9 {. b) h- k( P& _" hcapture request header Host len 407 }7 n. G& Y3 c- F
$ P0 y8 Z/ M$ K6 x2 E4 N7 q
capture request header Content-Length len 10
& C  K4 D$ w5 @, Z* A2 x
, S" G* b$ B$ S& c$ j: ocapture request header Referer len 200& Q8 ^4 h- X/ B

$ P+ s# k2 X0 Ecapture response header Server len 40
% q: q8 Y$ D# o0 E. O7 b* S. W4 ]/ O) J7 F. N
capture response header Content-Length len 10+ X+ f$ X- n2 I6 |$ z) q

% ^7 @, p7 t9 xcapture response header Cache-Control len 8# ]$ m# q0 T9 R! ?

  ~# g" L2 g6 t, q' J####################acl策略定义#########################0 v( O. B5 M1 n% q- `  H# d

  q- C) \1 }$ n2 j7 r3 s0 R, K  T' \#如果请求的域名满足正则表达式返回true -i是忽略大小写
2 g1 x( B1 I; i1 D9 e$ d
) N- ], R3 w/ x! |+ Aacl denali_policy hdr_reg(host) -i ^(www.gemini.taobao.net|my.gemini.taobao.net|auction1.gemini.taobao.net)$
5 D) i% G4 i' r
" @, S6 M: Y! u* m#如果请求域名满足trade.gemini.taobao.net 返回 true -i是忽略大小写, L3 M3 l+ q6 T, _% L& v/ P4 z/ s
8 P& u1 X% B  L8 m( |7 r
acl tm_policy hdr_dom(host) -i trade.gemini.taobao.net
8 \# H' \- ], j; \3 \9 m& ~7 d
- {- _% m" G7 m3 J##在请求url中包含sip_apiname=,则此控制策略返回true,否则为false
( l& L2 W' Q: `, I+ ~" n. C  o7 v) Q5 M
2 \2 s/ |  D: Hacl invalid_req url_sub -i sip_apiname=
9 Z& z4 z* I/ R( n, F; r# D# W
" ?% W) q. w- m) `: }##在请求url中存在timetask作为部分地址路径,则此控制策略返回true,否则返回false
$ Y, A1 v( A  E) j1 W$ _! R- U0 v% H  Q( s! h' q  A3 e
acl timetask_req url_dir -i timetask
) `# s$ Y8 X0 E( J! s
# ?4 E8 Z8 |$ _- Y- ]: A#当请求的header中Content-length等于0时返回 true$ J6 n( P1 ~  U, ]% o$ s* \1 z

' T- \) v4 ~4 P5 i7 \acl missing_cl hdr_cnt(Content-length) eq 0" |  \  r9 q: @3 J8 d
, D0 J+ m- Z' H8 q! f. U* e
######################acl策略匹配相应###################0 l- ]* m5 D+ ~

9 N7 N# f" T  {$ p, p3 C; U##当请求中header中Content-length等于0 阻止请求返回403/ c* z+ S% {7 W8 {. r( n5 c9 I

5 S8 _# {, h' i8 V$ }block if missing_cl" b, T* x* w: g# X: S2 |! ^" Q

$ R3 |+ X$ u$ {1 o0 i: P##block表示阻止请求,返回403错误,当前表示如果不满足策略invalid_req,或者满足策略timetask_req,则阻止请求。
* g- D' v% @/ S3 x
: i/ h  H  |, v' j/ M' s2 @/ Xblock if !invalid_req || timetask_req
* C# M, T* ]- k: U
3 o) _' c. m' L, R#当满足denali_policy的策略时使用denali_server的backend
) p( \, m8 p6 L2 N: Y8 ?& K$ G  R
use_backend denali_server if denali_policy6 s9 M, p% s7 C! l. E
7 ^  \" |: J4 M& @( f
#当满足tm_policy的策略时使用tm_server的backend
6 I# g0 X  q( l0 x8 Z* O% O
: d) ?6 y# L6 G; s1 q2 W' I* U# buse_backend tm_server if tm_policy
+ g  L1 r+ i$ G4 _; X) q  v6 i
* K/ v/ }3 L+ [) X4 G#reqisetbe关键字定义,根据定义的关键字选择backend' d; t# u. e6 p% ?2 r
. T+ t9 U; J$ r% R
reqisetbe ^Host:\ img dynamic8 K; |, @# S$ V

# P9 I/ O& |3 E. M* Ireqisetbe ^[^\ ]*\ /(img|css)/ dynamic% \* O, S3 P; f& u3 V. p4 |! [

; b. q2 m5 p% V6 vreqisetbe ^[^\ ]*\ /admin/stats stats( m; k) c9 Y- A' H8 i. r

: R* s0 a" W0 \7 V5 [* X8 V#以上都不满足的时候使用默认mms_server的backend6 B# {* |& Z! M, m  a6 H, {
5 |* s+ W. v* z
default_backend mms_server
$ x5 K3 D8 e( {0 e$ Z' u
1 z( c8 z% D  v2 s2 x8 r#HAProxy错误页面设置$ M( ~( G) l2 w7 `; A) V
: L* H1 I# F* U+ n- ^& g5 e
errorfile 400 /home/admin/haproxy/errorfiles/400.http& F) }8 U3 z" l" L
  x1 v- x6 w' E7 ?& W* O/ E% C4 x
errorfile 403 /home/admin/haproxy/errorfiles/403.http
+ ^1 x: R' G/ j2 r
  Z% p7 f3 Y2 T# t# x8 Oerrorfile 408 /home/admin/haproxy/errorfiles/408.http
5 g; f- D! X& o( `+ O9 H. k5 g" q8 v$ j8 u% q: D
errorfile 500 /home/admin/haproxy/errorfiles/500.http
, s8 n! O6 n- R& O8 H7 P
8 ?4 t' V6 j$ A3 H2 L1 Yerrorfile 502 /home/admin/haproxy/errorfiles/502.http% @( I# a6 p2 h/ R4 _
, ^8 M0 Y0 O3 T* T+ S
errorfile 503 /home/admin/haproxy/errorfiles/503.http
8 f/ o, J8 C& K! Q. F5 y+ _6 Z. I* L3 w9 I. U  F* {/ D; J+ e* K
errorfile 504 /home/admin/haproxy/errorfiles/504.http
% n" f; W, d, a  R8 e# ]" ]2 Z0 x+ Q' }  C/ N; I2 ]
##########backend的设置##############$ Z* P1 }: Q3 Q
  j8 p& k0 X; V) J
backend mms_server- w" }$ [4 p1 u: @' F( \

: O3 l! K/ w$ @6 P#http的7层模式7 L$ E" ?5 N  J" }4 r) H& C+ D

8 p; h6 a& p- H9 Omode http1 d# p7 Y1 o2 E1 q
8 d: _  q6 _4 @, q. {) N* }
#负载均衡的方式,roundrobin平均方式
2 {$ B- S( K; I  |
; D  `  }) q& Cbalance roundrobin
* w( x, _/ `1 `6 G, M6 B
: m  p- F2 }* Q5 ^+ [* X3 E#允许插入serverid到cookie中,serverid后面可以定义3 M3 Y8 D6 P- z0 g4 c# C
$ w/ V2 q. z- z
cookie SERVERID" D  b& X% D7 A! \& s
  n/ @! |7 R9 p) x# w/ X* V
#心跳检测的URL,HTTP/1.1¥r¥nHost:XXXX,指定了心跳检测HTTP的版本,XXX为检测时请求6 D' V$ l: a  O3 v' @: Z( P
! u8 t% G8 y' t7 O
#服务器的request中的域名是什么,这个在应用的检测URL对应的功能有对域名依赖的话需要设置
6 R' q. y- G6 U" x; }
1 M8 c6 Y" _* L/ {option httpchk GET /member/login.jhtml HTTP/1.1\r\nHost:member1.gemini.taobao.net
9 ~9 e, K1 R: U: a% |- b
- b  G$ s$ @5 K5 p* A% \#服务器定义,cookie 1表示serverid为1,check inter 1500 是检测心跳频率4 y7 {/ i5 y5 d( D. J0 z

8 D$ a; J; _( g% n& e0 L#rise 3是3次正确认为服务器可用,fall 3是3次失败认为服务器不可用,weight代表权重
" d9 g$ R; o% `( a: i  T6 M4 d  V* b) |
server mms1 10.1.5.134:80 cookie 1 check inter 1500 rise 3 fall 3 weight 1
- F* Q! {/ I% _
& B7 U+ `. |& ?; P# m, s  s6 oserver mms2 10.1.6.118:80 cookie 2 check inter 1500 rise 3 fall 3 weight 2: f" \  X& y* S( J. v% I/ I
2 J( E. O, c" V! Y1 f
backend denali_server
/ z2 @) K3 }- v6 c# j. j
& H5 a/ h* Y; @5 smode http0 e4 ~: v) h, O  Y) H
/ w0 p1 S1 P$ B0 G; w' t
#负载均衡的方式,source根据客户端IP进行哈希的方式
* U6 x9 K! }; }% [% X( `  }& H& |5 w2 t' N7 g8 T9 p  I
balance source
$ K. ^4 n9 |9 o( p" ~% B+ x7 [. K- e) j8 V( J
#但设置了backup的时候,默认第一个backup会优先,设置option allbackups后$ o4 ]7 \8 q" {1 S; }3 c* ^

' t+ T. j8 D' A6 I" p; O, c#所有备份服务器权重一样8 J5 f0 h" D7 C6 m. u9 T9 \3 \

" X' d9 _& j4 Z2 Hoption allbackups
% |6 b# v8 P' L- h* i9 S$ _( b( E' m0 T  v' _6 W
#心跳检测URL设置
# d3 K6 x$ c/ m
4 a* K% |+ v* v. uoption httpchk GET /mytaobao/home/my_taobao.jhtml HTTP/1.1\r\nHost:my.gemini.taobao.net
- L) {  ~+ w) w9 Y$ H" P! e1 o& V* L; G+ @$ R! l  v& z2 w
#可以根据机器的性能不同,不使用默认的连接数配置而使用自己的特殊的连接数配置9 B6 B5 E. \& D4 L3 }
4 s1 A) a5 m# K+ G/ K
#如minconn 10 maxconn 20
: ~% A9 B9 f* G: z7 o# ~$ d2 n( t* ^. O! y6 _
server denlai1 10.1.5.114:80 minconn 4 maxconn 12 check inter 1500 rise 3 fall 3
* n1 N5 x& g0 N& o2 N6 Q0 p4 P1 a% r- p, d
server denlai2 10.1.6.104:80 minconn 10 maxconn 20 check inter 1500 rise 3 fall 3, p! j8 q& w9 A6 C

* X% H+ H5 \+ G5 g* b0 R#备份机器配置,正常情况下备机不会使用,当主机的全部服务器都down的时候备备机会启用
5 `' S& L  s: I& T: K1 m& C
" H2 h  p* U2 h1 Zserver dnali-back1 10.1.7.114:80 check backup inter 1500 rise 3 fall 3
2 L2 n& F- Z( K" Z+ y* s
! F& w5 ]" d7 [% n/ \$ pserver dnali-back2 10.1.7.114:80 check backup inter 1500 rise 3 fall 3
" E' _# M: J3 R- m4 n' ?
2 O" N1 ?& [5 @( d/ }! `backend tm_server) J4 b' F: k1 A+ X5 c2 m4 @1 q7 ^: t5 `

- ?* e6 S7 m; e0 d/ kmode http
* u5 B) w! d" \7 O7 Q/ g! ~# V5 Y) U* f8 F4 y/ ?7 A. e
#负载均衡的方式,leastconn根据服务器当前的请求数,取当前请求数最少的服务器' }. a  Q7 K% T9 R1 j5 g- q- J/ I
3 f4 A! p5 I5 s; Q7 _. H2 s  a" p
balance leastconn
$ e: ^* _& A. E# g; o' H2 ~* c7 p, U* |3 i# L  ^9 \0 c
option httpchk GET /trade/itemlist/prepayCard.htm HTTP/1.1\r\nHost:trade.gemini.taobao.ne( e4 w& \4 ~  {. t

( x5 e* S! _% v5 X4 zserver tm1 10.1.5.115:80 check inter 1500 rise 3 fall 3! v/ y/ z+ D0 L: K4 n
% P" t; N# q0 e$ H% J' ~
server tm2 10.1.6.105:80 check inter 1500 rise 3 fall 3
: v* }4 K' J8 f0 B' o" R0 M( l* f& Q( t' o
######reqisetbe自定义关键字匹配backend部分#######################
, s8 C7 p* B8 H; d3 E# N. d  E( N
backend dynamic1 C+ z2 [( D4 q0 D

4 [2 ]% f3 u$ S! H- a9 qmode http
1 M6 C( C" f  k9 p
6 C3 m* ~, R5 Y0 Zbalance source
4 z) ]9 q# Q: U5 x+ D' Y$ x2 p" ?
! x8 @( L( \& g. S6 U$ W2 {# j0 Zoption httpchk GET /welcome.html HTTP/1.1\r\nHost:www.taobao.net6 n2 Z% Z2 v) z5 u  h" T
: s$ y5 T6 J$ x+ M
server denlai1 10.3.5.114:80 check inter 1500 rise 3 fall 3
$ H; }4 i) E7 {: O1 u
0 m$ t7 ~: c( x7 k, L0 Pserver denlai2 10.4.6.104:80 check inter 1500 rise 3 fall 39 `5 m4 v& F/ k1 v- p+ Y- O0 ?$ c

$ f, g* N3 Z% C( P+ v8 Y2 cbackend stats9 j$ e0 L. ^; V9 z

3 `6 l/ L* [& L1 K3 m% E3 T1 `3 Jmode http9 S$ A- U2 x& r5 f* I
+ S: G+ J  ~, ]# Q
balance source7 W4 ]( O& a- ~: q  b( h- K5 o

  Y: H2 t0 L+ T- toption httpchk GET /welcome.html HTTP/1.1\r\n Host:www.163.com
" H8 `: K4 Y3 Z0 N( W: G! b9 Z) i1 w( h5 B: n/ {  ~4 [, b  B
server denlai1 10.5.5.114:80 check inter 1500 rise 3 fall 3
& D( _0 ~) a/ L8 k8 D- e9 s8 m7 l+ o6 x
server denlai2 10.6.6.104:80 check inter 1500 rise 3 fall 3
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-6-12 03:23 , Processed in 0.027822 second(s), 23 queries .

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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