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

haproxy配置文件讲解

[复制链接]

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
发表于 2017-9-8 10:03:56 | 显示全部楼层 |阅读模式
global                                                       # 全局参数的设置/ L9 ?# m/ x0 p* `$ z0 K
    log         127.0.0.1 local2                      # log语法:log <address_1>[max_level_1] # 全局的日志配置,使用log关键字,
+ Q/ K. E; s  b; h                                                                     指定使用127.0.0.17 a/ K2 c3 S: w4 n# H
                                                                     上的syslog服务中的local0日志设备,记录日志等级为info的日志
  j+ g/ x5 [7 h/ N/ h7 B    chroot      /var/lib/haproxy                 #改变当前工作目录" Q# G- T# C# M% e
    pidfile     /var/run/haproxy.pid          #当前进程id文件6 w1 j1 f5 L! T' o- C$ ~
    maxconn     4000                                #最大连接数/ Z1 l: [" S# c8 \+ h- n
    user        haproxy                                #所属用户  g# F/ f5 K" P! _& V
    group     haproxy                                #所属组: `& c0 D  y8 u0 m& v2 j
    daemon                                               #以守护进程方式运行haproxy
  N" K% p/ m+ j4 |  n3 P7 J; I9 E    stats socket /var/lib/haproxy/stats. X0 m  ]: [1 J3 ^3 d
defaults2 j, R& l: _% J3 G4 `4 d- `% D
    mode                    http                        #默认的模式mode { tcp|http|health },tcp是4层,http是7层,health只会返回OK
* a5 F5 S% d$ S* a    log                        global                    #应用全局的日志配置! L" ?* R5 t+ u8 A& e3 a3 s
    option                  httplog                  # 启用日志记录HTTP请求,默认haproxy日志记录是不记录HTTP请求日志- j. S# a0 K  z/ F
1 x# P0 X3 S, R: r) M: K
    option                  dontlognull          # 启用该项,日志中将不会记录空连接。所谓空连接就是在上游的负载均衡器
3 ^5 @0 H! Y' J, M& Y! C( X3 Z                                                                   或者监控系统为了探测该 服务是否存活可用时,需要定期的连接或者获取某$ K9 p0 P+ j. y# L9 \  |9 |8 z9 Q0 K
                                                                  一固定的组件或页面,或者探测扫描端口是否在监听或开放等动作被称为空连接;+ [* h" a: Q. f1 Q  R
                                                                  官方文档中标注,如果该服务上游没有其他的负载均衡器的话,建议不要使用
5 K% A7 w. I3 z                                                                   该参数,因为互联网上的恶意扫描或其他动作就不会被记录下来! {* {. b- J* n. N, k
    option http-server-close                   #每次请求完毕后主动关闭http通道- x5 o+ O3 D% g
    option forwardfor       except 127.0.0.0/8   #如果服务器上的应用程序想记录发起请求的客户端的IP地址,需要在HAProxy
3 D# K4 a) m3 _( h                                                                            上 配置此选项, 这样 HAProxy会把客户端的IP信息发送给服务器,在HTTP( o# _5 f8 L6 b1 z7 V
                                                                            请求中添加"X-Forwarded-For"字段。 启用  X-Forwarded-For,在requests
* X+ h. y" s* Y* U9 e5 m: N                                                                            头部插入客户端IP发送给后端的server,使后端server获取到客户端的真实IP。
- V% @& t! X# [: Q$ l6 K    option                  redispatch                      # 当使用了cookie时,haproxy将会将其请求的后端服务器的serverID插入到" j0 f$ N! }8 X2 N" N4 y1 v
                                                                            cookie中,以保证会话的SESSION持久性;而此时,如果后端的服务器宕掉
+ Y  Q4 w) g. o' n: w! M9 ^7 Q                                                                            了, 但是客户端的cookie是不会刷新的,如果设置此参数,将会将客户的请1 \% J4 g* i, ~" j% R: [5 d
                                                                            求强制定向到另外一个后端server上,以保证服务的正常。2 m9 N' n5 o' l1 ^3 x+ [
    retries                 3                             # 定义连接后端服务器的失败重连次数,连接失败次数超过此值后将会将对应后端
1 o+ T7 _/ ?' L1 B; x                                                                  服务器标记为不可用1 R# V1 J5 Z, [7 m) L
    timeout http-request    10s             #http请求超时时间8 D' F- ?+ A3 Y& `$ ?1 ]' Q& s
    timeout queue           1m                 #一个请求在队列里的超时时间. G) V6 f; h" j, V# K3 D
    timeout connect         10s                #连接超时1 Y: K6 K- H% i% z
    timeout client          1m                   #客户端超时9 B- x8 @+ B2 ^
    timeout server          1m                   #服务器端超时
; @7 d- O- a( V# i5 D    timeout http-keep-alive 10s           #设置http-keep-alive的超时时间( e- B  U* t* J; S0 i8 [! K$ v# e
    timeout check           10s                 #检测超时' A! L# a$ v- C  S2 _$ V, c
    maxconn                 3000                 #每个进程可用的最大连接数5 Z  C- e5 v. E# J  g% P
frontend  main *:80                             #监听地址为80- A9 G5 {! n$ g  S- t! E5 Z
    acl url_static       path_beg       -i /static /images /javascript /stylesheets3 l) u- V. T) b. D) Y) \
    acl url_static       path_end       -i .jpg .gif .png .css .js1 j1 H8 W! u* E# ~: p: s
    use_backend static          if url_static. k1 Q- v# B. O$ z+ R( t- G
    default_backend             my_webserver     #定义一个名为my_app前端部分。此处将对于的请求转发给后端9 D6 M& B) F/ z  S8 L
backend static                                                 #使用了静态动态分离(如果url_path匹配 .jpg .gif .png .css .js静态文件则
! B- g/ `" T+ }+ E                                                                            访问此后端)
3 ?, H2 f6 m" l, g. G7 K* ]/ K) T    balance     roundrobin                               #负载均衡算法(#banlance roundrobin 轮询,balance source 保存session值,( L5 i1 H, m* w; D8 }
                                                                           支持static-rr,leastconn,first,uri等参数)
( z* R$ C. o. }    server      static 127.0.0.1:80 check             #静态文件部署在本机(也可以部署在其他机器或者squid缓存服务器)( d4 {( O  G' ~" s. j3 Y2 {2 w
backend my_webserver                                  #定义一个名为my_webserver后端部分。PS:此处my_webserver只是一个1 X- s0 K) m. u. m5 h& O% D
                                                                            自定义名字而已,但是需要与frontend里面配置项default_backend 值相一致
4 C& E2 \0 A$ f/ w$ l) |3 s/ V8 i    balance     roundrobin                               #负载均衡算法, _. b' N  J' f
    server  web01 172.31.2.33:80  check inter 2000 fall 3 weight 30              #定义的多个后端
( C% t( m' s; ^) R    server  web02 172.31.2.34:80  check inter 2000 fall 3 weight 30              #定义的多个后端+ S0 |! U) _7 f  u  X
    server  web03 172.31.2.35:80  check inter 2000 fall 3 weight 30              #定义的多个后端8 m4 e3 A3 ^" w2 j6 c

$ K+ T% L/ r8 ?4 j- i/ _
9 B/ V$ X, |$ f% P7 _0 ~- U; h) z

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2021-7-12 13:55:30 | 显示全部楼层
常用配置选项:
3 Y$ l' Y" W0 d) V: L( C" W1 Z; n: f" ^# x7 K- Q

, B8 x+ b* c3 C$ y$ W
- O' B+ W% m3 ]) D/ n5 @2 k, EOPTION 选项:( m, B% ~# m9 D3 N, j

. O# p. S1 t2 j1 Z; d6 ~* Noption httpclose :HAProxy会针对客户端的第一条请求的返回添加cookie并返回给客户端,客户端发送后续请求时会发送
. L9 C3 B) F8 Q' ?' R. }( t
+ P% t# B" C/ U+ r+ R' {# g                             此cookie到HAProxy,HAProxy会针对此cookie分发到上次处理此请求的服务器上,如果服务器不能忽略5 h% g, U* S- B4 m! z6 O6 r

/ A" [  r( A0 {                             此cookie值会影响处理结果。如果避免这种情况配置此选项,防止产生多余的cookie信息。5 l+ `2 ^( s: W; d8 y# k) |
& G3 E) V! w9 f1 e
option forwardfor :如果服务器上的应用程序想记录发起请求的客户端的IP地址,需要在HAProxy上配置此选项,这样6 n( L- t/ ^3 ]- x

, v/ u- C/ l( ^1 }+ G4 C                               HAProxy会把客户端的IP信息发送给服务器,在HTTP请求中添加"X-Forwarded-For"字段。; k6 X1 g: h1 _) B* T
+ e! v( o' P+ z( t6 Y
option originalto :如果服务器上的应用程序想记录发起请求的原目的IP地址,需要在HAProxy上配置此选项,这样HAProxy+ O$ o  f% X, W
1 I% k( t# M. m$ ]% g# l
                              会添加"X-Original-To"字段。
8 m1 L% J$ c8 T, z8 r
* l6 V# j2 r, p' K1 J/ g9 Koption dontlognull :保证HAProxy不记录上级负载均衡发送过来的用于检测状态没有数据的心跳包。
+ A9 t8 w# r/ w7 r( k
8 ]9 ^0 `1 o) w. B1 O ( X4 S; _5 h- T( ]4 `2 B5 n

$ d8 q" Q* N. `8 v7 g6 @, wBALANCE 选项:
# }7 `' G$ Q* S, P+ L( C8 C
% a9 J" x3 B/ {  `/ K, \+ v6 tbalance source :如果想让HAProxy按照客户端的IP地址进行负载均衡策略,即同一IP地址的所有请求都发送到同一服务
& \' _4 z7 I* B0 C5 ~! s% @: z8 o: c5 S& o% L8 H$ P
                             器时,需要配置此选项。& {" J( J' R5 L: ?3 N
/ e- l0 e% [. h( D1 G; b
balance roundrobin :HAProxy把请求轮流的转发到每一个服务器上,依据每台服务器的权重,此权重会动态调整。最常
: T# U% S$ _/ {: e6 b, b$ K! j! I" i5 c4 q
                                   见的默认配置。
+ X% @  k: x- g5 g, A9 q' q& k& X- [2 B. E, b

4 R& ]" g( p: I7 `6 s  x  n
* o2 a' u1 E' OCOOKIE 选项:
' d* Y+ K" v" v5 C& @! \8 ~! g  W
$ z  F+ q/ ~+ @$ xcookie JSESSIONID prefix :如果客户端只支持一个cookie,并且服务器上的应用程序已经对返回设置了cookie,! L1 D% n+ t5 L! s) }
1 n3 u% N- k" _
                                               HAProxy设置此选项可以改写应用程序设置的cookie信息,把服务器的信息添加到原cookie中去。
3 A/ E* D* s: r- p/ h8 }3 @& O5 `1 t( S
$ L8 P: w' j: A+ i" l- tcookie SERVERID indirect :HAProxy会删除添加的cookie信息,避免此cookie信息发送到服务器。
& U; d3 R2 B) a. k6 ]
- ]+ x0 }5 V$ N' Q, c" ecookie SERVERID rewrite :
& l" V' k* o5 _% N+ i& D8 i5 J
- t5 ~8 r  z/ ~% `+ i/ Qcookie SERVERID insert :" y9 B6 y' {  }4 [3 B
+ M: s( N- y4 |$ |
cookie SERVERID insert nocache :) C# L  u4 a- N5 P0 i, u9 P! Q  z- N
- f' K2 X( ~$ Y5 h1 p! ?/ m  q
cookie SERVERID insert postonly :! M% n0 I  t0 a6 t& ^

) `/ [: ?$ C: Y; g6 H: D
7 x$ t0 J: _& N! Q6 x4 E4 {: [$ ]; \$ g& }' H: S: P
option httpclose5 d9 }4 d0 Y. Z, z; e, q' g8 r
no option httpclose3 a7 `. e% b  J2 Q. y+ h
  Enable or disable passive HTTP connection closing   启用或禁止消极的HTTP连接关闭
* k1 Y' e5 B9 l- X4 X8 P  May be used in sections :   defaults | frontend | listen | backend
/ B, f3 e) ?: d5 Q                                 yes   |    yes   |   yes  |   yes, W0 Z% y' |% W/ h! |/ q* k
  Arguments : none7 M0 Q4 \# I% k0 f
  + J1 g' c. }0 g# Z9 c
  默认的,客户端与服务端的通讯,HAProxy只做分析、日志和分析每个连接的第一个request。如果设置了 "option4 m" f& E. x* T; D, j/ z, @
  httpclose" , 则会检查双向的http头是否有"Connection: close",如果没有则自动添加,使每个客户端或服务端在每次传输后,都会主动关闭TCP连接,使HTTP传输处于HTTP close模式下。任何 "Connection" 头如果不是"close",都会被移除。
. N: e2 d3 _* w3 R: D; `" y" I9 l8 I1 P
  很少会有服务器不正确的忽略掉头,即使收到"Connection: close"也不关闭连接,否则就是不兼容HTTP 1.0浏览器标准。 如果发生这种情况,可以使用"option forceclose",在服务端响应后主动关闭请求连接。选项 "forceclose"还可以及早释放服务连接,而不必等到客户端的应答确认。
+ t! @- B7 S2 Y- d
+ u! ]7 I: s0 B  K& V  这个选项可以设置在frontend或backend上,只要其上可以建立连接。如果同时设置了"option forceclose",那么它比"httpclose"优先。如果同时设置了 "option http-server-close",则会实现"option forceclose"的效果。
" \9 T% r2 _6 u1 x$ `1 |" a9 P! h" {6 T7 r! D& A
option forceclose
/ q* `9 {8 w& Nno option forceclose
+ \6 C" P* B6 W, O% W, ~, y7 W, @( _
7 Q* B; G) W0 p9 V  Enable or disable active connection closing after response is transferred.     启用或禁止response后的主动关闭连接
  V, ~4 A+ M# F% h$ b
. t, c7 K- L- p) |9 Z! O  May be used in sections :   defaults | frontend | listen | backend
7 `, _8 _, Y+ `% ~  R/ p                                 yes   |    yes   |   yes  |   yes+ [, p# O& X1 K/ r+ j- T" \/ x
1 V; v( F  I5 ^4 G+ X
  Arguments : none7 V' O; y1 ?) g# n4 W7 p* P% w2 F
        有的HTTP服务器收到"option httpclose"设置的"Connection: close",也不会关闭连接,如果客户端也不关闭,连接会 一直打开,直到超时。这会造成服务器上同一时段内的大量连接,日志中也会显示较高的全局会话时间。
/ f6 u# r4 K% i4 N
& l+ ~2 ?$ K' a" {6 K6 w        此时,可以使用 "option forceclose",当完成响应时,立即关闭对外的服务通道。该选项隐式打开httpclose选项。需要注意,该选项允许解析完整的request 和 response,所以可以很快关闭至服务器的连接,比httpclose更早释放一些资源。
: {3 R  b2 z4 Q+ k; G' I, L        如果同时启用了"option http-pretend-keepalive",虽然会禁止发送 "Connection: close"头,但是依然会在整个response被接收后,关闭连接。
# R) [4 V% J8 `. e& E: [1 {5 b9 x' v: f$ k+ K4 ^  n$ v
option http-server-close
" _+ n$ D/ d5 g* B' p+ {no option http-server-close$ x" V% e+ j3 {9 u& z1 \2 ?
  Enable or disable HTTP connection closing on the server side  启用或禁止关闭服务端的HTTP连接
8 \& ?* x. ]+ q+ Q# y6 \# D8 q. l  May be used in sections :   defaults | frontend | listen | backend+ ~% `: h  K' j, j( ~
                                 yes   |    yes   |   yes  |   yes4 @; `; B" }+ @1 a
  Arguments : none
6 \, x* T5 C; F/ r" T# v# K9 T) c    默认的,客户端与服务端通讯,haproxy 只是分析、记日志,并处理每个连接的第一个请求。该选项设置server端为HTTP 连接关闭模式,并支持客户端为HTTP keep-alive的pipelining模式。提供了最低的客户端延迟和最快的服务端会话重用,以节省服务资源,类似"option forceclose"。还允许无keepalive能力的服务端在keep-alive模式下为客户端提供服务,但是需要符合 RFC2616。需要注意的是,有些服务器遇到"Connection: close" 时并不总是执行关闭,那么keep-alive 则无法使用,解决方法是启用 "option http-pretend-keepalive".
  S5 }+ V1 s# |( [. e
9 P. i) T7 ^; e0 @. O3 v     目前,日志无法指明请求是否来自同一会话;日志中的接收日期为前一个请求的结束;请求时间为新请求的等待时间;keep-alive request time 存活请求时间为超时时间,绑定 "timeout http-keep-alive" 或 "timeout http-request"的设置。/ h5 E' ]9 y% |# @$ J' o! K7 y
     这个操作可以设置在frontend或backend上,只要其上可以建立连接。需要注意的是,这个选项可以与 "option httpclose"结合, 但 "option httpclose"优先级更高,结合后基本实现了forceclose的效果。/ R' ]% N' |% c( i' I

" r+ Q8 `9 J+ M6 M/ G1 N" Xoption http-pretend-keepalive (http-假装-长连接)
  t6 d5 o: b/ R" G- ino option http-pretend-keepalive2 p5 Q) M; G% }$ t) e
  Define whether haproxy will announce keepalive to the server or not  定义 haproxy 与服务器是否是 keepalive 的。6 ]' R& {2 l, U* L
  May be used in sections :   defaults | frontend | listen | backend
: w1 ?( ]6 q1 ?" i, c1 M+ H                                 yes   |    yes   |   yes  |   yes/ A* r  h. c+ b0 e% U4 V$ [
  Arguments : none0 L  m. H+ s( j* _' i/ f2 _$ n$ |+ ~! Y
    当声明了 "option http-server-close" 或 "option forceclose", haproxy会在给server的request头中添加 "Connection: close" 。然而有些服务器看到这个头,会返回未知长度的response,并自动避免chunked encoding,其实这是不对的。它会阻止haproxy保持客户端长连接,还会使客户端或缓存接收了未完成的响应,却认为响应结束了。
1 L2 f) I" t( }) H+ w    设置 "option http-pretend-keepalive", haproxy会在服务器端保持长连接,服务端则不会出现前面的问题。当 haproxy 获取了完整的response, 才会以类似forceclose的方式关闭服务端。这样客户端得到一个普通的响应,连接也在服务端被正常关闭。$ V8 a/ w. T; i* p$ Q; j7 H4 [  C- f# j
    建议不将其设为默认值,因为大部分服务器会在发送完最后一个包之后更高效的关闭连接,并释放缓存,而且网络上的数据包也会略微降低整体的峰值性能。但是启用该选项,haproxy会略微少做一些工作。所以如果haproxy在整个架构中是个瓶颈,可以启用该操作,以节省CPU。
2 m$ ~) p9 w. V3 [: t; e2 Z0 N6 a4 U6 d) p$ W" `$ s& O/ a' S! O
     这个选项可以设置在frontend或backend上,只要其上可以建立连接。这个选项可以与 "option httpclose"结合, 使服务端keepalive,客户端close,但并不建议这样做。
5 C8 X/ |- l: X7 y* E6 A% |6 ?# g2 {4 x7 k
( i  ~6 a" x, ?

( l  b8 i# ^) b, O0 ^" t0 p/ Abalance <algorithm> [ <arguments> ]( k3 z7 P2 h3 C/ c; Z$ A
balance url_param <param> [check_post [<max_wait>]]
# ?8 V7 D, f% z  定义选择后端服务的负载均衡算法+ G3 S; b. ^; x; _6 Q) `* J3 ^3 ^
  May be used in sections :   defaults | frontend | listen | backend# C1 T6 {+ D; y3 a4 }
                                               yes   |    no    |   yes  |   yes
' Q8 g8 C8 M* }; L$ E# h3 g  Arguments :) t$ C$ ]+ d) T
    <algorithm> 是负载均衡时选择服务器的算法,没有持续信息时可用,或连接重定向到另一个服务器。<algorithm> 可以是以下几种:
% o2 J: f( _( U( a+ `) S      roundrobin  每个服务器根据权重轮流使用,如果服务器的处理时间平均分布,这是最流畅和公平的算法。算法是动态的,对于实例启动慢的服务器的权重会在运行中调整。每个backend的活动服务器在设计上限制为4128个。在一些大的群里面, 当服务器很短的宕机后恢复回来,有时会有几百个请求被重新整合到群当中,并开始接收处理。尽管很少发生,但是很正常。这也说明了有机会监视它们,所以不必担心。
( V4 G& Y! ]( _$ u# ?8 H1 M! `& t5 j  U& h. V* T
      static-rr  每个服务器根据权重轮流使用,类似roundrobin,但它是静态的,意味着运行时修改权重是无效的。另一方面,它对服务器的数量没有设计上的限制,服务器启动后便会立即进到群中,整个分发方案会重新计算。这会略微降低CPU的运行(约1%)。9 ]6 R% i8 k! s

$ P8 H) j( V+ c" Y& q* ^, Y6 l      leastconn  连接数最低的服务器优先接收连接。Round-robin用于负载相同的服务器,使每台服务器都被使用。leastconn建议用于长会话服务,例如LDAP, SQL, TSE等,而不是很适合短会话协议,如HTTP。算法是动态的,对于实例启动慢的服务器的权重会在运行中调整。
; ^* G% h1 ?: A6 H. f( j
) Q5 Z% N6 }5 l; w7 P' S  ^      source    对源IP地址进行哈希,用可用服务器的权重总数除以哈希值,根据结果进行分配。只要服务器正常,同一个客户端IP地址总是访问同一台服务器。如果哈希的结果随可用服务器数量而变化,那么有的客户端会定向到不同的服务器。该算法一般用于不能插入cookie的TCP模式。它还可以用于广域网上,为拒绝使用会话cookie的客户端提供最有效的粘连。该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是算法会根据"hash-type"的变化做调整。" w9 @# q0 O% h; v: d

7 |0 r! \, k9 t      uri        对URI左端(问号之前)进行哈希,用可用服务器的权重总数除以哈希值,根据结果进行分配。只要服务器正常,同一个URI地址总是访问同一台服务器。一般用于代理缓存和反病毒代理,以最大限度的提高缓存的命中率。该算法只能用于HTTP后端。该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是算法会根据"hash-type"的变化做调整。
8 A+ t- I' A# [% X3 S                  算法支持两个可选参数"len" 和 "depth", 都是后跟正整数。“len”参数指定算法只处理URI从头开始的字符数,据此计算哈希。因为大多URI以"/"开头,所以"len"最好不要设为1。"depth" 参数指定URI中最大的路径深度,据此计算哈希。请求中的每个斜线为一级。如果同时声明了这两个参数,则截取URI时必须同时满足。
- P: z. v) w7 P& O
1 X: K( r" Y3 \" ?% d. v      url_param  在HTTP GET请求的查询串中查找<param>中指定的URL参数。, i, o" e5 n2 P
                 若使用了修饰符"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被用了,则只能检查第一个块。如果参数值被块边界分隔开,则只能随机均衡负载了。
* Q5 d8 p" e) P7 V9 m3 p! p2 A                  如果参数后面跟着 ('=') 和一个值,则可以根据这个值进行哈希,用可用服务器的权重总数除以哈希值,根据结果进行分配。5 z+ _4 ~: z3 u( T1 T0 c/ u7 s* j  P
                  还可用于跟踪请求中的用户身份,只要服务器正常,同一个用户ID的请求总是发给同一台服务器。如果没有参数或参数没有值,则使用轮询算法。该算法只用于HTTP后端。该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是算法会根据"hash-type"的变化做调整。
! y( Y" ?. H: }/ f* j9 |4 q8 h4 l: D
      hdr(name)  在每个HTTP请求中查找HTTP头<name>。与ACL函数'hdr()'一样。括号括起来的头名字不区分大小写。如果缺少头或头没有任何值,则使用roundrobin算法代替。                  
" [% W4 z/ I7 f0 g$ B  L) a                       启用参数'use_domain_only',哈希算法将只用于一些类似'Host'的特定头的主域部分。例如主机值"haproxy.1wt.eu",则只考虑 "1wt"。该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是算法会根据"hash-type"的变化做调整。! Z5 h3 d6 T0 W: T, R
* N( i4 X3 A& E" N; E
      rdp-cookie: I" {0 W: n9 ?0 ?! e
      rdp-cookie(name)
) B/ R+ U  g  h                  为每个进来的TCP请求查询并哈希RDP cookie <name> (或“mstshash”如果省略) 。与ACL函数 'req_rdp_cookie()'一样,name不区分大小写。该机制用于退化的持久模式,可以使同一个用户(或同一个会话ID)总是发送给同一台服务器。如果没有cookie, 则使用roundrobin算法代替。
, T, ?; Q: _- h& M, ^2 n                  必须注意该声明要生效,前端必须确保在请求缓冲中已经有RDP cookie,所以必须使用规则tcp-request content accept' 和ACL 'req_rdp_cookie_cnt'相结合。
2 z- x! [0 f- ]' `) B% x                  该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是算法会根据"hash-type"的变化做调整。
# f7 |, l, r4 C7 W$ w
, I$ x2 i. k3 o2 L9 R' ?2 o    <arguments> 是用于一些算法的可选参数列表,目前只有"url_param" 和 "uri" 用到,例如:4 s/ s" @" c6 w& h: j+ l& E
                balance uri [len <len>] [depth <depth>]
0 O3 Z' n: H; r/ v4 w# o6 B/ h                balance url_param <param> [check_post [<max_wait>]]# d- J. [5 k. d* y
# o2 p% ~7 z, }4 o9 [
  如果没有其他算法、模式或选项的设置,后端的负载均衡算法默认为roundrobin。每个后端只能设置一种。( j4 {" u2 v8 G% h# b
  Examples :
* s% U, h" [  a7 O, r        balance roundrobin$ Z" V$ R! m3 m$ P7 V0 ]. j
        balance url_param userid2 x1 H) t7 C2 V" I% Z" X& X+ \* e/ n
        balance url_param session_id check_post 64" P  Z: v+ s: E( ]' `1 ]* i
        balance hdr(User-Agent)0 m8 `1 v# r4 B& L6 x+ |" V
        balance hdr(host)8 N* W1 j9 K5 ?. t- U! O
        balance hdr(Host) use_domain_only
! s8 S) W# R6 B) N
- ]5 y& H: U2 B- s9 B  注意:  以下的警告和限制是使用“check_post“扩展和”url_param”所必须考虑 :
+ w: K3 K; D; Y# c    - 所有POST请求都要考虑,因为在包含二进制数据的体或实体中,没有办法决定是否会找到参数。因此需要另一种方法,限制POST请求的体中不含有URL参数 (见 acl reqideny http_end)
/ B2 R' h  L" A3 ?- J
6 C* n; M7 E3 t- T! P$ E    - 大于请求缓冲大小的 <max_wait> 值是没用的。在build时设置缓冲大小,默认16KB。
( J3 A2 i  Y5 F, e3 w7 R    - 不支持Content-Encoding, 参数搜索会失败;负载均衡会改用 Round Robin。3 S) y/ V1 e2 K8 S4 C: j, B! m
    - 预计: 不支持100-continue,负载均衡会改用 Round Robin。
1 a- z3 X" P2 P" v9 R    - Transfer-Encoding (RFC2616 3.6.1) 只在第一个块中支持。如果在第一个块中的参数值不完整,选择的服务器就没有定义。(实际上取决于在第一个块中定义的有多小)
" ?; f! B4 d( T( _: c    - 该特性不支持生成100, 411 或 501 响应。7 y, [' ?- t$ A7 n4 t/ W9 c
    -  有的情况下,需要"check_post"只是要查看整个消息体的内容。检查一般会停在任意数量的空格(LWS: linear( t2 W# O4 I, ^  \3 {
      white space)或控制符上,表示这可能是一个URL参数列表。这可能不是一个关于SGML的类型消息体。
3 a$ M' Z1 K6 J6 R' O% l
: \. `6 X5 Q) \5 ?! T  See also : "dispatch", "cookie", "appsession", "transparent", "hash-type" and "http_proxy".
, r+ p( T9 F) v/ |+ F% Z8 H  D
0 e' l* g- Z8 N( ~+ j. l; s
4 q4 V/ q2 m( X/ [* B4 T5 T3 `6 H6 ]  r" t9 Q
hash-type <method>. }. v1 h; E: d) c; n
  将哈希映射到服务器的方法。Specify a method to use for mapping hashes to servers
9 `1 A2 s3 g  y- T9 ^  May be used in sections :   defaults | frontend | listen | backend
, b4 i5 p5 Q$ `/ }' z                                               yes   |    no    |   yes  |   yes$ E6 E# C. I7 P$ Z; G6 F9 Q
  Arguments :
& D# }+ z: p# X9 j9 P    map-based  哈希表是包含所有在线服务器的静态数组。哈希结果很平滑,并考虑了权重,但是会忽略服务器启动时的权重变化,也就是说不能慢启动。另外,服务器是根据数组中的位置所选择的,所以服务器数量变化时,大部分映射也会变化。当一台服务器启动或关闭,或服务器加入到群中,大部分连接会再分配给不同的服务器,这对有缓存的实例会比较麻烦。
+ |$ Y! l2 |: ?3 @. x$ q* W4 P8 V- t2 w& U8 X/ M" K5 z: \
    consistent  哈希表是由每个服务器构成的树,会在树上查找哈希Key,并选择最近的服务器。这种哈希是动态的,支持服务器启动时修改权重,所以可以慢启动。它有一个好处是当服务器启动或关闭时,只有其本身的关系被移除,当服务器加入群时,只有一小部分的映射会被重新分配,所以是一个比较理想的支持缓存的算法。但是根据其原理,算法不会非常平滑,有时候必须调整服务器的权重或ID来获得更平衡的分布。要保持多次负载均衡时的相同分布,服务器ID是绝对不能变的。(roloand:haproxy根据服务器的ID初始化其哈希值)
" m0 y  o, g; x5 M   默认值是"map-based",建议大部分情况下使用。
: y+ b& |6 s( ^0 m% a) P
, I6 r, v- @% E" M, @  See also : "balance", "server"" p, L& r! \+ r

' d# c/ F7 Z" @$ F- F$ F0 k+ m
7 n( P0 @5 E8 B7 n- `. mdispatch <address>:<port>
. |8 q. [% h& \6 e0 f! o7 s9 z" Z9 F  设置一个默认的服务器地址
& R. }+ s; a4 [2 W+ _  May be used in sections :   defaults | frontend | listen | backend2 a- @$ t+ O7 l3 s0 C& V" X# U
                                               no    |    no    |   yes  |   yes
6 M" d2 G' t+ L' l/ i1 X  Arguments : none
9 J7 k, _; v, \; X/ b$ b    <address> 默认服务器的IPv4地址,也可以是主机名称,名称只在启动时解析为IP地址。
0 b: r, E) {1 C    <ports>  端口号,所有连接都会发送给这个端口,但是不允许像其他服务器一样使用端口偏移(port offsets)。
" y- N; a& e7 }, D- H8 ?' V
/ ^- t8 ~. i$ p9 c   "dispatch"关键字指定了一个默认的服务器,用于无可用服务器时的连接的处理。过去常用于前传非持久连接给后备负载均衡器,由于定义简单,还用于简单的TCP中继(TCP relays)。 建议对于明确的连接处理,应使用"server"直接声明。
' m$ F3 c: ~! H  y. i6 ~: T% |4 d. P$ S2 _7 \# a' a4 s5 y( {$ j
====================2 k" e0 N+ M/ K: V4 o
# ]% S% m: H% y7 W. u
一:Global parameters  C  m& ?. t7 _( N
* Process management and security  E6 n/ Q# V3 T7 L2 U2 M( a8 |
- chroot 改变当前工作目录
, {  Z3 [* ]7 r: W0 f. \6 x- daemon 运行方式为后台工作0 t+ R/ x. E6 I' ~
- user - group 工作用户和组
- i5 E7 C1 }' s6 W2 b' @, w-log <address> <facility>日志输出设备
8 j& Q: G' r" s% N) z" z- nbproc 创建工作的进程数目' O8 l. p. E. F: B! c6 C! E7 M* ?
-pidfile pid文件位置
% S  e7 i& d# H' v- ulimit-n 设置每个进程的可用的最大文件描述符
5 R* _. Q* i, u+ t: d3 G- stats 创建监控所用的套接字目录
8 Z" ?' x; L* H8 j- node 创建另外一个节点名字共用一个IP地址,用来识别哪个节点在处理流量, J# e4 D8 R+ a  z5 q9 q
- description 描述实例的名称
1 q9 U" y2 S; x$ N8 O7 R6 omaxconn <number> 每个进程可用的最大连接数
4 `) t+ ~9 Z3 c, ], D+ zmaxpipes <number>  每个进程可用的最大管道数0 l2 p9 r# ^* U( j/ U# _& k- R# y
nokqueue  nopoll  nosepoll nosplice  禁用这些功能6 n2 A. C1 W0 N7 ^! t
spread-checks <0..50, in percent>  health check 的时间间隔2 a' p" Z% p4 X: S$ T- e1 V
tune.bufsize <number>
/ ~8 T) X9 H$ I. }+ u* s$ b# Etune.maxaccept <number> % o8 M! P- @3 n3 F) `$ Y( T
tune.maxpollevents <number>
2 S; Q2 g; g& V8 L7 ~6 k& o$ Ztune.maxrewrite <number>
2 l! C4 K: Q6 q8 otune.rcvbuf.client <number>
3 m( M1 E) A/ h0 I, @  @tune.rcvbuf.server <number>
/ ?% v1 L  K/ ]4 _" ~tune.sndbuf.client <number> . J7 P! _; T  B$ _1 s3 g$ N. F
tune.sndbuf.server <number>
1 ]5 M: E: D1 e以上凭字面理解吧6 k/ H: M8 Q' W7 \# D
debug  调试模式,输出启动信息到标准输出
( Z  Y1 l" B1 t7 e2 _* a& o: J- jquiet   安装模式,启动时无输出, e% y- N/ B; D* J

$ F$ l& P# Z4 K* p( v: v( \! I二:defaults 块
* P+ E6 m4 F0 R5 v% q: }6 C作用于其后紧跟的listen块,直至下一个defaults 块,下一个default 将替换上一个块作用于以后的listen4 e. O! b: p6 Q; Q4 }" H, ?
frontend 块,接受请求的端口组
: d* `) z3 S! @; D' f, u& M6 k8 Fbackend块,后端处理的server 组2 h. Z+ D6 }5 ]+ D  _5 c' `9 t2 K
listen块,frontend和backend 块的结合
; C1 y1 J. q! M  E0 u& n# q0 r1 W1 r0 d, g  O7 r) N) P0 `
三:常用配置命令
5 E# b* t* r* u9 e" v, N9 ^- o6 {5 d0 D3 [1 s- Q
balance <algorithm> [ <arguments> ]
) S% t3 ~' f1 l! F: ibalance url_param <param> [check_post [<max_wait>]]   负载均衡模块设置
6 g' E' k# J4 z$ s! W3 n' g9 h, F* y9 M2 d# @9 L* q& l# \  ~' e
Examples :0 V4 n0 V/ Y& r( d  \
balance roundrobin
8 K+ ~8 G) H6 u% K3 U! I6 Ubalance url_param userid  
1 ?: Y. u7 v+ }( a6 s+ E2 Xbalance url_param session_id check_post 64
0 {) c5 |8 ~/ \4 ubalance hdr(User-Agent) & o9 }. \7 G' Z0 }
balance hdr(host) + s9 u$ |3 C& ^& h
balance hdr(Host) use_domain_only
5 l' K! b7 i: z/ {. Z9 M; J+ y: X  k0 a, S, A
block { if | unless } <condition>  在7层阻止访问
  w. T$ j0 E$ H! L. O" DExample: % f& e( _) d9 {, f
acl invalid_src src 0.0.0.0/7 224.0.0.0/3  acl定义和squid 很像) R* @: E( l2 x2 k) F
acl invalid_src src_port 0:1023 0 I" \4 P$ e! D* l" Z: E
acl local_dst hdr(host) -i localhost ; H  A4 s6 C% m2 g# e
block if invalid_src || local_dst
# J( T" ~. K4 Z7 M/ f9 H% X, Q9 m; b0 w
capture cookie <name> len <length>  在请求和回应包中捕捉记录指定长度的cookie,name 为cookie的开头几个字母
2 x) R: d0 k2 \# r: i2 w( }
4 B' {) H( t' hExample:
5 q- ?+ t+ ^, u* \; l2 S/ S/ m. zcapture cookie ASPSESSION len 32
" J/ e5 A. g7 q1 w1 w
" m+ L6 ?" b& t5 K7 B( H+ Dcapture request header <name> len <length> 6 v# n& e8 q4 Y1 J
capture response header <name> len <length> 同上: E. C- S6 t& g0 a

! u3 n: d& `/ g/ r/ H. v* Sclitimeout <timeout> (deprecated) 8 I" T" b2 M3 [, E# _2 \
contimeout <timeout> (deprecated)  客户端超时时间,不赞成设置
+ I+ ^! m# p4 P* X2 V
" V3 S3 v+ V9 H9 h. J- v3 ^cookie <name> [ rewrite | insert | prefix ] [ indirect ] [ nocache ] [ postonly ] [ domain <domain> ]*   允许持续的基于cookie 的后端连接
. ]) i5 d3 n! Z8 e: @& N/ z9 `" K/ I; C( \; S- D) U2 V
default_backend <backend> 默认应用的后端9 r, z4 C& V# J' S) G* n' N
8 q5 E7 `& v4 g4 c; {, B& n% s
Example : * V5 t6 v7 z7 O* W
use_backend dynamic if url_dyn 7 f9 }3 b: K+ h+ L" O* }4 H
use_backend static if url_css url_img extension_img 3 Q3 z9 ]1 x5 G; E
default_backend dynamic    当没有匹配时就用dynamic
9 T' a2 M5 O! `& F, x# r! }- a' @5 s+ E
errorfile <code> <file> 定义出现错误的代码的返回页# F" j: d7 \2 F2 a
Example :
9 H2 l& N/ L) ^7 H4 zerrorfile 400 /etc/haproxy/errorfiles/400badreq.http
3 k) ]) }' G6 I6 n' eerrorfile 403 /etc/haproxy/errorfiles/403forbid.http 8 p' o: |, M+ W5 ]; ]! H! i% L1 x" k( L
errorfile 503 /etc/haproxy/errorfiles/503sorry.http
0 i7 o3 M# H# g: j3 u& ]6 Z2 D& E$ N3 {1 D0 d* t+ G3 I+ \/ F0 S6 e
# Q2 t$ L2 d; c6 |3 @
errorloc <code> <url> errorloc302 <code> <url>   出错重定向到指定url) B# v% L* E& o8 c) `
force-persist { if | unless } <condition>  在特定条件下,强制继续连接down 掉的服务器后端$ z' J3 V' `0 A: [+ I$ q. X8 f
fullconn <conns>  定义后端组的最大连接数
! z% f% U, S, K7 qgrace <time>  haproxy停止后,再持续多长时间用于处理连接
# N1 T. @! B7 w% S" Ihttp-check disable-on-404  如果后端检测返回404,将不再把后端计入负载均衡' s& [' [+ ~; y" P0 M6 m5 O
http-check send-state 允许haproxy 发送 X-Haproxy-Server-State
+ @4 j! z+ U, _' `+ K9 b+ m3 S: lhttp-request { allow | deny | http-auth [realm <realm>] } [ { if | unless } <condition> ]   七层访问控制+ ?( i8 ~7 m; h/ p1 E# K4 k  O1 a  s
Example:' }9 v  f/ Y( C6 S# D
acl nagios src 192.168.129.37 l: o' }0 g0 e: P6 J& G" [
acl local_net src 192.168.0.0/162 v: a- }" e$ _: a$ w% d8 ^
acl auth_ok http_auth(L1)% v7 I; v( t. A' T
* o1 T- i; `( P% @
http-request allow if nagios
( _! X( q9 s/ r0 ~8 M. ehttp-request allow if local_net auth_ok; `: l) x6 q' |4 P8 m
http-request auth realm Gimme if local_net auth_ok6 d5 {% Z% q7 ~5 ~1 c+ g; Z
http-request deny- t/ M" d# F% a" @: [, P

# {# {% K( R/ R7 D" S0 SExample:# s" s9 b( c, x7 k/ a
acl auth_ok http_auth_group(L1) G1
) q0 c1 f+ Z8 A. p. K
3 X! h% f: y- P) Jhttp-request auth unless auth_ok
6 v4 g$ [3 m) N9 i/ o" K4 Y; S6 f+ ?8 c1 u' }4 v2 k6 r" ], a+ k" e7 Q
mode { tcp|http|health }   设定启动的实例的协议类型
2 c4 ]( b0 C) n2 g+ Z) h4 i4 Dmonitor fail { if | unless } <condition>  监控失败条件设置8 g/ `! k: c1 Q8 ]9 U
" v' g7 M/ j, C5 b$ x
option abortonclose 丢弃由于客户端等待时间过长而关闭连接但仍在haproxy等待队列中的请求
  f3 Z3 A7 o7 z" B6 noption accept-invalid-http-request  接受无效的http请求,建议关闭(开启可能有安全隐患)
/ S( F; n$ P( w' s+ {# U# t5 Yoption accept-invalid-http-response 接受无效的response ,建议关闭
6 h: L" u# i9 O' i7 H! \option allbackups  应该是后备服务器,如果正常的后端无法使用,就使用这些后备的设备,balance方式还是用原来的,没有优先的选择,常用来提供错误的页面
* H0 M+ \( N) F% T, h! ioption checkcache    分析后端response,阻止可缓存的cookie,它对response 进行严格检查,包括"Cache-control", "Pragma" and "Set-cookie" ,查看在客户端代理那边保存是否有风险,如果这个允许的话,符全以下条件 的response 将被允许,其它的将被阻止。7 C/ h* |4 q+ u" b
- all those without "Set-Cookie" header ;
9 x/ J! u& t* Q  R! G- all those with a return code other than 200, 203, 206, 300, 301, 410,# [# W/ X8 w3 A2 J% [
provided that the server has not set a "Cache-control: public" header ;+ a5 W) s0 X+ n* Z
- all those that come from a POST request, provided that the server has not5 z, ?, Y3 M% H1 W0 {- G! u
set a 'Cache-Control: public' header ;6 J; E! }8 ]1 r7 t
- those with a 'Pragma: no-cache' header
! F. m6 B, e; k' B6 B0 j- those with a 'Cache-control: private' header/ q9 C, o  E* A) J; T
- those with a 'Cache-control: no-store' header4 l0 D$ r; y) z  D* G! {
- those with a 'Cache-control: max-age=0' header
' @; @& \( d' g) Q) n- those with a 'Cache-control: s-maxage=0' header
8 T% p- ?+ i/ X, _9 ]- those with a 'Cache-control: no-cache' header+ Q, j4 g7 K* x2 _. [: Q) V+ Q
- those with a 'Cache-control: no-cache="set-cookie"' header
6 C+ ~! S; l* A; B  _" e, C: q- those with a 'Cache-control: no-cache="set-cookie,' header+ C# Q% d% [  I* Y: J
(allowing other fields after set-cookie)
( o0 l1 M- K' o0 ~8 [" X$ ?+ r' p4 x
option clitcpka   是否允许客户端发送tcp keepalive 包,这个和http 的keepalive 没有关系6 }5 i, L4 d/ a6 G
option contstats   允许连续的流量统计更新0 J* C1 u" M3 s
option dontlog-normal   开启正常连接的日志" A1 \- T+ O) u3 w
option dontlognull   记录空连接$ Y6 Z  m! T8 y% Y8 s1 L+ Q' W7 f" I2 y
option forceclose  允许关闭session 在后端把response 发送后
/ U3 h1 S, i8 Y- b- qoption forwardfor [ except <network> ] [ header <name> ]        允许在request 中加入X-Forwarded-For header 发往server
( I$ ]* S" j" \% G; o! r9 Toption http-pretend-keepalive    定义是否haproxy要宣布同server keepalive
. c4 C& V- _& j$ j2 Doption http-server-close   是否开启在server 端 connection closing- q$ I" _" ^, n$ P! _( r
option http-use-proxy-header    用non-standard Proxy-Connection 替换 connection5 m$ [9 v( T5 H1 m) l3 a3 b

7 ^, D) F* j7 _+ r& Y% C4 t8 \7 i
! Z! [% o; d4 Q" b( ~option httpchk <method> <uri> <version>  允许用http协议检查server 的健康( Y/ ^2 s" ~% G: x: l3 E
Examples :% M2 Q$ B$ w" ~6 J
# Relay HTTPS traffic to Apache instance and check service availability7 M5 S! C7 A, t- a" b
# using HTTP request "OPTIONS * HTTP/1.1" on port 80.
7 E- ?5 P8 |7 Z) fbackend https_relay3 V$ k- d4 Y( W  F0 ?1 v/ P' T
mode tcp
' d2 q: Q' L' t2 Y: Y8 h* S! V4 Moption httpchk OPTIONS * HTTP/1.1\r\nHost:\ www! l  ]. o& G& z
server apache1 192.168.1.1:443 check port 80" g1 T  q, ?! V* J4 `  i! y! ]

3 {% w4 V* K6 l$ e- }  u8 Woption httplog [ clf ] 定制日志格式+ U6 t9 ^. \8 m3 f$ I- p
option http_proxy  开启http 代理模式,只有最基本的代理功能& L& i7 \9 P  m5 Y
option ignore-persist { if | unless } <condition> 在某条件下拒绝持续连接,适用于对静态文件的负载均衡3 `9 d8 Y& W! G+ ?( H- q
option independant-streams  启用双向超时处理,如socket 的read 和write $ _, c) }5 O2 V! K5 y
option log-health-checks   记录健康检查日志
- |! P7 s* {6 P+ j7 }) C. ioption log-separate-errors   对非完全成功的连接改变日志记录等级
0 U- M  O3 @3 t( Y0 i' Coption logasap   大传输大文件时可以提前记录日志4 K. B9 m9 H6 }! K/ q; e
option mysql-check   mysql 健康检查" H$ w- `, |  e/ g
option nolinger  清除肮脏连接后开成的tcp 状态及占用的资源,不过并不是强列要求你用这个选项,当然如果你有thousands of FIN_WAIT1 sessions on your system ,那肯定得用了( U; _0 K( g( @! }
option originalto [ except <network> ] [ header <name> ]   允许在requests中加入X-Original-To header 发往server
; K: O% @8 V6 R( T: G. Noption persist     强制将http请求发往已经down 掉的server
' l* |6 |, G; O6 F" y; A+ g2 r. j7 Loption redispatch   是否允许重新分配在session 失败后
/ j: @" t+ C: E- i, e6 s5 u9 coption smtpchk   smtp 检查
7 y% P+ _  J! \7 e0 o$ boption socket-stats  允许对单个socket进行统计) u$ f5 q  y- e- o' D
option srvtcpka  是否允许向server 发送keepalive
. n, _8 @; s! c$ Toption tcpka 是否允许向server和client发送keepalive
* B: I% _0 `5 l4 @option tcplog  允许记录tcp 连接的状态和时间: s. I  L& P# `, o+ I, L
option transparent   允许客户端透明代理2 N, ]* e* s1 B5 x. H& L7 c2 H) }
rate-limit sessions <rate> 设置frontend 每秒处理的连接的上限,如果到达上限就停止建立新的connection% L" Q$ k4 \# M8 C. _

7 f/ V  a% Y# H% \, ?% s( Lredirect location <to> [code <code>] <option> [{if | unless} <condition>]
9 x/ {' c- I/ J7 A5 iredirect prefix   <to> [code <code>] <option> [{if | unless} <condition>] 重定向,相当于rewrite6 _- [! `6 Q7 P# |; i; ]) {
# t, k: w$ R3 n6 s4 u! p9 h
Example: move the login URL only to HTTPS.
! G6 b2 C  r! w! f) o+ I) W% D- @acl clear      dst_port  803 A9 V7 q; s) t$ U
acl secure     dst_port  8080
  u+ ?% p6 `: l( Gacl login_page url_beg   /login
" i8 A! t# U9 _3 P. ^; \' |$ nacl logout     url_beg   /logout; i8 G! d- c8 G; h1 Z
acl uid_given  url_reg   /login?userid=[^&]+
3 D* r1 |: {4 [acl cookie_set hdr_sub(cookie) SEEN=11 W; ~3 v+ |' `' E

5 A5 z, h3 s9 L1 N5 A! @6 ]redirect prefix   https://mysite.com set-cookie SEEN=1 if !cookie_set
  ~' ^6 s/ |4 l' S$ Z9 V: Qredirect prefix   https://mysite.com           if login_page !secure
! i! R. {" I. E3 e" c/ @) }" T! Zredirect prefix   http://mysite.com drop-query if login_page !uid_given
: J: ~+ @# o& o3 P+ r% ]' w8 @redirect location http://mysite.com/           if !login_page secure
3 |2 ]; _) Y7 Gredirect location / clear-cookie USERID=       if logout
4 Z2 Y  I) |: J& J5 _
1 o+ H5 f: m3 x/ Y! f+ zExample: send redirects for request for articles without a '/'.: C' }# V" ^) j- b7 d& S5 H
acl missing_slash path_reg ^/article/[^/]*$1 R* {! T" B; S+ {7 ?6 O$ J; T! L: ]* E
redirect code 301 prefix / drop-query append-slash if missing_slash
( D- r7 Q0 v: D5 k/ tredisp (deprecated): L- G. t. |2 w
redispatch (deprecated) 开启session 重新分配在connection连接失败后,不赞成启用. ~/ p: \: z& h% V1 C$ K4 H
reqadd  <string> [{if | unless} <cond>] 在http请示的末尾加上string
* ]& q( u( V  g8 [' |2 v' T8 a
9 Z" f2 |+ X# U! F% j% u2 p0 VExample : add "X-Proto: SSL" to requests coming via port 81. H) v5 ?, S) j5 z5 A( W7 ]
acl is-ssl  dst_port       812 b5 F1 h% [% M, y
reqadd      X-Proto:\ SSL  if is-ssl5 {* R) i( S4 P

$ x0 S# H8 p: Treqallow  <search> [{if | unless} <cond>]
  C  \# a  ?* Y. n" J" Dreqiallow <search> [{if | unless} <cond>] (ignore case)    request 请求访问控制/ Z$ a/ [2 b4 z0 {) f7 m
5 F* p' E. W: n- k8 l: ]# w
Example :
3 @- h0 z: R: i# allow www.* but refuse *.local
8 r. v" I  H3 w. B: `  L3 Oreqiallow ^Host:\ www\.
: q, s% R0 y0 Ereqideny  ^Host:\ .*\.local* m# z6 s* `0 q# [+ h
0 \1 x" i' G9 x4 A$ K! s6 U8 w1 u
reqdel  <search> [{if | unless} <cond>]+ @2 s8 W8 V8 S: S' R, w- o+ c7 f1 I4 k
reqidel <search> [{if | unless} <cond>]  (ignore case) 删除请求的head 中的内容
: R5 L" j( v+ z7 H' S; X7 v  _* E; X2 P; ]
Example :
4 C% S; g1 z& m; ?( Q. i# remove X-Forwarded-For header and SERVER cookie7 n/ E; f% H, B  R- h6 Q# a# X9 e$ U
reqidel ^X-Forwarded-For:.*
) f9 u/ k; ]! O! \, Preqidel ^Cookie:.*SERVER=2 D  ?2 W5 w7 B
! Z; F% k7 r+ M) S) y/ a; t
! ]. P+ R5 E* i" O1 _
reqdeny  <search> [{if | unless} <cond>]
( M' q) Z$ }+ nreqideny <search> [{if | unless} <cond>]  (ignore case) 拒绝访问
# v7 H. R8 \3 {. q$ n6 r/ b* o- d& C- f; f
reqrep  <search> <string> [{if | unless} <cond>]
- S% {- H6 Z0 Qreqirep <search> <string> [{if | unless} <cond>]   (ignore case)  request 请求替换
1 ]( u0 @4 q% {- S- u8 l& r. UExample :
' B; X5 y! i- q9 e) S# replace "/static/" with "/" at the beginning of any request path.
0 O, B8 t6 E! k% K) h( X( Oreqrep ^([^\ ]*)\ /static/(.*)     \1\ /\2
0 ?3 {: T! a' f7 c# replace "www.mydomain.com" with "www" in the host name./ @* T/ t' _9 r2 ?, B& M
reqirep ^Host:\ www.mydomain.com   Host:\ www
, V3 W7 E' j3 ~: c2 f/ J) b' D+ j: r! ]
reqtarpit  <search> [{if | unless} <cond>]; K7 [+ S3 {; u
reqitarpit <search> [{if | unless} <cond>]  (ignore case) 阻止http请求中的某些信息
1 z5 w2 K  h1 _5 I0 b6 C2 _
8 ^" Y6 Z, \7 g9 I  yExamples :
8 [( m8 |' o" v! T- ~& y+ Q4 Q) p# ignore user-agents reporting any flavour of "Mozilla" or "MSIE", but: O/ c0 k3 Z0 `: i
# block all others.( |( x! z6 V# V0 t
reqipass   ^User-Agent:\.*(Mozilla|MSIE)+ A" S7 M# ?! \3 H6 r( R& v5 O1 G) {
reqitarpit ^User-Agent:
2 F7 Z) }& B5 m7 z+ Y- a: r1 M$ V
9 X7 F" q' S- B. I0 K& u- g. p# block bad guys
+ M  u% r# R. ]" |acl badguys src 10.1.0.3 172.16.13.20/28- S/ N3 C9 C7 w) [: r( Q: m
reqitarpit . if badguys6 b6 D8 e. ^& {: o) [& B' K

  z: z0 B9 u& b1 w8 b0 ?) rretries <value> 当对server的connection失败后,重试的次数  H! L) W  ~3 N: A
rspadd <string> [{if | unless} <cond>] response 增加信息; ?/ A2 t/ F& N! W
rspdel  <search> [{if | unless} <cond>]
" i+ ?$ d4 t0 ^# ~6 Drspidel <search> [{if | unless} <cond>]  (ignore case)7 @, I9 t, }" O/ k! q) |
rspdeny  <search> [{if | unless} <cond>]3 B" t! k# b  L$ m. \, @. x4 o. K4 a
rspideny <search> [{if | unless} <cond>]  (ignore case)4 O) E6 h7 K0 B: I% d) O
rsprep  <search> <string> [{if | unless} <cond>], X9 x8 z: q3 G& Q- I5 o3 i$ l
rspirep <search> <string> [{if | unless} <cond>]  (ignore case): p$ |) {# a& j  n" ^, s
以上和request 的差不多
$ e* D1 t9 j& _2 w; |
3 C5 D; v+ A. [( }0 h7 T9 Msource <addr>[:<port>] [usesrc { <addr2>[:<port2>] | client | clientip } ] 定义从代理出去的连接的对象,用于限定地址可以访问server
6 Y: I5 n. C! q" r  u  H
# b" A. K1 `: j- z一些timeout. _9 ^+ q. \1 u$ q4 F

2 j% r4 q& L+ r2 g& D2 Zsrvtimeout <timeout> server 处理超时,不赞成设置
3 o9 L; A. F; I# O3 g& x2 Ltimeout check                             X          -         X         X' c; v6 b6 y& G! A, I( w% d* C
timeout client                            X          X         X         -9 [8 x3 r% ^8 K* R; ?; i! j& h
timeout clitimeout          (deprecated)  X          X         X         -
. f( d& l& o! y6 P+ `1 K$ ?5 L. wtimeout connect                           X          -         X         X, ]5 z# u4 G2 j4 l
timeout contimeout          (deprecated)  X          -         X         X) K" {9 {% \3 [9 d% n7 W
timeout http-keep-alive                   X          X         X         X9 f& \/ t5 I5 l; K4 H, r* t
timeout http-request                      X          X         X         X
0 j8 P6 I9 \) Y' ^+ z- ctimeout queue                             X          -         X         X8 ]2 a0 o( R& x5 j$ h. T
timeout server                            X          -         X         X2 X9 }8 y) }7 v, p$ J
timeout srvtimeout          (deprecated)  X          -         X         X
7 n; g4 W& r7 @% Etimeout tarpit                            X          X         X         X, G& o$ p: r& C( Y, S
: w: K4 r- l- l9 M* H( T/ i) p

, N2 I1 G* m3 m2 B% lstats auth <user>:<passwd> 监控统计的帐号和密码
1 |% V$ w( C3 v0 [* X6 zbackend public_www
: m) x6 c& |% d% f" V+ Yserver srv1 192.168.0.1:80
5 F7 I) O8 y; X- estats enable
. x* q1 @! ~/ g0 Ystats hide-version
; `: ~! L6 ~) e8 xstats scope   .
) W4 ]' D1 A0 [stats uri     /admin?stats
- K- K3 ~$ s4 O' a6 H5 a+ n' qstats realm   Haproxy\ Statistics
; z) G. `% S* ~: f5 l5 }5 Mstats auth    admin1:AdMiN1233 G' h! ]. @7 X, ^# G
stats auth    admin2:AdMiN321
; E% n$ U' \$ a& T' w% ^$ Z. r5 {) J1 ~5 q0 g
# internal monitoring access (unlimited): H8 @9 N# ^  y1 f$ p. m/ w5 K
backend private_monitoring
  F' R/ y% V& n! c( Cstats enable
$ S5 x9 q1 Y/ ^stats uri     /admin?stats: G) n! A$ S1 K
stats refresh 5s# S/ @7 O1 y# w6 i
% s/ r; W3 z1 B6 q' _- C% `. J! X$ U+ v
还有很多参数,以上能用到的也没有几个,只要满足当前需求就好,对于性能要求高的话,建议把不需要的功能 都关了吧.6 j+ r8 `# {$ c) W% B: \0 }
0 k0 I. u9 N; N( I1 h& c! `/ j
====================
) `/ W9 W5 R  t0 O: J; H8 ^8 W
  ^, S% g- F* O3 VHAProxy的配置示例
8 K& K4 c& t: H  {0 Z% u7 a% S) P, L4 r
HAProxy配置中分成五部分内容,当然这些组件不是必选的,可以根据需要选择部分作为配置。. Y3 l3 r- e1 |+ g
global:参数是进程级的,通常和操作系统(OS)相关。这些参数一般只设置一次,如果配置无误,就不需要再次配置进行修改4 B) [: A6 f: `3 U3 o6 D$ i5 q  L
defaults:配置默认参数的,这些参数可以被利用配置到frontend,backend,listen组件
" P- G: F7 Y, ~1 H' R& sfrontend:接收请求的前端虚拟节点,Frontend可以根据规则直接指定具体使用后端的 backend(可动态选择)。4 ?; J  n& A7 s' y
backend:后端服务集群的配置,是真实的服务器,一个Backend对应一个或者多个实体服务器。# Y$ l+ g" B$ [
listen:Frontend和Backend的组合体。
! {; W1 v! F4 B# Y: z
7 T0 O" B. a* M下面是HAProxy的一些常用的配置,这个配置是用来说明HAProxy的一些常用功能的配置,具体详细配置请查看安装目录下的doc目录下的文档文件,或者到http://cn.haproxy.org/下载中文配置说明文档& e9 A0 ^: S# E1 K  a5 K
* F& ]& f  q' l2 f. _+ j
配置具体实例,后附说明:) i9 A: n; d6 g2 a" \! i5 b
- L) E6 K7 c) E3 |, ]2 i
global
) \- D1 j, I. m! C8 \$ G# ?- e; P
#全局的日志配置 其中日志级别是[err warning info debug]
" n; U, h& d, N! G* E4 K
: P% }$ Y7 v+ _" g" ]  L#local0 是日志设备,必须为如下24种标准syslog设备的一种:
8 K+ Y- m5 {; U! m& ~* u2 }6 \5 ~9 p! p- Z3 `* O* r. u& C
#kern user mail daemon auth syslog lpr news
' B* @9 P' f, a, J- V4 ?+ e* z
  G# s2 g3 N1 v+ ]#uucp cron auth2 ftp ntp audit alert cron2   r! e/ ]( I  g

" v3 T  q$ t7 h  E: g7 ]#local0 local1 local2 local3 local4 local5 local6 local7 % K  D$ m& }+ k0 T8 l4 u

; }) |3 t( S: }# Z7 g5 Q#但是之前在/etc/syslog.conf文件中定义的是local0所以% M; S* _7 _1 N, d  c$ B

1 `# ~3 _; @1 n#这里也是用local0
. ?- n' B. d+ }4 P* ?$ j4 F/ P' X1 J& }
log 127.0.0.1 local0 info #[err warning info debug]: t) y7 p8 Y  O0 \1 L$ d, n

! {  l* Z. S+ p! \1 j#最大连接数: i) {  ^0 X3 {" B1 o. Z) o% [7 b
% Q. |; T% J! `
maxconn 4096
/ j6 s. h# O9 T. {$ }% \) }2 J4 C" G; T6 T. J
#用户7 [0 b  E4 Z# C; @' ^/ q
* _0 Y: p5 i: {  C( x
user admin) D# q, B2 t; l" d

. _6 ]& s; d+ G  M- g7 J1 Q1 R5 l# r$ X#组$ d) ~9 F' Y) F8 n6 f+ Z# p
8 k0 t& F  G5 ?1 {( S( t
group admin
5 b* q+ b' \4 H: m/ ?% Y: ]/ Y& X
8 J4 m0 q1 v, D5 R/ _* g#使HAProxy进程进入后台运行。这是推荐的运行模式
- e1 R% Y% z$ s6 \% M! L! ?# `- P1 ]$ k6 A4 ]0 I
daemon
3 b$ S- c. c+ n8 d6 w) t: e/ |8 Q
4 I- X+ p- P6 J* O#创建4个进程进入deamon模式运行。此参数要求将运行模式设置为"daemon". b. j6 a8 M# o$ O5 }$ O2 U

. p8 D2 M  E; z$ Nnbproc 4
0 b+ G* n0 g  \" Z- T+ j( g6 J9 ]7 R4 ~6 D. t# o
#将所有进程的pid写入文件 启动进程的用户必须有权限访问此文件。- A, _" H, s9 f* h
1 m$ ?6 i  D% m2 g
pidfile /home/admin/haproxy/logs/haproxy.pid
8 C- R! c7 G6 n2 R% q7 f5 I. H
4 K$ g. {! {$ |* w' q) \defaults
7 l0 D0 ]- W1 Y1 t( d: [5 U* E" m5 i
#默认的模式mode { tcp|http|health },tcp是4层,http是7层,health只会返回OK
5 K, g: U7 q9 e. N) \* Z) X/ R( M) x' b- j: U4 Y, r' o. l/ ]
mode http
7 t/ c& B  b8 O; s! ]% X) h
  \3 c0 R% d/ l& b; e& J#采用http日志格式
" t# i1 B3 G, q" K$ x# a* n' k) @- `3 U2 A6 ?8 d/ D4 |
option httplog$ H5 @2 e5 a8 `9 e
: |" `& p% g$ o& F" w  F
#三次连接失败就认为是服务器不可用,也可以通过后面设置
9 n- y/ u2 ?) W8 H+ R: I3 X+ i( ?' L& X6 d. a  r! N
retries 3# v9 G( X8 R/ j# u) W0 y: T

8 P/ K" _- _' X9 z+ k9 o0 N如果cookie写入了serverId而客户端不会刷新cookie,
. f/ h6 I: F- S  a  n
2 ]0 N2 B6 c7 r( c1 S5 `#当serverId对应的服务器挂掉后,强制定向到其他健康的服务器
' M. w" g4 M7 i6 C
3 M8 a2 H9 i+ I  Ioption redispatch5 o. Z! g6 r  j4 z3 l5 F
# Y) I$ o$ v$ |' W, I7 h1 n
#当服务器负载很高的时候,自动结束掉当前队列处理比较久的链接  ]: N$ d- c" w4 Y( ^9 F) H& t
- o) g! {8 ]2 @; X8 O
option abortonclose
) C$ V4 M$ `8 }. E. y# Z1 t5 M4 o2 y. w/ T9 Z! b
#默认的最大连接数
7 x- h) V8 ?1 [. j6 i' U' V1 L6 H; X- D9 m. {/ b, q
maxconn 4096
+ p7 T& z" H4 O7 O0 `1 i! z# [
& I( l) t( A8 R/ ~1 Z#连接超时: i! K) \/ ]* O- x( H6 j

$ P$ K# U9 {4 d/ @' G9 q. rcontimeout 5000
# a' |4 v. Z- n9 l/ U( I' b# B6 I' _# V! W; P. j+ d; u# l0 d4 X
#客户端超时  }0 c# U, N, q8 ~2 j
/ c& C. \5 b3 U6 B
clitimeout 30000/ R5 h- t: J, |+ x% j2 G  q
: ?6 g8 c. G# f7 _: l# M9 z
#服务器超时
) }- ^0 ?; c0 V. B$ Z6 h0 r# g  n
* J7 j' {1 e: F% L  W5 O: q$ jsrvtimeout 30000/ E0 X- h, h/ \: M7 u2 T" a

2 I  l" k' P! E0 f$ f#=心跳检测超时/ _( m0 @; V; ?$ R, j
( n. s' [* j) Y1 l  A. L
timeout check 2000
# u% Q! W. z8 U& y! ^# G- F
6 l  l+ e, k: ^& z  l& [#注:一些参数值为时间,比如说timeout。时间值通常单位为毫秒(ms),但是也可以通过加#后缀,来使用其他的单位。% f. N# V# T+ Q/ D% R* I5 m

. m3 T# J' `# t# T#- us : microseconds. 1 microsecond = 1/1000000 second
% s+ I  `. [% ?% N- I0 \6 x
- x4 U$ [1 B3 d#- ms : milliseconds. 1 millisecond = 1/1000 second. This is the default.
9 ?" R3 m0 Q( Q- v! {0 w* i9 A; B2 f0 r" N& g
#- s : seconds. 1s = 1000ms5 F# o4 Q. i* X$ ~# K
. t3 j. t+ j5 p. q9 m
#- m : minutes. 1m = 60s = 60000ms. k- ?" Q% Z  V, g2 H4 P
- u4 H+ z+ r( x8 Q
#- h : hours. 1h = 60m = 3600s = 3600000ms8 ~5 x  r. e8 U1 Q6 I$ Q0 E

* V/ l3 n7 N; q& D& G#- d : days. 1d = 24h = 1440m = 86400s = 86400000ms% K+ n2 e) r# P  D  F

/ R* [3 S1 P" g* P" v; s! o########统计页面配置############
9 r' }2 _7 g% [4 }" a+ p6 I4 j3 l: D, i0 Q
listen admin_stats
' T% o; l! @1 q9 c, S! ]' o
1 X6 y$ U; i' n+ R' E- n# Q" g#监听端口
( N' W( @1 n+ N! v& X- |
1 [9 z5 A+ B8 C/ Fbind 0.0.0.0:1080
. ^4 C( L, @- S
, u  h4 M  L; R+ c#http的7层模式
9 K7 Y! o' \$ i; w  H& s# R0 P$ z8 A. u8 @1 j/ V
mode http
# [/ L) m- l5 s3 y9 e6 z9 Y
5 O3 U4 N. W3 ]) I: }6 q#日志设置+ L7 G) D" T0 g3 I! x+ S0 A
9 x4 s3 k5 T3 [$ ?0 X
log 127.0.0.1 local0 err #[err warning info debug]$ }6 p+ b: n( _# S- N+ w. g& G

! T5 R0 O" p7 L2 `#统计页面自动刷新时间
3 a# A& f6 v0 t+ d( e3 m& }; r6 g0 H8 t! E
stats refresh 30s
' e: q# h- x0 T& s  |. @  G5 @/ j9 L5 R+ v
#统计页面url
- i: j3 ]: u- o0 j5 z2 a& d( E4 W/ A
+ h3 [$ C/ ^* vstats uri /admin?stats2 V6 {. d4 \( h6 Q# A4 Y
2 z. S& m/ J" |
#统计页面密码框上提示文本2 w3 d+ \9 L  j( l
2 Z/ ^' Q" w' I; {. W
stats realm Gemini\ Haproxy* X3 |8 d! W, S: @) y) M% m, o
% m# ]" u8 n3 ^* a( m
#统计页面用户名和密码设置0 F, @+ p# A4 [# ~" p/ Y( K) Z
5 C0 Y5 m/ C4 N, B+ Q
stats auth admin:admin
; ~5 F2 c# z0 L# c: E! f! G
8 r1 O1 \% s* j; _8 a; `$ ^1 [' sstats auth admin1:admin1
! m# o' X5 f' f* V9 D: i5 C: x" }1 ~3 A# W! }& R
#隐藏统计页面上HAProxy的版本信息) P  D( t. @( E
/ N- {+ o2 I+ T- ^
stats hide-version
, b" N& B% [. X# W+ t8 J, p; h0 N$ f2 o4 A4 s
#######网站检测listen定义############9 V- Q: \! W9 U0 M
7 H. L4 }. U& [" g" \
listen site_status/ D5 Q6 y; k2 h# T/ c

( T4 M  l+ F" V( qbind 0.0.0.0:1081, P2 [# w) l; M, @9 S1 }2 M; O
& ]( o$ T2 l# o) k6 L: G
mode http! T' o, p' j) u! X7 D- ?
; Q* d* S' N6 t, D
log 127.0.0.1 local0 err #[err warning info debug]9 G, I9 h' E) U. n: Y+ h
+ @" j7 G( P/ o! K/ A
#网站健康检测URL,用来检测HAProxy管理的网站是否可以用,正常返回200,不正常返回5003 A5 p5 _: I' a  h4 c& z$ \
4 {9 B' e7 |$ N5 R8 Z( ~
monitor-uri /site_status( Z7 g+ t5 X, O9 n( _) q1 N
$ L' W! S6 c; f. v* E
#定义网站down时的策略
9 \$ o' A) A3 C& d4 P" |/ u
# x6 ~( t* |5 t  S3 t#当挂在负载均衡上的指定backend的中有效机器数小于1台时返回true
4 [: t1 v5 p! a8 l/ @
# F" E2 w" Y' Q7 Q4 lacl site_dead nbsrv(denali_server) lt 1
0 z, {5 y! |% J$ c
9 |" L( c  [) S/ ?. J1 c! gacl site_dead nbsrv(tm_server) lt 1 ) }2 U! N* [1 w. b! B

" h8 |. ], n1 S: Aacl site_dead nbsrv(mms_server) lt 1/ d: ^. Y; T; f# a

) _9 L8 ~2 V; A7 q! G#当满足策略的时候返回500
' }3 t* X; n, c
/ e1 \5 D( S& A* S# E3 Rmonitor fail if site_dead
, O4 q# C. [$ ?! V: N6 a& ~; b. V% b/ y9 Q0 N
#如果192.168.0.252或者192.168.0.31这两天机器挂了/ w5 {9 q* p  g

4 C# }8 L8 W, e#认为网站挂了,这时候返回500,判断标准是如果mode是
. p3 s" w+ `8 Z2 G! L* i
5 l7 N+ ~% Q) @" m#http返回200认为是正常的,如果mode是tcp认为端口畅通是好的
. t+ O- [0 K7 a  y% {- }$ ?
8 R, t* R5 G8 {- Cmonitor-net 192.168.0.252/31
* i, Y: n* Z, x$ l5 n  j: u8 ~4 O4 r, ^! [
########frontend配置############& P+ S' ~6 Y' x7 G2 x

2 ^' y$ a) z" J( b. Tfrontend http_80_in
4 J  R& [2 w" h1 b7 Q7 r2 H0 E+ k7 L' _; u
#监听端口% A9 O" {* j6 p5 m9 Z
  [! [9 N& D  b5 X* P& D# A
bind 0.0.0.0:80$ T' @+ t  ^$ R
' ^. \6 S, |$ N! {" u% Y  r+ M( _  Y
#http的7层模式
8 q2 d6 _" N. d: C% q% ]% Q% a
6 c9 E  O% \! P  Emode http8 V# \$ `) a. U6 ?1 o

- k6 o( f0 l) c+ V9 z9 B2 ^#应用全局的日志配置* }3 x/ r6 {' Y2 H8 K8 K4 y

) q/ p: E% _6 ulog global
5 J1 M5 V6 l) G) S
# p8 |% o* a, L' I" A9 o- y#启用http的log3 ]' z/ D3 p! L. A2 c2 H# `0 M8 ~

1 K3 Y1 v, W0 Z( L  c. {& \& @8 Xoption httplog
2 u) e  j) T5 ?3 u/ e3 @
" W" B/ z  }2 [7 J#每次请求完毕后主动关闭http通道,HA-Proxy不支持keep-alive模式1 e/ l1 L; D3 m+ Q3 {' I4 J. u6 {
- C- W! |9 }; h! I9 L6 T# X
option httpclose
& x& p# \  X9 X/ b  y+ [. X; H: l. M* P, D, W9 ?
#如果后端服务器需要获得客户端的真实IP需要配置次参数,将可以从Http Header中
6 o/ J' X4 ^* }: \  [- o$ D, ~  K+ Z$ I! b3 w" L, ~+ B6 ]  b$ {
#获得客户端IP
  r2 d9 D% m% F0 T% [" o7 j- z: Q- p, [' @( L7 G
option forwardfor# f2 W0 \3 c. ^1 e8 _- e

- W2 [  W3 A* p###########HAProxy的日志记录内容配置##########6 c7 C- B* H. D: f" d7 M# t! S; a

( g& N' [) Z& M* R) ?capture request header Host len 407 b1 c% F' T7 m, J& x
3 U$ m" `: X, t8 {
capture request header Content-Length len 10
* U# F! \5 ^% \/ w9 m$ M; U& x. S  ]% o) K
capture request header Referer len 200
5 w8 Z) C1 ]  x! U& e
% G+ c& H$ \  x0 O# K: rcapture response header Server len 40
& T8 L" G; }: z5 Q2 B+ N, A2 m) n1 A/ d5 l( n" y4 U
capture response header Content-Length len 10
4 u. E  y, X" B( f" U7 D8 P2 Z! x; Z( q
capture response header Cache-Control len 8
& L1 a3 V; ^2 D+ {+ w7 _3 o
! d* i/ \2 ^+ c' F# h: S####################acl策略定义#########################; p& _& C, J; m
$ H! R% b  U7 {0 Z
#如果请求的域名满足正则表达式返回true -i是忽略大小写
4 X* F5 j5 s4 ^- M+ x2 G0 |( e1 m# d0 V" |
acl denali_policy hdr_reg(host) -i ^(www.gemini.taobao.net|my.gemini.taobao.net|auction1.gemini.taobao.net)$
3 P8 O4 E( d5 j0 x8 b# a0 {- D* h' g5 C, s. o
#如果请求域名满足trade.gemini.taobao.net 返回 true -i是忽略大小写7 q' k6 z0 G, ?7 T; L
# m( b& J2 f" ]' _- z6 d
acl tm_policy hdr_dom(host) -i trade.gemini.taobao.net
" H! u; P  j' n( c: r" P
+ A# Q2 r" V4 s##在请求url中包含sip_apiname=,则此控制策略返回true,否则为false# h4 O: E- d9 y
# |( g; o8 Z, f5 x. G$ U: j! o
acl invalid_req url_sub -i sip_apiname=
9 i3 W1 |7 i6 }( N: l1 ^
0 U/ O& v0 {! e4 f##在请求url中存在timetask作为部分地址路径,则此控制策略返回true,否则返回false4 g0 h; h  v$ m: G/ p* L* H

) t" M" {5 Q8 z3 z$ nacl timetask_req url_dir -i timetask
" ~- F4 u% z/ `' |) p5 o  f( Q/ `- ]8 q6 d. P
#当请求的header中Content-length等于0时返回 true
: r% K; W0 s9 B5 }
" i1 e% d, b/ S7 Q. v# uacl missing_cl hdr_cnt(Content-length) eq 0
4 _+ j6 J' H  A, i6 n" ^1 ]' U4 l4 b: M
######################acl策略匹配相应###################. t, ?$ D  I# |8 G1 B. {
/ F4 i" p' [0 K3 H* i; H, X
##当请求中header中Content-length等于0 阻止请求返回403. W. X5 ~% Z; n) w
" ^9 L- b# x1 W
block if missing_cl* r/ u/ m# U: \  u) O- G# K
7 e# f8 X  ]  j* g2 H
##block表示阻止请求,返回403错误,当前表示如果不满足策略invalid_req,或者满足策略timetask_req,则阻止请求。
% N) n) d) M6 }( s. d
$ H2 g1 \1 |# [, w* hblock if !invalid_req || timetask_req , q! X6 q+ D2 y; `
* e) u" w7 \, L% ^4 j5 z  a- Z* H# C
#当满足denali_policy的策略时使用denali_server的backend
7 [4 c' O% m2 b0 i7 @6 D7 L8 ^8 V: B- Z: j0 A! q" K1 R
use_backend denali_server if denali_policy, o, p2 [# j" r) H; f( l
5 t  |' }$ q+ p8 ~0 g% c4 m7 M
#当满足tm_policy的策略时使用tm_server的backend, Q0 P% \& n  m5 {5 d

, R6 i7 r, U7 @0 }3 V& vuse_backend tm_server if tm_policy( B  `4 H% J: V- V& ]! e6 @3 ^
' f; b# G+ r9 ]& L# A! |# F
#reqisetbe关键字定义,根据定义的关键字选择backend2 T9 {! B/ Y* W* J
5 Z6 e% p* F  x  c
reqisetbe ^Host:\ img dynamic
: g$ F0 X& y! w4 `
2 U8 b1 R$ ^' Vreqisetbe ^[^\ ]*\ /(img|css)/ dynamic2 X" W6 x9 ]8 n3 S: m) ?

: `" e$ M* a) ^' N$ @reqisetbe ^[^\ ]*\ /admin/stats stats
& `8 c( b" e' f2 N# n9 Y/ w0 ]6 L$ H# x- g7 w& y
#以上都不满足的时候使用默认mms_server的backend, G* a% H# q" m

8 I" r& j: s3 S0 E' }1 Jdefault_backend mms_server3 U3 a: G7 l' t) f6 m

- b. V" z& }* P5 c* }#HAProxy错误页面设置2 O9 A( H, v2 d2 m% q/ J$ D
! M$ i' j/ ?$ A
errorfile 400 /home/admin/haproxy/errorfiles/400.http
7 Q* \4 Y  w5 |5 O
( i% x. p8 H( @( P- V) ]* Oerrorfile 403 /home/admin/haproxy/errorfiles/403.http; W: I8 H5 j/ `6 ~% Z

* E  V1 o  I$ O. A* y# b+ merrorfile 408 /home/admin/haproxy/errorfiles/408.http( {* D6 T: R5 A  W) ^5 I
) G6 u9 u( z. C. e  h+ \
errorfile 500 /home/admin/haproxy/errorfiles/500.http
: f. A7 u9 U0 N- h6 J! N4 Y
  a' @! R$ C2 {errorfile 502 /home/admin/haproxy/errorfiles/502.http
( E. s2 B0 o  k% t8 n
5 x7 o) I+ T- o5 C( _7 Werrorfile 503 /home/admin/haproxy/errorfiles/503.http3 c0 ~* @& `+ w
& n. Y$ I3 T/ t3 y; g2 ]0 Y
errorfile 504 /home/admin/haproxy/errorfiles/504.http+ u5 x) A. k4 J' ?
) ^! H! m8 O! i. g& s! G2 Q9 }3 o
##########backend的设置##############3 |7 a! R6 W, @& B, D* Q& i
8 H! _9 n) k( @; o, d$ E  h% `
backend mms_server0 Z) f* E4 R% i/ \9 Q

2 c9 b" `3 h, }1 Q( V2 O( }, l#http的7层模式" b7 E( U5 Z* o
. w! x( [* V0 P" d% R
mode http
7 @3 T* t; }& I$ B6 W
8 A- X8 v, O2 \& f( X#负载均衡的方式,roundrobin平均方式
  P9 r, }. ^5 E' I( A  t; N8 a: Z& O( `8 h- J$ f: i! L
balance roundrobin$ a" n4 }) |# w# b

) F% G$ \6 E) d( M#允许插入serverid到cookie中,serverid后面可以定义7 c1 E$ k. N$ k3 ?* T

9 X# x. z& `; Pcookie SERVERID4 ~9 E. I" B' {+ t

- r) k3 M5 ^' i#心跳检测的URL,HTTP/1.1¥r¥nHost:XXXX,指定了心跳检测HTTP的版本,XXX为检测时请求( \' s$ j* O# X1 `3 K% l
0 X; ~1 [2 g" [0 F6 o
#服务器的request中的域名是什么,这个在应用的检测URL对应的功能有对域名依赖的话需要设置$ K  |# i: [9 R' z7 T5 N1 P2 f" ?

) v* Q+ V/ |. R% k$ a( y2 G" ^option httpchk GET /member/login.jhtml HTTP/1.1\r\nHost:member1.gemini.taobao.net- d3 ?8 g9 R' G% a; @5 q

+ F9 m/ T) ~7 g8 Y0 C# e0 p#服务器定义,cookie 1表示serverid为1,check inter 1500 是检测心跳频率
2 H7 A, C& G: W9 \# y" a' a* ^% M
#rise 3是3次正确认为服务器可用,fall 3是3次失败认为服务器不可用,weight代表权重
& e# ]; Y" N+ \2 y( {% g7 t, z0 }+ G" R
server mms1 10.1.5.134:80 cookie 1 check inter 1500 rise 3 fall 3 weight 1
, s- B7 e+ F* n9 U$ V9 U; z
2 j1 D* J9 C: M) h( _5 zserver mms2 10.1.6.118:80 cookie 2 check inter 1500 rise 3 fall 3 weight 2
5 t- s! z7 {8 J$ V3 \& }. J3 j- R% q% f! x9 k
backend denali_server8 t. W: Z: n" ~, c  c5 f. X
! J* q+ U7 C- w
mode http. X5 q5 F% O, I! c* ?

' Z/ j) b' Q- V5 Q$ {#负载均衡的方式,source根据客户端IP进行哈希的方式6 ~3 G" O0 D" ~; b
2 E& i( ?) o2 ^& s
balance source! T" X  Y$ M9 h- K, O6 `5 Z: ]

. F. r6 _! ~1 z% j6 Y, }#但设置了backup的时候,默认第一个backup会优先,设置option allbackups后
3 V$ k) M4 K- N0 V* j. ~. U8 P0 y2 }0 h; J! y
#所有备份服务器权重一样
9 g; c: r4 I, u1 ~; N* I% w! F* p, G$ l3 N
option allbackups
; k0 b4 h; E9 v$ k( V( _! P* B: @7 j2 \( B4 M: w+ O
#心跳检测URL设置+ z* H8 e( Q5 k0 h. V/ U- T2 J
' k( w" ^4 w" V0 M
option httpchk GET /mytaobao/home/my_taobao.jhtml HTTP/1.1\r\nHost:my.gemini.taobao.net, l! B! E0 M% B! o  y+ _5 b

/ y+ k+ Q7 I, B#可以根据机器的性能不同,不使用默认的连接数配置而使用自己的特殊的连接数配置) ~; D1 [, V; C1 g% v. ~$ ?

; ]1 {; ]9 l2 D#如minconn 10 maxconn 20
* _/ P( h# V* |7 E  y
  x' G) L8 S8 O1 z2 Z3 gserver denlai1 10.1.5.114:80 minconn 4 maxconn 12 check inter 1500 rise 3 fall 3' j6 h% p0 l$ o, T- N
  w7 h% ]( W; Q( Q9 M! {2 N/ v
server denlai2 10.1.6.104:80 minconn 10 maxconn 20 check inter 1500 rise 3 fall 3+ O3 ~$ d( ?# _' n

" h  f- n! Y& S" G2 j/ c#备份机器配置,正常情况下备机不会使用,当主机的全部服务器都down的时候备备机会启用( g& r7 y& Y8 v: X: |6 |- N8 \
: ~4 W  A; N2 ]# Z  \3 _
server dnali-back1 10.1.7.114:80 check backup inter 1500 rise 3 fall 3) b  Z  p: e5 s; R! r$ Q, h4 F* Y$ d
" a& i! i( p* Y
server dnali-back2 10.1.7.114:80 check backup inter 1500 rise 3 fall 3
5 J6 c. M& H5 {% Z0 j) j+ d0 i; R3 x; e' k+ J# p" w
backend tm_server4 u$ w) D$ c: n
. B& z) j! ?  E% V, x8 P
mode http& z$ F! a  h& b

; T) ]. P2 U: N  V6 g" t+ B#负载均衡的方式,leastconn根据服务器当前的请求数,取当前请求数最少的服务器. W2 Y6 [# U5 @# R$ m% R8 c

" y! x9 ~* r- B" a0 u8 Kbalance leastconn* `# w( J: [- v4 _

0 Z5 W+ a( v4 i# h4 Roption httpchk GET /trade/itemlist/prepayCard.htm HTTP/1.1\r\nHost:trade.gemini.taobao.ne
0 o6 D4 x0 |" V4 S; f  B
- m/ i! h/ x' O1 `7 ^server tm1 10.1.5.115:80 check inter 1500 rise 3 fall 3
. u& f, U; L' y( x) o4 A3 p7 M) Q( o/ L
server tm2 10.1.6.105:80 check inter 1500 rise 3 fall 3$ \2 @/ Z, }, d6 j$ D* y  ^

& J. v! X3 Q! i: U' z######reqisetbe自定义关键字匹配backend部分#######################
* @' t/ A4 V: h2 K4 @  \, Z$ ]$ t: Z. }; x, o, A  ^; w6 _
backend dynamic5 _! B* I5 a* W# |5 G$ |
( o9 e7 {( m8 ~
mode http
2 S' U; a; N) A/ ?; w2 u/ l9 g4 b% X  s1 w; ]3 M
balance source
# t8 \! |. d" u: G8 d7 y- o/ X3 T: i! V0 w" r. ]4 y/ v
option httpchk GET /welcome.html HTTP/1.1\r\nHost:www.taobao.net( |1 G1 z0 d  W: B
% @2 T% Y4 ~& |2 u  j0 U- _
server denlai1 10.3.5.114:80 check inter 1500 rise 3 fall 36 a: V! S) G: T2 T9 Z+ K! [& [
5 z8 c1 r* g0 {' |: Z8 u( [
server denlai2 10.4.6.104:80 check inter 1500 rise 3 fall 33 f4 x+ X/ B9 D  k
  b' `- \% R3 Z8 B" o) D/ V) F
backend stats
9 O$ U/ L+ s9 W1 [- b
& _6 E( p- o% H- ?mode http  A& Z! ^' m( V

) T: r1 P7 m) r, o  `+ |; fbalance source1 a: p' Y# k% l" y8 d  C8 l

$ R/ A8 P1 a, s# Y* _0 Q; s2 X: Loption httpchk GET /welcome.html HTTP/1.1\r\n Host:www.163.com- I2 E) r: J' y( v! m: p
/ L" a# R6 t+ k( E' q6 `" Y
server denlai1 10.5.5.114:80 check inter 1500 rise 3 fall 3
( s3 W; N4 m  @' Y( w; U' `$ P$ L% x0 `) x% U" m. s" ^, d" a
server denlai2 10.6.6.104:80 check inter 1500 rise 3 fall 3
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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