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

haproxy配置文件讲解

[复制链接]

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
发表于 2017-9-8 10:03:56 | 显示全部楼层 |阅读模式
global                                                       # 全局参数的设置
, |3 C0 k) i; u# f2 e* `    log         127.0.0.1 local2                      # log语法:log <address_1>[max_level_1] # 全局的日志配置,使用log关键字,
" B) m" e" q. N$ G                                                                     指定使用127.0.0.1
% z% m3 s+ N* @, L                                                                     上的syslog服务中的local0日志设备,记录日志等级为info的日志% x; u" V5 t' M/ M- i
    chroot      /var/lib/haproxy                 #改变当前工作目录
8 V8 N0 A' K( `5 f2 ~    pidfile     /var/run/haproxy.pid          #当前进程id文件  I7 ?- p5 e1 v! J
    maxconn     4000                                #最大连接数! d: q5 X& u2 F6 q: b
    user        haproxy                                #所属用户
" U! J# C. V8 u$ H# X0 \    group     haproxy                                #所属组$ r7 a7 ?9 H( i" m
    daemon                                               #以守护进程方式运行haproxy
, y' F% n1 C$ o0 c    stats socket /var/lib/haproxy/stats! \1 n8 b. b5 b8 A
defaults% [7 {& H- M/ e3 M  P- |! P" a
    mode                    http                        #默认的模式mode { tcp|http|health },tcp是4层,http是7层,health只会返回OK
) c, d) y! p0 }" D+ N    log                        global                    #应用全局的日志配置' g. u7 E7 E" b4 t4 r7 ?: p
    option                  httplog                  # 启用日志记录HTTP请求,默认haproxy日志记录是不记录HTTP请求日志+ w& e. g2 w6 O/ ?" e6 ?  [
2 F/ @3 [1 K' i- i5 ]) ], l4 |& P
    option                  dontlognull          # 启用该项,日志中将不会记录空连接。所谓空连接就是在上游的负载均衡器
1 t% n1 j- Z& W2 h+ k8 y                                                                   或者监控系统为了探测该 服务是否存活可用时,需要定期的连接或者获取某
; w# G- D' y2 O' g4 X8 ]                                                                  一固定的组件或页面,或者探测扫描端口是否在监听或开放等动作被称为空连接;9 o# ~9 \( `6 T( @, `
                                                                  官方文档中标注,如果该服务上游没有其他的负载均衡器的话,建议不要使用) E$ o2 u( K  x! U; _' n
                                                                   该参数,因为互联网上的恶意扫描或其他动作就不会被记录下来
+ @2 s& N; u& r+ d! `    option http-server-close                   #每次请求完毕后主动关闭http通道
6 Z. T9 r9 t. f$ Q& n" _! L    option forwardfor       except 127.0.0.0/8   #如果服务器上的应用程序想记录发起请求的客户端的IP地址,需要在HAProxy
/ W2 Y  i6 J% D                                                                            上 配置此选项, 这样 HAProxy会把客户端的IP信息发送给服务器,在HTTP2 e/ c: d0 _! L1 t; K4 v- d* ~
                                                                            请求中添加"X-Forwarded-For"字段。 启用  X-Forwarded-For,在requests
# f4 w4 e9 T- Y6 f- v! V                                                                            头部插入客户端IP发送给后端的server,使后端server获取到客户端的真实IP。
) v  h; [. o! [) g0 Q4 z4 a3 l$ s    option                  redispatch                      # 当使用了cookie时,haproxy将会将其请求的后端服务器的serverID插入到3 `+ R/ F$ T9 ~; y" r
                                                                            cookie中,以保证会话的SESSION持久性;而此时,如果后端的服务器宕掉4 m9 V* b$ m7 {. s0 K
                                                                            了, 但是客户端的cookie是不会刷新的,如果设置此参数,将会将客户的请/ B8 G: T, ]2 i( @9 g1 Q
                                                                            求强制定向到另外一个后端server上,以保证服务的正常。; K: A7 o2 D) a$ d' P4 g7 m
    retries                 3                             # 定义连接后端服务器的失败重连次数,连接失败次数超过此值后将会将对应后端
& f7 ?- J" a6 c9 W- }& b                                                                  服务器标记为不可用& t: _$ K& j/ H' g
    timeout http-request    10s             #http请求超时时间
6 r4 S- J! T. X/ V6 N/ ]$ \    timeout queue           1m                 #一个请求在队列里的超时时间
/ S& q$ s: {; \0 f' @    timeout connect         10s                #连接超时
0 T5 x9 h+ X. Z    timeout client          1m                   #客户端超时( E# F+ v3 w) q( j( ~8 D
    timeout server          1m                   #服务器端超时& i* f! m* G/ Z  G  y% M/ Q8 [4 j
    timeout http-keep-alive 10s           #设置http-keep-alive的超时时间
+ U+ V# ~" Z% p' o, H% h    timeout check           10s                 #检测超时
5 m& y+ e& e* N0 ^" t    maxconn                 3000                 #每个进程可用的最大连接数) P, O  s! X' T& j! X
frontend  main *:80                             #监听地址为806 ]6 F/ x/ P/ q  H7 W
    acl url_static       path_beg       -i /static /images /javascript /stylesheets; _8 {* x3 G3 Q) Z- |: |- R, H* z
    acl url_static       path_end       -i .jpg .gif .png .css .js
# u% y' Q; w# E5 r    use_backend static          if url_static! S1 }$ P/ `0 ^" c7 g
    default_backend             my_webserver     #定义一个名为my_app前端部分。此处将对于的请求转发给后端" v  ]- t& W: e. O
backend static                                                 #使用了静态动态分离(如果url_path匹配 .jpg .gif .png .css .js静态文件则
& |' j7 K6 Q. E2 Q/ ~; Y0 V6 ~                                                                            访问此后端)# \' v- ?- X- B. x/ n4 G
    balance     roundrobin                               #负载均衡算法(#banlance roundrobin 轮询,balance source 保存session值,
# ^+ ]4 q0 A& n' M5 F                                                                           支持static-rr,leastconn,first,uri等参数)
* B' A! C5 ~  r0 x, Z8 B    server      static 127.0.0.1:80 check             #静态文件部署在本机(也可以部署在其他机器或者squid缓存服务器)$ Z7 C. w! n: g/ r! B
backend my_webserver                                  #定义一个名为my_webserver后端部分。PS:此处my_webserver只是一个
' c( ~0 G  q3 d9 L- ~! x                                                                            自定义名字而已,但是需要与frontend里面配置项default_backend 值相一致4 }) M" ?4 g! ^5 a/ q
    balance     roundrobin                               #负载均衡算法( H) ]/ `. @7 W; t  r
    server  web01 172.31.2.33:80  check inter 2000 fall 3 weight 30              #定义的多个后端" p# b4 N1 k& ?5 a
    server  web02 172.31.2.34:80  check inter 2000 fall 3 weight 30              #定义的多个后端5 x; n- d; Z! @) r
    server  web03 172.31.2.35:80  check inter 2000 fall 3 weight 30              #定义的多个后端
  c7 E. N) `+ w8 ]
, P6 h( |+ F2 ]& Z9 b5 J
8 v8 Y; u# R4 m' f, }" L8 g

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2021-7-12 13:55:30 | 显示全部楼层
常用配置选项:
6 \* ]9 ]! D( R6 s- N
, x+ s) q! j) P
7 e0 c" X/ f- @( x% U6 U$ q$ N6 }+ S4 r# [# q- z7 y2 F2 `* w
OPTION 选项:
- Z7 I. }( {: t7 y0 ^' i
( `1 U' O1 \( t5 `7 L( toption httpclose :HAProxy会针对客户端的第一条请求的返回添加cookie并返回给客户端,客户端发送后续请求时会发送4 u- A  O( A! e

" j2 P3 w6 `2 @: Y* U' _  z1 K& o                             此cookie到HAProxy,HAProxy会针对此cookie分发到上次处理此请求的服务器上,如果服务器不能忽略/ |$ D( F8 y; z# @: A) n: Y1 M* W
) n5 _: U8 U& {, D8 ^4 a; r
                             此cookie值会影响处理结果。如果避免这种情况配置此选项,防止产生多余的cookie信息。5 _) _8 ?/ R9 I. D

5 v( `1 g# k8 }4 o4 X6 {4 `6 m0 poption forwardfor :如果服务器上的应用程序想记录发起请求的客户端的IP地址,需要在HAProxy上配置此选项,这样
0 ]( K, v, J  L2 R: Q
1 P& j9 i9 {! M  V! e% V' `4 K                               HAProxy会把客户端的IP信息发送给服务器,在HTTP请求中添加"X-Forwarded-For"字段。: r! H* \$ p& k- u/ A
, F' M$ g$ @  Q& g9 q) }
option originalto :如果服务器上的应用程序想记录发起请求的原目的IP地址,需要在HAProxy上配置此选项,这样HAProxy% O4 j% `4 R4 ~8 s0 e8 q
. w) P# L. Z) Y2 P$ |
                              会添加"X-Original-To"字段。
: H7 r# D! H0 S  ^6 ?2 F0 q+ d& G4 c5 W& b' g6 G
option dontlognull :保证HAProxy不记录上级负载均衡发送过来的用于检测状态没有数据的心跳包。
2 q3 j  d+ T  ]* a2 B' {# m! x; Z1 a2 l1 }2 }3 J8 R
- v/ Z/ C0 l' k/ {  p
5 X" M5 b+ U- @$ h; G% |
BALANCE 选项:
8 |/ q- }- Z: _, F
! p, c& P; c/ i. D6 x0 c7 o+ V, Vbalance source :如果想让HAProxy按照客户端的IP地址进行负载均衡策略,即同一IP地址的所有请求都发送到同一服务
- _- x  d' T7 n$ S, V
! g( O9 w; d* S6 l- t; v                             器时,需要配置此选项。
% e4 A" |+ k# X6 S$ |' d" o$ H- n1 C* N
balance roundrobin :HAProxy把请求轮流的转发到每一个服务器上,依据每台服务器的权重,此权重会动态调整。最常
8 A* X6 S, Y) s6 d# C" S$ w0 Z8 w; X* ^" h9 L" B: K
                                   见的默认配置。
/ N3 B% h% H, V. ?, f" H, N% Z3 ]4 Q9 g) J  H% M

- s5 ~" D* O7 {* W8 |7 n& |
1 f, Z1 m4 k3 m2 pCOOKIE 选项:
- l) h- a$ T. G/ i& q/ B' T3 E0 P  W. I. K0 F- V
cookie JSESSIONID prefix :如果客户端只支持一个cookie,并且服务器上的应用程序已经对返回设置了cookie,
9 |" K1 O  r* M/ p5 b% Q4 x  x" z. V: l
                                               HAProxy设置此选项可以改写应用程序设置的cookie信息,把服务器的信息添加到原cookie中去。9 `; b5 U3 Q- J* m) U* Q# B0 {
8 W/ I( X6 ?% U, b9 l
cookie SERVERID indirect :HAProxy会删除添加的cookie信息,避免此cookie信息发送到服务器。5 x0 p! f- W  B" O, P
6 x2 D; e, r3 e, V6 }7 q
cookie SERVERID rewrite :7 J3 v7 [& {4 c2 a8 B
2 s5 b1 y8 i4 P: D. W8 E4 z
cookie SERVERID insert :
" E5 |+ {2 O& `% m% ?2 X8 X' K- z9 S1 G. D! F* C8 E* Q+ I- J0 a
cookie SERVERID insert nocache :
/ Q% q% m# d7 ~0 S6 c1 n/ a6 o  t/ Y( D& i+ h2 h% `- S, X
cookie SERVERID insert postonly :! Q4 M& v7 _: K) L  f

- A% K, b' Z: F( \( c: n& J5 d1 z6 {; v7 \' Z

' |4 h: B/ T* @6 n! Goption httpclose
* j3 t3 X9 i4 g# B' X6 ^" Fno option httpclose
9 `) v) y( H3 R6 f: x  Enable or disable passive HTTP connection closing   启用或禁止消极的HTTP连接关闭2 [; O7 p$ v" Q- t5 M
  May be used in sections :   defaults | frontend | listen | backend! i& Z4 `1 X: F7 w' y
                                 yes   |    yes   |   yes  |   yes
3 Z# {$ b5 h: i4 S( @. G  Arguments : none$ F, a5 I  Z; x" ]) U: |
    \( C4 `- J: _" E9 \4 {6 s/ F
  默认的,客户端与服务端的通讯,HAProxy只做分析、日志和分析每个连接的第一个request。如果设置了 "option
9 d* m; t, s7 h9 X- @  httpclose" , 则会检查双向的http头是否有"Connection: close",如果没有则自动添加,使每个客户端或服务端在每次传输后,都会主动关闭TCP连接,使HTTP传输处于HTTP close模式下。任何 "Connection" 头如果不是"close",都会被移除。" Q2 c2 i, @# l6 h+ z: T

/ q2 K( S) z0 N3 r) {5 Z  很少会有服务器不正确的忽略掉头,即使收到"Connection: close"也不关闭连接,否则就是不兼容HTTP 1.0浏览器标准。 如果发生这种情况,可以使用"option forceclose",在服务端响应后主动关闭请求连接。选项 "forceclose"还可以及早释放服务连接,而不必等到客户端的应答确认。8 H4 V/ J3 {& f) b, o0 i8 y; A) g

+ Q( F+ l/ }  D4 K3 e0 d& h8 {  这个选项可以设置在frontend或backend上,只要其上可以建立连接。如果同时设置了"option forceclose",那么它比"httpclose"优先。如果同时设置了 "option http-server-close",则会实现"option forceclose"的效果。7 \3 X% o- ?/ M. E, B- I0 l+ d

$ \/ P* Z$ o2 }* z4 x8 P0 Toption forceclose
5 P! [' ^5 w. A7 c/ J5 ?no option forceclose! \: x! ~9 s2 v& r: M+ w
: H/ g) H- {! P; ~3 z9 Y: L
  Enable or disable active connection closing after response is transferred.     启用或禁止response后的主动关闭连接
# N$ E& ]+ I8 o6 |  B& `- p  H
( z9 }" z  R5 l& n! c% t" ^  May be used in sections :   defaults | frontend | listen | backend
1 d- b3 e; J' X" D                                 yes   |    yes   |   yes  |   yes! z8 R0 N1 z; L. `
. E" |% J% `, B) z
  Arguments : none  z3 y$ ]9 E, a% {8 X3 W: n
        有的HTTP服务器收到"option httpclose"设置的"Connection: close",也不会关闭连接,如果客户端也不关闭,连接会 一直打开,直到超时。这会造成服务器上同一时段内的大量连接,日志中也会显示较高的全局会话时间。( [8 @5 c. m0 j3 t
% L' j; A6 X0 _, G" B+ J) Z: w
        此时,可以使用 "option forceclose",当完成响应时,立即关闭对外的服务通道。该选项隐式打开httpclose选项。需要注意,该选项允许解析完整的request 和 response,所以可以很快关闭至服务器的连接,比httpclose更早释放一些资源。
. a2 v$ z: ?- a3 C/ P6 O        如果同时启用了"option http-pretend-keepalive",虽然会禁止发送 "Connection: close"头,但是依然会在整个response被接收后,关闭连接。
9 A+ j' O, E7 u+ q2 P/ c8 N! ?) y; l8 W/ A: _/ d
option http-server-close
/ A& q- G8 S- |/ u  a0 L) E6 lno option http-server-close
0 p; C0 o% C- s0 z  Enable or disable HTTP connection closing on the server side  启用或禁止关闭服务端的HTTP连接5 _2 D8 d$ r8 c1 ]9 B* m
  May be used in sections :   defaults | frontend | listen | backend
6 s: }2 Q$ S+ l3 G  z                                 yes   |    yes   |   yes  |   yes  {4 e* A1 R. m! x. ]! A" }
  Arguments : none
5 G" G# |$ Y! D: `4 W* w    默认的,客户端与服务端通讯,haproxy 只是分析、记日志,并处理每个连接的第一个请求。该选项设置server端为HTTP 连接关闭模式,并支持客户端为HTTP keep-alive的pipelining模式。提供了最低的客户端延迟和最快的服务端会话重用,以节省服务资源,类似"option forceclose"。还允许无keepalive能力的服务端在keep-alive模式下为客户端提供服务,但是需要符合 RFC2616。需要注意的是,有些服务器遇到"Connection: close" 时并不总是执行关闭,那么keep-alive 则无法使用,解决方法是启用 "option http-pretend-keepalive".
! M& w. G. }. m: p9 l5 o: R- h& F+ G% _$ }
     目前,日志无法指明请求是否来自同一会话;日志中的接收日期为前一个请求的结束;请求时间为新请求的等待时间;keep-alive request time 存活请求时间为超时时间,绑定 "timeout http-keep-alive" 或 "timeout http-request"的设置。
  z% x! r3 |/ `+ w! m     这个操作可以设置在frontend或backend上,只要其上可以建立连接。需要注意的是,这个选项可以与 "option httpclose"结合, 但 "option httpclose"优先级更高,结合后基本实现了forceclose的效果。% G1 c( C; I8 q  C

5 G* x; ]/ @; `( v4 c0 foption http-pretend-keepalive (http-假装-长连接)
" C: ?$ O; z2 A" Cno option http-pretend-keepalive4 A, i/ @' t! u+ T& U) @# P0 D
  Define whether haproxy will announce keepalive to the server or not  定义 haproxy 与服务器是否是 keepalive 的。2 y8 M2 [; _. X+ J! m
  May be used in sections :   defaults | frontend | listen | backend
5 g( c: J+ T; n) A) S/ u                                 yes   |    yes   |   yes  |   yes
' S- ]0 R* @' ^9 d& O! j+ Y1 x  Arguments : none
: O, U; h( S% |$ g    当声明了 "option http-server-close" 或 "option forceclose", haproxy会在给server的request头中添加 "Connection: close" 。然而有些服务器看到这个头,会返回未知长度的response,并自动避免chunked encoding,其实这是不对的。它会阻止haproxy保持客户端长连接,还会使客户端或缓存接收了未完成的响应,却认为响应结束了。
& B$ [( G7 ?, |  S; X0 Y8 q    设置 "option http-pretend-keepalive", haproxy会在服务器端保持长连接,服务端则不会出现前面的问题。当 haproxy 获取了完整的response, 才会以类似forceclose的方式关闭服务端。这样客户端得到一个普通的响应,连接也在服务端被正常关闭。
% z' n% ~) _* M% q9 I1 z& R    建议不将其设为默认值,因为大部分服务器会在发送完最后一个包之后更高效的关闭连接,并释放缓存,而且网络上的数据包也会略微降低整体的峰值性能。但是启用该选项,haproxy会略微少做一些工作。所以如果haproxy在整个架构中是个瓶颈,可以启用该操作,以节省CPU。3 @4 U3 [9 r: k# H# `# \9 p) w

& B' f5 ~0 X' c  J& A3 R     这个选项可以设置在frontend或backend上,只要其上可以建立连接。这个选项可以与 "option httpclose"结合, 使服务端keepalive,客户端close,但并不建议这样做。
( g8 c6 _/ N9 C- s1 c! l; w0 Z% ]9 _  C

; G  @9 ^' ?* `; D2 @4 g2 B) {5 j9 }* p9 b1 e, \4 J
balance <algorithm> [ <arguments> ]' H- }# u3 s2 V& y4 l1 R; ^4 ^
balance url_param <param> [check_post [<max_wait>]]) r- r" y& O: h+ F% s9 T+ A
  定义选择后端服务的负载均衡算法# d) S1 t7 y: T) w/ G  Q
  May be used in sections :   defaults | frontend | listen | backend
0 F+ ?& B* O5 L4 i. P4 G) c                                               yes   |    no    |   yes  |   yes5 R3 F9 y# @  c
  Arguments :
8 c0 f8 P! Y/ h8 y$ o6 Y    <algorithm> 是负载均衡时选择服务器的算法,没有持续信息时可用,或连接重定向到另一个服务器。<algorithm> 可以是以下几种:
3 E5 V0 a, f( N, E: f      roundrobin  每个服务器根据权重轮流使用,如果服务器的处理时间平均分布,这是最流畅和公平的算法。算法是动态的,对于实例启动慢的服务器的权重会在运行中调整。每个backend的活动服务器在设计上限制为4128个。在一些大的群里面, 当服务器很短的宕机后恢复回来,有时会有几百个请求被重新整合到群当中,并开始接收处理。尽管很少发生,但是很正常。这也说明了有机会监视它们,所以不必担心。
8 Z2 L8 u. S5 Q" e4 o* ?
7 o( c0 s$ k1 ^. `; b      static-rr  每个服务器根据权重轮流使用,类似roundrobin,但它是静态的,意味着运行时修改权重是无效的。另一方面,它对服务器的数量没有设计上的限制,服务器启动后便会立即进到群中,整个分发方案会重新计算。这会略微降低CPU的运行(约1%)。
8 |/ B* E" U0 f5 x! _" f4 Z, T, j. O$ [/ Q# N% {: s
      leastconn  连接数最低的服务器优先接收连接。Round-robin用于负载相同的服务器,使每台服务器都被使用。leastconn建议用于长会话服务,例如LDAP, SQL, TSE等,而不是很适合短会话协议,如HTTP。算法是动态的,对于实例启动慢的服务器的权重会在运行中调整。
4 n( d/ W, F6 J+ X, [
, B4 ?2 X$ @& j7 @      source    对源IP地址进行哈希,用可用服务器的权重总数除以哈希值,根据结果进行分配。只要服务器正常,同一个客户端IP地址总是访问同一台服务器。如果哈希的结果随可用服务器数量而变化,那么有的客户端会定向到不同的服务器。该算法一般用于不能插入cookie的TCP模式。它还可以用于广域网上,为拒绝使用会话cookie的客户端提供最有效的粘连。该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是算法会根据"hash-type"的变化做调整。4 P' \* U: m" v" |# _& Q
! M3 e" V/ t+ y! R% j
      uri        对URI左端(问号之前)进行哈希,用可用服务器的权重总数除以哈希值,根据结果进行分配。只要服务器正常,同一个URI地址总是访问同一台服务器。一般用于代理缓存和反病毒代理,以最大限度的提高缓存的命中率。该算法只能用于HTTP后端。该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是算法会根据"hash-type"的变化做调整。3 _  l5 O1 ~2 B2 T3 M7 m1 i
                  算法支持两个可选参数"len" 和 "depth", 都是后跟正整数。“len”参数指定算法只处理URI从头开始的字符数,据此计算哈希。因为大多URI以"/"开头,所以"len"最好不要设为1。"depth" 参数指定URI中最大的路径深度,据此计算哈希。请求中的每个斜线为一级。如果同时声明了这两个参数,则截取URI时必须同时满足。
7 r" o/ G" u: Q2 S, @0 b
9 w9 s1 m+ c* G8 t' @/ }( u      url_param  在HTTP GET请求的查询串中查找<param>中指定的URL参数。
* m0 K) j3 e1 L) z                 若使用了修饰符"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被用了,则只能检查第一个块。如果参数值被块边界分隔开,则只能随机均衡负载了。
. z0 L; N' }6 @0 F5 ^                  如果参数后面跟着 ('=') 和一个值,则可以根据这个值进行哈希,用可用服务器的权重总数除以哈希值,根据结果进行分配。
: [& s' r9 h2 w& B! `; D! \                  还可用于跟踪请求中的用户身份,只要服务器正常,同一个用户ID的请求总是发给同一台服务器。如果没有参数或参数没有值,则使用轮询算法。该算法只用于HTTP后端。该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是算法会根据"hash-type"的变化做调整。% ~/ H& S9 W+ W1 z% ^

1 H5 F, J6 L1 [% K! h- `1 E. y3 W      hdr(name)  在每个HTTP请求中查找HTTP头<name>。与ACL函数'hdr()'一样。括号括起来的头名字不区分大小写。如果缺少头或头没有任何值,则使用roundrobin算法代替。                  . J, T6 W6 U" h6 ^; E0 X
                       启用参数'use_domain_only',哈希算法将只用于一些类似'Host'的特定头的主域部分。例如主机值"haproxy.1wt.eu",则只考虑 "1wt"。该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是算法会根据"hash-type"的变化做调整。
8 b  E% L7 b. L/ V( N0 |2 y' O# f4 q& A0 h7 {6 K
      rdp-cookie
# U6 s" ?( k2 ], V- w      rdp-cookie(name)
* w3 y+ _  v3 q, C- a; \                  为每个进来的TCP请求查询并哈希RDP cookie <name> (或“mstshash”如果省略) 。与ACL函数 'req_rdp_cookie()'一样,name不区分大小写。该机制用于退化的持久模式,可以使同一个用户(或同一个会话ID)总是发送给同一台服务器。如果没有cookie, 则使用roundrobin算法代替。
. f  X6 c( N! H6 H* B$ @                  必须注意该声明要生效,前端必须确保在请求缓冲中已经有RDP cookie,所以必须使用规则tcp-request content accept' 和ACL 'req_rdp_cookie_cnt'相结合。
9 L) n6 |% K2 j9 C                  该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是算法会根据"hash-type"的变化做调整。% G% O! Q9 U( x) l. B" F$ \$ g

3 v' z% }0 \& k# ?1 C    <arguments> 是用于一些算法的可选参数列表,目前只有"url_param" 和 "uri" 用到,例如:
8 O9 V# t6 Z8 W& _" r0 ]3 k                balance uri [len <len>] [depth <depth>]
% {9 T2 Q. V4 A1 z' q" x1 M! E                balance url_param <param> [check_post [<max_wait>]]
0 m: f+ R8 d$ F9 Y. M
1 p0 x4 p; j( a6 x5 Y+ A  F- C  如果没有其他算法、模式或选项的设置,后端的负载均衡算法默认为roundrobin。每个后端只能设置一种。& o! L( U" e. B3 T3 s9 s
  Examples :
! H3 p# @8 b2 n8 L5 {( @. r        balance roundrobin0 K6 e1 W; V) L9 R, P$ l% N
        balance url_param userid5 p8 D& a$ _, Y5 L; f, J/ C. c" J
        balance url_param session_id check_post 64# `- u& Q! G  }; S) m" U% y8 b
        balance hdr(User-Agent)
4 f0 `4 e2 q3 ~1 T2 W8 D        balance hdr(host)
, c8 W4 ?  E3 u$ c        balance hdr(Host) use_domain_only( D% w2 O. e" H3 w

3 s$ A1 e) [, g  `+ x  V  注意:  以下的警告和限制是使用“check_post“扩展和”url_param”所必须考虑 :
7 I: T2 ^' W5 t4 z' a# S0 x    - 所有POST请求都要考虑,因为在包含二进制数据的体或实体中,没有办法决定是否会找到参数。因此需要另一种方法,限制POST请求的体中不含有URL参数 (见 acl reqideny http_end)
5 i4 D7 T; V( n( K" u/ I/ ]  V! q* m0 `+ l: f
    - 大于请求缓冲大小的 <max_wait> 值是没用的。在build时设置缓冲大小,默认16KB。
* H: [9 H) j0 V# Q* o    - 不支持Content-Encoding, 参数搜索会失败;负载均衡会改用 Round Robin。1 g8 z, y# e, F; u  W" Z: f
    - 预计: 不支持100-continue,负载均衡会改用 Round Robin。1 ]$ ^+ m: h' \
    - Transfer-Encoding (RFC2616 3.6.1) 只在第一个块中支持。如果在第一个块中的参数值不完整,选择的服务器就没有定义。(实际上取决于在第一个块中定义的有多小)
* k$ H- Z3 t  Z$ d" [    - 该特性不支持生成100, 411 或 501 响应。% x  z/ R0 g' b: O4 Q: d' Q
    -  有的情况下,需要"check_post"只是要查看整个消息体的内容。检查一般会停在任意数量的空格(LWS: linear- l2 M5 i# l# O# y1 G
      white space)或控制符上,表示这可能是一个URL参数列表。这可能不是一个关于SGML的类型消息体。6 ~  x7 f) x6 _- ]; A4 f" x8 Y

/ ?% ?- U8 x, v5 @& V/ D  See also : "dispatch", "cookie", "appsession", "transparent", "hash-type" and "http_proxy".3 r! O7 Y; ~3 }9 [+ w
8 h( }: c& _# j8 s

. `% I* ]& c: o/ @4 ]' y/ ^4 p+ Z- H5 J: Z
hash-type <method>) C6 o/ M6 l1 p4 }8 n4 T1 R& A
  将哈希映射到服务器的方法。Specify a method to use for mapping hashes to servers
+ u% O. O( I: n- H0 f1 E7 _8 P  May be used in sections :   defaults | frontend | listen | backend
& `; g/ z3 k0 m: b: v4 `                                               yes   |    no    |   yes  |   yes
% U  T" Q2 o. P4 L% r- F( j8 P  Arguments :" G2 ^5 p$ G2 f8 t1 I  G3 Y
    map-based  哈希表是包含所有在线服务器的静态数组。哈希结果很平滑,并考虑了权重,但是会忽略服务器启动时的权重变化,也就是说不能慢启动。另外,服务器是根据数组中的位置所选择的,所以服务器数量变化时,大部分映射也会变化。当一台服务器启动或关闭,或服务器加入到群中,大部分连接会再分配给不同的服务器,这对有缓存的实例会比较麻烦。- K% X* ?3 z- n" v' w& [! c

, ]" {" i# [+ Z, Y) v% ?- Z    consistent  哈希表是由每个服务器构成的树,会在树上查找哈希Key,并选择最近的服务器。这种哈希是动态的,支持服务器启动时修改权重,所以可以慢启动。它有一个好处是当服务器启动或关闭时,只有其本身的关系被移除,当服务器加入群时,只有一小部分的映射会被重新分配,所以是一个比较理想的支持缓存的算法。但是根据其原理,算法不会非常平滑,有时候必须调整服务器的权重或ID来获得更平衡的分布。要保持多次负载均衡时的相同分布,服务器ID是绝对不能变的。(roloand:haproxy根据服务器的ID初始化其哈希值)( `8 N2 v5 [# }8 r" F/ E/ {
   默认值是"map-based",建议大部分情况下使用。
6 R* ~" {7 ?) i1 M4 X1 S. y& \2 J) d  q% Y0 P6 L3 f
  See also : "balance", "server"0 G  t3 M  h7 [; ]/ s

" T3 W: ^2 W5 x+ `+ }$ U, k6 \3 V8 u  [
dispatch <address>:<port>. X0 y+ Q$ m) E5 J# \
  设置一个默认的服务器地址$ D* h4 [) ?" b5 l1 j8 F) V  R
  May be used in sections :   defaults | frontend | listen | backend# H5 y9 A2 [; J* d" e
                                               no    |    no    |   yes  |   yes
4 s/ r& ~8 O2 O5 t" r  Arguments : none
+ O" v6 `# s- I; B    <address> 默认服务器的IPv4地址,也可以是主机名称,名称只在启动时解析为IP地址。
% l, M: M) m! L, q    <ports>  端口号,所有连接都会发送给这个端口,但是不允许像其他服务器一样使用端口偏移(port offsets)。! k" B: ?$ m: ?" U
: @% ^: h& [2 s$ h. W% B9 m6 F
   "dispatch"关键字指定了一个默认的服务器,用于无可用服务器时的连接的处理。过去常用于前传非持久连接给后备负载均衡器,由于定义简单,还用于简单的TCP中继(TCP relays)。 建议对于明确的连接处理,应使用"server"直接声明。
# J2 U4 ]" j/ X* S4 C, q$ t
; |( ~6 \1 L3 i8 _% U* H====================
2 A. Y/ z, J) o! k4 l% j
( D. w, f6 e' U( N  |: ]一:Global parameters5 X1 X# W- l' g8 d5 s! _3 d- F
* Process management and security1 e/ e$ e5 Y+ ]1 V5 |* M
- chroot 改变当前工作目录
4 a8 r; C' T% n& |- daemon 运行方式为后台工作* j; z* H4 P8 y- _
- user - group 工作用户和组1 d# J0 f$ v$ z  m
-log <address> <facility>日志输出设备
# n% e! F. w4 |; k- nbproc 创建工作的进程数目$ ~* V/ }1 g" q; y0 m
-pidfile pid文件位置3 C7 {( G" t" H7 x. \8 Z
- ulimit-n 设置每个进程的可用的最大文件描述符* @: o$ s- f6 V, K( U
- stats 创建监控所用的套接字目录* e+ Y* F, v3 U0 J2 h! e. u5 z
- node 创建另外一个节点名字共用一个IP地址,用来识别哪个节点在处理流量
5 Y- \0 q/ i/ ^: |- description 描述实例的名称* c/ S  r6 X, J% ]
maxconn <number> 每个进程可用的最大连接数$ L2 y% f8 B, B0 l/ E( r0 `# n
maxpipes <number>  每个进程可用的最大管道数
: v- h3 q+ M- O7 v: E( Wnokqueue  nopoll  nosepoll nosplice  禁用这些功能# T  c# B5 t- e& m
spread-checks <0..50, in percent>  health check 的时间间隔
2 d: `  }- M; r' Z- ]  Mtune.bufsize <number>
) b# a! p) B2 Xtune.maxaccept <number> ' F( h6 h8 Q1 P5 e9 t# j# \0 L
tune.maxpollevents <number> , B* n2 ]1 o' y! Z9 a
tune.maxrewrite <number> 0 I" O; H, F2 B
tune.rcvbuf.client <number>
) b- x; l$ b1 qtune.rcvbuf.server <number>
: ]+ }0 V* d) ~tune.sndbuf.client <number> : v" F2 E# G  d1 `! x8 g9 J
tune.sndbuf.server <number>
5 X! N% C0 n  c$ L. J& o5 C以上凭字面理解吧
( R7 j1 c3 }7 c7 E6 K! odebug  调试模式,输出启动信息到标准输出1 M! B+ Q+ \" C8 M
quiet   安装模式,启动时无输出6 r1 k8 x- r2 `  A5 x
7 X' J$ b3 d2 ?' R/ y3 E
二:defaults 块
/ X8 h" O! r' x3 z: v, @2 S+ P作用于其后紧跟的listen块,直至下一个defaults 块,下一个default 将替换上一个块作用于以后的listen
/ c) ?/ I! E1 }( `9 ufrontend 块,接受请求的端口组
: w& K# }4 d" D. u& a0 Lbackend块,后端处理的server 组+ g. b7 c. q$ ?+ Q& q1 g  a. `& o
listen块,frontend和backend 块的结合
/ B8 ?. l1 G  C  G" ?2 L7 H9 |: f1 y3 c; F
三:常用配置命令4 l9 N. }; B8 a- Q
+ B  u' Q' f3 p# p9 Y0 T) ]
balance <algorithm> [ <arguments> ] 9 Y  I# w, H- b" Z8 q
balance url_param <param> [check_post [<max_wait>]]   负载均衡模块设置) u/ M0 [4 b; e$ j
8 R& k  ~6 C6 q  h. B
Examples :5 f7 w! a3 Y+ O. V+ A0 }% B7 e
balance roundrobin
8 e- y3 N& D& Bbalance url_param userid  1 A* s$ S+ Z. S3 i" p
balance url_param session_id check_post 64 5 V  L# n# P+ [& |4 \/ p
balance hdr(User-Agent)
0 r  K5 F  i- d$ [9 u: pbalance hdr(host) : d2 }# ?" Q8 J# {3 L  P% L
balance hdr(Host) use_domain_only * T- V$ K& u& Y; _; Z# }0 {
3 o' S+ g& `% i# X6 ?+ @
block { if | unless } <condition>  在7层阻止访问
" l" o5 x; N/ f$ bExample: ( |$ C% n( ^0 H- n5 _2 p
acl invalid_src src 0.0.0.0/7 224.0.0.0/3  acl定义和squid 很像
8 X9 |- @+ _0 X' macl invalid_src src_port 0:1023 $ Y  c6 o: V) C0 O
acl local_dst hdr(host) -i localhost
, k$ R* a6 z- k! l/ M. @) |block if invalid_src || local_dst
. ?1 ]3 m0 Z0 R5 {# X
1 k$ c0 }' `  L7 z; {capture cookie <name> len <length>  在请求和回应包中捕捉记录指定长度的cookie,name 为cookie的开头几个字母
) S( Q; j) U0 e( X" T) S
$ r$ l8 i4 G' A% f4 |) SExample:
4 I+ r2 j' h3 ^0 M# v( t6 i& mcapture cookie ASPSESSION len 32
- d- D: @3 S4 ~6 p4 e3 H1 H) N8 s- D' [7 A* y
capture request header <name> len <length>
. [. e" `" ~' `- U& l" _- Fcapture response header <name> len <length> 同上
* L$ G$ g$ }: ~9 f
  q, S" L) L% j/ k8 O8 Jclitimeout <timeout> (deprecated) . H$ R! F3 i3 j) w0 e
contimeout <timeout> (deprecated)  客户端超时时间,不赞成设置
+ P# ^. Y$ t9 I* {% v/ m* j: O% O0 [+ s
5 b, S. O( w' t' _3 u$ |cookie <name> [ rewrite | insert | prefix ] [ indirect ] [ nocache ] [ postonly ] [ domain <domain> ]*   允许持续的基于cookie 的后端连接
6 ?1 m9 ]5 B: i, O2 Y
! j" G# @! o1 c, G8 y0 M: Bdefault_backend <backend> 默认应用的后端
( J; V- \5 D. h$ D& }
/ P1 L4 ]7 s+ G- Q& G, tExample :
  H; R; I% H# r+ L# s0 Y+ o* l$ s- uuse_backend dynamic if url_dyn 9 u8 t% h/ h2 m' M3 B. o
use_backend static if url_css url_img extension_img . H# W6 |! O0 \4 X% }
default_backend dynamic    当没有匹配时就用dynamic& D% T: l( y% {3 y+ I& _
& W6 S, U& J8 a3 a% A
errorfile <code> <file> 定义出现错误的代码的返回页) ~' U! v0 g8 Y8 v
Example :
# `4 ^( `' x, G) }' ]errorfile 400 /etc/haproxy/errorfiles/400badreq.http " N- a7 B; l9 O6 w$ u
errorfile 403 /etc/haproxy/errorfiles/403forbid.http 1 y' U8 f* |$ ^* ^. m
errorfile 503 /etc/haproxy/errorfiles/503sorry.http
. [! A, c' o  j& R* j0 h
* q& R+ m# w1 D& ^9 x, g; H4 U- Z) |* w9 |) {3 W
errorloc <code> <url> errorloc302 <code> <url>   出错重定向到指定url
2 v6 c) |5 P) L- d& s* V/ K$ Hforce-persist { if | unless } <condition>  在特定条件下,强制继续连接down 掉的服务器后端
5 K" Z$ E# p" s9 C) ], Jfullconn <conns>  定义后端组的最大连接数
4 T$ n1 x6 ?2 p2 ]# S( Ngrace <time>  haproxy停止后,再持续多长时间用于处理连接, }: L7 e7 n. A# J; a9 \, Z
http-check disable-on-404  如果后端检测返回404,将不再把后端计入负载均衡
6 N9 \1 N- f* R$ {" R) Hhttp-check send-state 允许haproxy 发送 X-Haproxy-Server-State1 W; c. O* j. K6 Q7 F; X
http-request { allow | deny | http-auth [realm <realm>] } [ { if | unless } <condition> ]   七层访问控制$ H9 k5 S8 M  S8 C. {
Example:3 @& {1 z( U# ~7 G1 X) X* V
acl nagios src 192.168.129.3
3 ^6 s7 }# o4 X2 c8 O; pacl local_net src 192.168.0.0/16
5 J, }) Q" m% Oacl auth_ok http_auth(L1)
* B3 D3 c! h7 ?" o
* }/ ~1 V+ T# _  @1 j  X) ghttp-request allow if nagios! T+ ?$ [" U( B7 r
http-request allow if local_net auth_ok
; O1 x: y: f9 M  Z: U0 i* p! ]! U3 q& zhttp-request auth realm Gimme if local_net auth_ok
( O( {; b9 C# z, q) i& o- k7 whttp-request deny& }7 Y8 [4 Q; k4 M! s' a. l. b

& ]& q2 t  D5 ~% `1 m( R- `- ]Example:! b8 u1 B0 }  i9 {- b) i3 l" J
acl auth_ok http_auth_group(L1) G15 Z7 k, V$ {8 V, D, K, }
0 `* A9 p& z% n  ]- v- N2 M
http-request auth unless auth_ok: y+ D% z* t  o5 W' @
) h0 x9 }; L# {" I% W* E! C  G3 `
mode { tcp|http|health }   设定启动的实例的协议类型% z* |: \9 E7 \& d: E6 s
monitor fail { if | unless } <condition>  监控失败条件设置/ I" N2 R+ l6 `$ e

3 q" N: ?$ j. G% O$ @6 Qoption abortonclose 丢弃由于客户端等待时间过长而关闭连接但仍在haproxy等待队列中的请求
6 B1 h9 O# v- }- W4 _option accept-invalid-http-request  接受无效的http请求,建议关闭(开启可能有安全隐患)
: `2 l; s6 l, [9 p& p" \8 Qoption accept-invalid-http-response 接受无效的response ,建议关闭
8 K: B4 Q( U# u8 v9 r; Foption allbackups  应该是后备服务器,如果正常的后端无法使用,就使用这些后备的设备,balance方式还是用原来的,没有优先的选择,常用来提供错误的页面" i$ |! C' }  s$ }1 [) Y; F
option checkcache    分析后端response,阻止可缓存的cookie,它对response 进行严格检查,包括"Cache-control", "Pragma" and "Set-cookie" ,查看在客户端代理那边保存是否有风险,如果这个允许的话,符全以下条件 的response 将被允许,其它的将被阻止。
/ U/ C$ H9 a  A# ~8 o, C- all those without "Set-Cookie" header ;
$ Y# a" X0 j% C$ j% ^* {- all those with a return code other than 200, 203, 206, 300, 301, 410,* b6 F/ t) I7 a) Y
provided that the server has not set a "Cache-control: public" header ;
( W! q- d6 {9 n# X( G2 @: I: e- all those that come from a POST request, provided that the server has not
7 ?: ~% h6 e. W6 hset a 'Cache-Control: public' header ;5 U2 |4 W9 w8 S# H
- those with a 'Pragma: no-cache' header2 h& m. Z. O: F4 }
- those with a 'Cache-control: private' header
! J2 `' ]" N$ D' {- those with a 'Cache-control: no-store' header
% p% L$ O& w: t5 d8 e3 f& y; }" Y- those with a 'Cache-control: max-age=0' header. o- p4 n8 ?1 y
- those with a 'Cache-control: s-maxage=0' header- S% ]$ X) K# [+ h" o
- those with a 'Cache-control: no-cache' header
, p6 t. a6 @% L, P$ G4 g- those with a 'Cache-control: no-cache="set-cookie"' header
* j. \2 x- ^- t" t; v- those with a 'Cache-control: no-cache="set-cookie,' header
9 o5 d! A! x+ S(allowing other fields after set-cookie)4 _0 ^( n) H  s# H- l) r( V: g
4 w# N! f( w% S, D1 `- V0 D" A8 R
option clitcpka   是否允许客户端发送tcp keepalive 包,这个和http 的keepalive 没有关系
  i& r3 I$ m  C, ]  f* M2 z) y8 zoption contstats   允许连续的流量统计更新
% `! Q4 m" W7 G: A: x. a1 \- ^option dontlog-normal   开启正常连接的日志9 p$ D/ v) C/ X- k7 o/ y
option dontlognull   记录空连接1 ?( {/ {1 @3 ~5 `' [2 n6 f
option forceclose  允许关闭session 在后端把response 发送后
& x1 e! U5 m5 v3 ?option forwardfor [ except <network> ] [ header <name> ]        允许在request 中加入X-Forwarded-For header 发往server
+ J( T9 ~% x9 U0 U; Q# [: h* k, k  qoption http-pretend-keepalive    定义是否haproxy要宣布同server keepalive$ r$ K: I9 j" P: T- N* N
option http-server-close   是否开启在server 端 connection closing& J# z$ i3 w$ z8 T
option http-use-proxy-header    用non-standard Proxy-Connection 替换 connection* F: |5 [/ a5 W* i

# u' k, ?  r, t
6 G- e7 z6 x- b" E" R* C) R% s1 t8 O3 |option httpchk <method> <uri> <version>  允许用http协议检查server 的健康
  Z7 e& i  P& k  H; T, K( BExamples :& [: ?! W6 ]* `+ f" q7 u3 F
# Relay HTTPS traffic to Apache instance and check service availability
# I& G* `. i0 x0 y( h# using HTTP request "OPTIONS * HTTP/1.1" on port 80.
. p6 }+ S: {, C1 u6 q3 Ubackend https_relay7 ]9 H* @: J$ z8 W
mode tcp( D9 T7 x, i+ q% W/ ^2 D
option httpchk OPTIONS * HTTP/1.1\r\nHost:\ www
+ w4 H2 k& u3 y5 Qserver apache1 192.168.1.1:443 check port 80# E0 s* }/ `2 k- @+ S% O$ s
8 r9 l4 G' M/ m( {7 s% }. N4 @
option httplog [ clf ] 定制日志格式
" p( \- h! J; D, z# _4 Yoption http_proxy  开启http 代理模式,只有最基本的代理功能
$ v0 F, k  [2 z; j3 e( T2 Ooption ignore-persist { if | unless } <condition> 在某条件下拒绝持续连接,适用于对静态文件的负载均衡
3 N7 ^4 h3 ~: m' I: j7 Koption independant-streams  启用双向超时处理,如socket 的read 和write
* N5 [/ t* M7 coption log-health-checks   记录健康检查日志" V. a3 P9 [; x9 ]6 l
option log-separate-errors   对非完全成功的连接改变日志记录等级
- |$ U7 `4 R+ o& W' r, u, \# a* roption logasap   大传输大文件时可以提前记录日志
% }8 E8 E5 ?0 ]option mysql-check   mysql 健康检查
* E& X+ }- r* V3 O3 v& T+ f. Goption nolinger  清除肮脏连接后开成的tcp 状态及占用的资源,不过并不是强列要求你用这个选项,当然如果你有thousands of FIN_WAIT1 sessions on your system ,那肯定得用了
/ W6 Q& s2 D9 Ioption originalto [ except <network> ] [ header <name> ]   允许在requests中加入X-Original-To header 发往server
: I& |1 a: Q6 o# r3 s/ V# B; Ooption persist     强制将http请求发往已经down 掉的server# z! Y( q6 O5 m' C- P* @; L
option redispatch   是否允许重新分配在session 失败后
4 `3 @6 C  F% woption smtpchk   smtp 检查# X7 o# y8 {& m6 U5 b
option socket-stats  允许对单个socket进行统计. ^. F" Z: C& I) c0 h
option srvtcpka  是否允许向server 发送keepalive. ^1 n6 [/ S5 F6 I$ |7 X
option tcpka 是否允许向server和client发送keepalive$ \5 K( a1 h' h! b* q0 X3 t" X
option tcplog  允许记录tcp 连接的状态和时间
; P8 H, x, m- U; c8 G+ u9 boption transparent   允许客户端透明代理4 V: i9 i- w" c6 M" i; D4 m
rate-limit sessions <rate> 设置frontend 每秒处理的连接的上限,如果到达上限就停止建立新的connection
& i1 p7 B+ x7 E1 [: z  f* n" ?$ W) [( t+ j$ V0 R' j* F7 i8 o2 G9 ]
redirect location <to> [code <code>] <option> [{if | unless} <condition>]1 W# U9 O- A$ _8 c3 v  X
redirect prefix   <to> [code <code>] <option> [{if | unless} <condition>] 重定向,相当于rewrite
( E: |8 B3 H  I$ B6 `8 l5 q  S
/ g( I0 ~4 S. D) @& L+ K" hExample: move the login URL only to HTTPS.
4 h# D$ j1 \* Y; r, Wacl clear      dst_port  80, `. U1 h0 m; m
acl secure     dst_port  80803 Y- w8 S! D: s+ y8 ?6 B
acl login_page url_beg   /login6 s* K+ J1 ~1 {
acl logout     url_beg   /logout
; g2 c7 [( N9 aacl uid_given  url_reg   /login?userid=[^&]+
2 P& A0 E; C# {0 C$ c$ @  Aacl cookie_set hdr_sub(cookie) SEEN=13 i* ^5 O( c7 {2 F& e/ r% H

6 [' `5 J! i$ credirect prefix   https://mysite.com set-cookie SEEN=1 if !cookie_set
! Z( U" n% Q' e$ u9 N+ U0 Zredirect prefix   https://mysite.com           if login_page !secure3 Z0 }: y4 c7 E' f* `4 {0 u
redirect prefix   http://mysite.com drop-query if login_page !uid_given( ^3 H  a0 s3 S3 P
redirect location http://mysite.com/           if !login_page secure4 k4 _2 V0 ~# {* u/ |
redirect location / clear-cookie USERID=       if logout
- N, l& F. ?! U1 O$ N& A$ R) I2 q( m( S. K6 l7 b! H
Example: send redirects for request for articles without a '/'.
' q' T, L# J  n/ Z& tacl missing_slash path_reg ^/article/[^/]*$
: p, S# P- ^. Vredirect code 301 prefix / drop-query append-slash if missing_slash
0 y; n! a) g- eredisp (deprecated)
# M" q2 j, ~' h( Iredispatch (deprecated) 开启session 重新分配在connection连接失败后,不赞成启用
. G+ {# U; {5 ?2 x9 I4 Jreqadd  <string> [{if | unless} <cond>] 在http请示的末尾加上string
/ N3 M, A' J; e# v8 j1 F+ s! n
, [; K/ g8 B; ~# X$ d- o9 i8 K# ^/ LExample : add "X-Proto: SSL" to requests coming via port 81/ ~  K3 ~$ o) L* t9 D* I! T) ?
acl is-ssl  dst_port       81
! @7 G  h; {* s- lreqadd      X-Proto:\ SSL  if is-ssl
3 @7 C. Q/ A2 m" V  Y2 @3 C" |$ P
5 A6 U) R- ], C6 b- yreqallow  <search> [{if | unless} <cond>]  w# g+ N! c0 a3 v. B8 _6 V
reqiallow <search> [{if | unless} <cond>] (ignore case)    request 请求访问控制6 ~9 j9 u* W: k2 k0 j% b, l

6 F' Y' O' Z9 y* j/ A( o5 UExample :
/ A: b5 V% O6 G1 {- o# allow www.* but refuse *.local
( |1 O7 j* O! R; {reqiallow ^Host:\ www\.
7 z6 v3 e9 x6 f1 o! x' I6 J' o/ S% nreqideny  ^Host:\ .*\.local6 @, X# t' J3 {5 c8 I& }

; Y6 I8 H! k; D4 Creqdel  <search> [{if | unless} <cond>]4 R9 l0 R, ~/ ^  W% A- \
reqidel <search> [{if | unless} <cond>]  (ignore case) 删除请求的head 中的内容
* D! V1 b/ i) e$ |" c( M3 o$ d/ m) H1 R3 F" w; M# k
Example :1 r' f/ O) x1 p: J0 n
# remove X-Forwarded-For header and SERVER cookie
1 M- ^& a' K8 t( x4 m- G: Hreqidel ^X-Forwarded-For:.*2 P- {: [6 D) j) ], {
reqidel ^Cookie:.*SERVER=* y* J$ i3 G0 ~
* \1 \" T$ }% S  ]8 [7 ]4 L

! b$ P+ g4 }# V- Z* G/ Wreqdeny  <search> [{if | unless} <cond>]
  I% l  F* \( Z9 t) Creqideny <search> [{if | unless} <cond>]  (ignore case) 拒绝访问
- ~/ l2 f) O2 \  q( j- {, P) d/ I2 {" ^% @) e, S4 t$ _1 b: ^$ p3 A
reqrep  <search> <string> [{if | unless} <cond>]) Z0 [# R% V; }$ c% @' z
reqirep <search> <string> [{if | unless} <cond>]   (ignore case)  request 请求替换
$ r8 x) M; v; x7 h% XExample :- F, {3 _0 g4 x5 \; D6 `+ y2 q
# replace "/static/" with "/" at the beginning of any request path.
0 X: |% |. ?3 X/ X+ O1 [reqrep ^([^\ ]*)\ /static/(.*)     \1\ /\2( v! r& T& g0 C$ J
# replace "www.mydomain.com" with "www" in the host name.
" p6 {; \7 F0 G% |& |  b& a' f5 B" ]8 ureqirep ^Host:\ www.mydomain.com   Host:\ www3 |8 `) T8 i  h3 j% b

' ^+ A  |; [$ Kreqtarpit  <search> [{if | unless} <cond>]
3 F% R. s6 t- E1 X) H# c9 Greqitarpit <search> [{if | unless} <cond>]  (ignore case) 阻止http请求中的某些信息2 q7 r0 u8 s9 y& P" w

9 v" ~& x& U1 j0 c( P$ P# AExamples :: Y+ t' j& ^& t, F5 \+ h
# ignore user-agents reporting any flavour of "Mozilla" or "MSIE", but! B$ b& J5 Q( {4 d
# block all others.
. B9 w# L9 W6 R& U+ X" n) P( Preqipass   ^User-Agent:\.*(Mozilla|MSIE)
/ P6 a3 S* x! z/ Xreqitarpit ^User-Agent:
( x! A( i4 i2 z) r7 N9 s+ Y9 |9 h* H. F7 @" @( P" W
# block bad guys8 X9 F/ w% _6 }: q& J6 \
acl badguys src 10.1.0.3 172.16.13.20/28/ c; {" R& p& w8 P* J+ j5 @
reqitarpit . if badguys
8 q- H  g" r1 q- y0 S2 P" q2 m6 E; X
retries <value> 当对server的connection失败后,重试的次数
( s" F  U0 d1 N) F7 j6 F5 S+ W# p8 prspadd <string> [{if | unless} <cond>] response 增加信息
8 r% ]8 ?- F' ]1 d- V6 f0 C/ erspdel  <search> [{if | unless} <cond>]
9 R. i; ^' @" f- J. }: \rspidel <search> [{if | unless} <cond>]  (ignore case)4 u% ]3 Y: a: j' T
rspdeny  <search> [{if | unless} <cond>]
4 O  @) ~! I/ orspideny <search> [{if | unless} <cond>]  (ignore case)
4 r0 V( O" y: }5 X  D- ?% {4 |5 B6 Lrsprep  <search> <string> [{if | unless} <cond>]
! t) c9 G- ~3 a& Krspirep <search> <string> [{if | unless} <cond>]  (ignore case)
7 L  z+ h9 X1 W- f8 D以上和request 的差不多, S* d' {- S- I* E% {" Q5 M
4 v# t3 j& R" [0 ]" s
source <addr>[:<port>] [usesrc { <addr2>[:<port2>] | client | clientip } ] 定义从代理出去的连接的对象,用于限定地址可以访问server/ @" l! t4 U# x- G

0 s/ {0 i0 D  \, ?5 X0 K一些timeout1 h* `/ q/ B! ^/ s

0 V# l* d/ E# [# T6 E6 G/ Psrvtimeout <timeout> server 处理超时,不赞成设置
  P1 F4 s0 u7 L( Rtimeout check                             X          -         X         X0 t/ O0 k: ^" J
timeout client                            X          X         X         -
4 d& y# f" t$ S% V  Utimeout clitimeout          (deprecated)  X          X         X         -
* x0 f: R  R& T5 h( W# F0 V$ ttimeout connect                           X          -         X         X) p/ b/ A) e0 W! K9 n0 e
timeout contimeout          (deprecated)  X          -         X         X
3 P$ h) ^% @' Htimeout http-keep-alive                   X          X         X         X
4 U' O5 o+ L( T/ e* S8 Btimeout http-request                      X          X         X         X1 y5 j+ N7 E3 H. D' c; d" Q( d  `
timeout queue                             X          -         X         X/ a: Z0 x+ d! Z+ K) H# V4 s! n
timeout server                            X          -         X         X
( p) \  c5 o, M1 V! n! qtimeout srvtimeout          (deprecated)  X          -         X         X# w' m$ k$ a! A" M. k$ s- P+ U! Z
timeout tarpit                            X          X         X         X* c3 h& |+ b; ]3 I& Y% B( h8 S( p
' r9 ^' u) V4 u. c: p2 }2 e! h
2 n8 H  |, B, [  d2 O  s' m
stats auth <user>:<passwd> 监控统计的帐号和密码4 e. _* W+ l+ w; E+ N0 R; P* Q2 Q
backend public_www
% C+ h7 l* Q4 l4 _/ K: F6 X7 Xserver srv1 192.168.0.1:80
/ Q/ w. d" y# X7 r% pstats enable
  J  s( t- Q) ~% M$ B" Cstats hide-version
5 _/ J+ l: L" Xstats scope   .. T# k% Y5 v- Q# n0 i, e7 w! g8 H
stats uri     /admin?stats4 Z. x( ]) f3 Q! h
stats realm   Haproxy\ Statistics
) P& o+ _" n% x' y8 p  dstats auth    admin1:AdMiN123
1 X- B/ Z3 @5 `- P5 |stats auth    admin2:AdMiN321
8 b* M7 P# v# W2 Z  O2 @+ B/ g! v
) S% t, `: i; B" v3 m9 Q, @# internal monitoring access (unlimited)
& h* S4 j2 f2 d( g4 Kbackend private_monitoring
  [; P  P7 d: _( ustats enable: \4 S- S: F7 m7 C$ Y& n  B
stats uri     /admin?stats% }6 l- P% Z; H6 g3 }* Q5 s# z
stats refresh 5s
6 @0 }8 S6 |/ _3 R
! ~9 A4 }, E' B4 _# H( q还有很多参数,以上能用到的也没有几个,只要满足当前需求就好,对于性能要求高的话,建议把不需要的功能 都关了吧.% A- y0 O% \9 {" V7 r3 e( o5 d

0 c# a4 f& R, e/ r  e8 n: \  N0 A====================
- Q! \8 B$ B+ r3 K+ G2 r% T9 V6 h, H/ X2 m# F
HAProxy的配置示例, `" Y7 _4 Y7 e2 Q" y" R

$ I& H9 t  {; Z( i$ j, mHAProxy配置中分成五部分内容,当然这些组件不是必选的,可以根据需要选择部分作为配置。
: W+ M5 ]' b: q  o3 _' oglobal:参数是进程级的,通常和操作系统(OS)相关。这些参数一般只设置一次,如果配置无误,就不需要再次配置进行修改2 M" h. B6 [; {
defaults:配置默认参数的,这些参数可以被利用配置到frontend,backend,listen组件2 X# d- a; F; K7 E9 f' j( I2 Y
frontend:接收请求的前端虚拟节点,Frontend可以根据规则直接指定具体使用后端的 backend(可动态选择)。; y( n8 X& b& g$ Q* `. }+ [
backend:后端服务集群的配置,是真实的服务器,一个Backend对应一个或者多个实体服务器。
& U% ?  ^2 K3 o$ m+ t" {listen:Frontend和Backend的组合体。; [# s/ j' ~6 }" o9 Z

% O$ r& c3 {  G5 R下面是HAProxy的一些常用的配置,这个配置是用来说明HAProxy的一些常用功能的配置,具体详细配置请查看安装目录下的doc目录下的文档文件,或者到http://cn.haproxy.org/下载中文配置说明文档, R0 E! x3 {8 s
' S# T! D2 d$ x1 O
配置具体实例,后附说明:+ `* I7 B% y) f% v, v

& a1 n. x& v$ e  Sglobal2 Q* q7 u. i4 S2 C; r& l
) y" g9 w5 b/ s
#全局的日志配置 其中日志级别是[err warning info debug]9 v8 r" [) u# S$ B+ J6 T

; J' {* b* e' [- k( b1 ]  i) J, h#local0 是日志设备,必须为如下24种标准syslog设备的一种: & ^9 B  G( H3 B  }  x; z

# b! N8 h0 `( @  d8 z1 z#kern user mail daemon auth syslog lpr news
/ {! n6 V1 P) w: s7 S. F  r$ o( q  r! r2 q% o) I7 E/ d8 Y$ E/ Z
#uucp cron auth2 ftp ntp audit alert cron2 0 Y1 X; {) C! _; E4 J; y2 B% k

4 _" |, w1 q! z5 m# O" Z! x/ W#local0 local1 local2 local3 local4 local5 local6 local7
' [" [' c3 P+ l
8 s' u1 g; s6 W5 D% W# o#但是之前在/etc/syslog.conf文件中定义的是local0所以
( u9 L) [1 Z* ~! H2 C+ A+ j9 K
% g( T) S0 w1 n; O5 D  r* x#这里也是用local0- F% M  L3 U- a
/ |; k, g6 @4 V/ X& c
log 127.0.0.1 local0 info #[err warning info debug]- d1 Q8 u) |" p  P) B/ S

* c: {7 f# r& b8 `#最大连接数
: `& K: \6 D: F! i
& p* _0 o) k& V9 \maxconn 4096
1 \# r( j- `2 e- d
8 D% R$ Y3 U% |( P" I- ^#用户0 U# n6 H  @+ B) c2 a
2 T; f0 q; A: e, ?7 o
user admin
. G7 h( u0 {8 e  f" Y7 _: J' j- T
#组$ q) K" K" b& s% q. }/ b+ B- p

' I$ i! ~1 s( r6 Y4 l* f9 ?% G7 ogroup admin
7 f2 `* J' h6 q7 J6 y# }
  O3 O, g* u; b1 q#使HAProxy进程进入后台运行。这是推荐的运行模式) F% \! _9 T* H5 b6 n: V+ Z, I5 ~
9 S* Z+ i& r5 L2 M# H: C( j3 i
daemon
0 t- A3 C% n: @- x! t2 t3 Q: [  M4 U, g- \: g6 S- r
#创建4个进程进入deamon模式运行。此参数要求将运行模式设置为"daemon", t+ m; Y( [+ ~& F' t. k& v5 K6 ~6 a

. X! P4 i) \3 x1 R4 M6 O/ T# Onbproc 4
) j) L0 i* }. T0 }# D* }: d$ q
+ E/ M+ g- Y* {& I6 c! ^. ]$ Q#将所有进程的pid写入文件 启动进程的用户必须有权限访问此文件。3 a$ _8 [* U: c: D, y. B) I, d3 r0 R
; o" {: X' c4 V. `0 Q4 [+ y
pidfile /home/admin/haproxy/logs/haproxy.pid  m2 ?0 p9 k6 w: `, t3 Z7 _
& r! y6 D' j8 C) Z4 l
defaults
: t) F( b  K6 I; [/ |1 }) c2 x& p; z4 I) n; B
#默认的模式mode { tcp|http|health },tcp是4层,http是7层,health只会返回OK
3 K- R& n6 b0 \( H7 I6 |; x. e; ]1 ?1 [- {' y( r' }
mode http% t: P& q3 B! {% G

7 o1 G) W7 A/ R' [; ^9 a( G#采用http日志格式& H& K: u6 h/ s* T
% I5 k  w. K6 G% p5 l
option httplog
& N" u9 a, b9 H- p8 s: Z9 J3 s) U* ]# X/ p# z5 H- b/ g2 N
#三次连接失败就认为是服务器不可用,也可以通过后面设置" r1 K, ^+ _0 w
, I' ~7 y4 y/ Z
retries 30 O- ^) S* v, d. b9 t1 `

5 J8 N% w9 z9 b' `! T- S, o如果cookie写入了serverId而客户端不会刷新cookie,
! o8 {" @5 ~5 d8 q5 k7 |. x
" v: Q% I, G) I6 b" h: u3 {) @, Z#当serverId对应的服务器挂掉后,强制定向到其他健康的服务器9 r" Z; |( t! ?( j0 I

) S5 ~4 d, n! A: Roption redispatch5 W3 E+ L+ \( Z. T, H. M

- u3 ]9 U# Y; `; E#当服务器负载很高的时候,自动结束掉当前队列处理比较久的链接
9 N) u3 f; \: m8 H2 f* v  }, I* ~  }) D( d6 }! K5 j! I; r' m, ]6 c3 c* C5 b2 W
option abortonclose
- ]+ e8 G& N2 F7 ~4 w: K
6 x2 K5 a- p7 X8 _! g% D6 X! S#默认的最大连接数3 y  z5 b$ D; x; k5 x

4 w! O$ f! g: ?' T* ~8 Tmaxconn 4096
& z( P" R! d: Z& R2 {. i! {; B, D# H, g! x
#连接超时
/ [0 n5 ~/ t/ N* |" A. U& R/ m; h1 R! J, l% a. @8 D8 g
contimeout 5000; u, q6 A! W- }* z( N& P

- ?; e- E9 U. D# a( P# r/ l3 k#客户端超时5 F0 ]$ Z1 ^) V2 a

2 V0 G+ H% _" A/ V( s5 n7 M& z9 Lclitimeout 30000
6 R. N- I; H/ s: {( `4 e1 {4 H6 Y: _+ V4 q8 }# ~
#服务器超时
6 H+ z0 @8 [  n# }5 f; Q' N& ?
9 j& \4 m; m5 R) ?6 |srvtimeout 30000
" A/ }# w. x8 C+ m5 g6 W7 P( [; Y! R2 U
#=心跳检测超时4 `# P2 b6 H# w* A2 x6 Y2 p9 t

6 Y) F: j, Y5 c* C! C2 u; X; Btimeout check 2000
' n8 s, {" O. l$ s+ }! {# `$ W; n6 T2 D( F4 I9 V+ y; Y
#注:一些参数值为时间,比如说timeout。时间值通常单位为毫秒(ms),但是也可以通过加#后缀,来使用其他的单位。0 T' c9 Z* L6 V7 g: ^

0 S# i& q* v" Q; G% K5 a#- us : microseconds. 1 microsecond = 1/1000000 second7 m$ k# ^# z$ ?$ w

. X7 z6 w+ T' J1 P; n5 Z0 @. K! d#- ms : milliseconds. 1 millisecond = 1/1000 second. This is the default.
. d) M: e  u: l# i& v/ s1 i/ d; u7 a
#- s : seconds. 1s = 1000ms
& }; S7 u  P  U- n0 h# j8 ^3 v: N" {9 v8 T3 @1 k% [
#- m : minutes. 1m = 60s = 60000ms  O3 V, Y4 r, X3 r

0 w! w. @; L; T2 f$ `7 D$ D#- h : hours. 1h = 60m = 3600s = 3600000ms6 D+ E  r5 j1 g( W& t9 _

9 S' s* p/ X. h( h3 M9 C#- d : days. 1d = 24h = 1440m = 86400s = 86400000ms1 N& h) H, _2 ?# s, A7 {5 g
" ~7 ^+ s' ]+ n
########统计页面配置############
) Z+ k+ g/ H' ?' U% I2 h- h
$ ?+ P$ z# q& X2 @' wlisten admin_stats
9 S2 w' A: J' }" }2 ~- S
; W0 n  g# C+ B6 L2 L#监听端口& }& B* `0 f) n+ ?: Q3 D$ i, c
2 l- a8 j' g( M2 J1 ~# ~
bind 0.0.0.0:1080' E% e" m( i7 ^0 D; |+ B+ i5 Q; Q1 j
/ \) k1 \) I1 ]) r1 x
#http的7层模式2 N& q. p# b* G4 L
5 a) s- T6 N; u  R+ `
mode http" V& ]: n3 U! u) \7 Y/ Q' I

& q7 s; _. L- m1 F2 l3 f#日志设置* r# r  ~5 S; h0 O+ M

! G, g9 M5 w% F9 k$ a5 qlog 127.0.0.1 local0 err #[err warning info debug]8 W- z5 R" B6 \. k5 {- }- R' x+ S
0 u, y8 Z( s" S, f" b
#统计页面自动刷新时间
5 ]& Q0 o. y' H/ ~/ b; M
4 E" B! Y# q4 c! a: V! y6 j& i; fstats refresh 30s
* X( L' W& D% z6 L& A- L8 U% M" x2 U$ Q) T" k; J0 S" R) \
#统计页面url  l" E1 p. P& M3 y% `+ p
, B7 k/ w9 H( G1 S2 d8 \9 c$ V
stats uri /admin?stats4 R3 y# ^0 i' s  n: ?6 [# k) A

8 D2 Q3 |. x" x" T1 l; k' p6 H#统计页面密码框上提示文本% n! a, a5 I4 K* i) V  B
4 _- E5 ?6 M5 X3 g
stats realm Gemini\ Haproxy- O# r" u: _; R! }& Y/ \1 R
8 |; m) w% N2 R3 X$ o4 v
#统计页面用户名和密码设置
: t% Y( i% Z- W/ T( \1 _5 \
0 L0 E% R) G/ j3 jstats auth admin:admin3 s0 e6 a4 k  z. C
9 M# H( c* H6 z0 D+ @
stats auth admin1:admin1
, l6 A. o1 N+ V# U6 m! A3 `. }2 g9 r
#隐藏统计页面上HAProxy的版本信息
! N( R2 t+ Q) e+ f3 O
3 K) v# u2 U8 P& |; ~  Qstats hide-version& Q/ [& V3 u  ^8 \

5 k+ J4 I4 N* v  x% q#######网站检测listen定义############; w8 l# C- i( }; Q

8 N0 D. b( ^1 R) m* Mlisten site_status0 y+ H; ~! b- J9 S" i' x' B9 [

3 j* I8 D0 t! r% T5 ]8 @% K& ebind 0.0.0.0:1081
" O7 H  D- s& s) u0 s7 E
3 f: {7 z0 p1 X7 M$ lmode http
+ ?; [7 `1 G+ F6 {! r& ^" N$ z# R8 M
log 127.0.0.1 local0 err #[err warning info debug]  P6 K4 n3 E9 J& e8 ?0 X

9 ^1 s4 e( @' `#网站健康检测URL,用来检测HAProxy管理的网站是否可以用,正常返回200,不正常返回500
( q, Y; K! e4 D" z# m' F& R1 \* Y3 l- a0 r; Y
monitor-uri /site_status8 W9 }( q5 m$ V1 P( L

! b0 z+ A' B6 J9 |0 Q% ]#定义网站down时的策略1 {. C+ H7 H. n5 o) c" Q, A- k
7 y* q: n/ {4 q8 Y6 D& e
#当挂在负载均衡上的指定backend的中有效机器数小于1台时返回true! x$ x5 k" h9 R1 C, `
' i, t5 U  v% F7 D8 H! q
acl site_dead nbsrv(denali_server) lt 15 K# c# K6 h* ]- A

6 A7 E4 s5 b, V; m3 Xacl site_dead nbsrv(tm_server) lt 1 8 v. d( l% @& V
, N. n0 m& z2 a& x
acl site_dead nbsrv(mms_server) lt 1
  ?$ S- G5 d0 I$ Q5 v8 v/ n' ^, Q
8 K* u9 l0 K( [: D% F#当满足策略的时候返回5005 s1 K$ O/ [! i" @; K7 V' r

* c, x' h; a, `" Xmonitor fail if site_dead' ~+ C, [5 Z8 L5 A
. U% ]9 U& E  ?- t( R; S
#如果192.168.0.252或者192.168.0.31这两天机器挂了# p* q" D- u5 g; [; H+ L9 O7 T  s

8 t! [% t, _: P( ]6 b#认为网站挂了,这时候返回500,判断标准是如果mode是4 a& `! _/ ~4 O% \7 ~3 O

; Z( w0 b! T' p9 ?( W#http返回200认为是正常的,如果mode是tcp认为端口畅通是好的! }& `) E3 k- a5 m' r% N% f

$ ~: T9 O8 ?7 l# H3 m" w3 omonitor-net 192.168.0.252/31+ u% {. n/ t, c$ l9 c) \

. m( E  X1 U0 w4 j8 N3 P+ S########frontend配置############& a4 \) a9 c: v" e2 `4 p0 u/ Z
8 z" @- C6 y; y5 V3 y; s' s& x
frontend http_80_in
5 A0 m1 I. Z! N3 j$ r7 O" U
3 I4 J- R" C; e; z' o9 z, q#监听端口
9 S2 S# R! \7 q, c- m' l1 Y7 N% A9 n* v. s& U1 y" F
bind 0.0.0.0:80
2 p. `7 H6 @3 Z( t
" A, U- c* b* L0 Z1 ^- V* A, G7 S#http的7层模式
% w2 y' P$ C+ p1 s* O8 l/ p1 ^+ D' h- ]5 N
mode http' ^6 G; n1 S" x; k( B, g

" ?& m1 _* k: y0 D1 T#应用全局的日志配置4 _2 a. ?" e- X7 M

7 O0 F, `' t8 m* J' X/ V  W: Blog global
  N4 C" ?2 v! b5 x+ A  I& U! G
. F% O0 V6 l% V' i0 D#启用http的log! j$ w4 T7 j' v. h' ]- \8 J

! C' U5 j0 V; Y  W5 j. n+ Y6 Roption httplog
/ `" L( r4 r/ d, w% O
; o' \, q! w/ S- a( @* N6 h, h9 u8 I#每次请求完毕后主动关闭http通道,HA-Proxy不支持keep-alive模式
! \" V% k  o, r  }; l. X
0 m* p; n2 X- J: ^option httpclose
$ x- @1 s4 Y" e' ?1 c3 b5 V9 l4 \' Q9 x/ n5 i) w
#如果后端服务器需要获得客户端的真实IP需要配置次参数,将可以从Http Header中/ B7 \; X$ X( ?/ R& ?5 W, ~
, t9 q: C  Q0 F/ }. i
#获得客户端IP+ Q, d6 v8 R" N( o4 w

) }7 c& d! I6 Boption forwardfor
; k5 _3 i6 ^+ a7 m; M
+ K: s/ s/ C! e5 X) X$ `) a###########HAProxy的日志记录内容配置##########9 Y! a, {1 a, z! |5 o) x8 ]

' Q* n2 T; X& n  p$ U, Y( lcapture request header Host len 40& k2 e; E& n  T& K" ~  a6 g

7 Q- d2 g- y: Y* o. Gcapture request header Content-Length len 10# h! o2 l; V3 S/ ?, b/ i5 R
3 k( o3 _  t" U  L, a, E9 O
capture request header Referer len 2003 N: t/ [4 {8 W- @* L; b: L9 r

! E5 A  O6 l7 ]3 N  @/ ^capture response header Server len 403 B6 U% g  Q+ F7 Z  Z& q, f
5 X- \3 f. V- `! A  M3 F
capture response header Content-Length len 10
- H4 |; D' [1 Y7 Z2 A' y1 o
! V5 o* E0 N: v) Z1 Z2 Ncapture response header Cache-Control len 8
5 Y  h0 `) J. I* ^' J4 I; T
* y+ @, A, p8 u+ Y; Q% p  P####################acl策略定义#########################/ X5 M# Q. i) J9 l, v

% h3 c% s, s! R' s#如果请求的域名满足正则表达式返回true -i是忽略大小写
, w/ r$ I6 ]( W+ U% t  `3 Q6 ~
4 {- Z% V' I, M7 Y" O' ^acl denali_policy hdr_reg(host) -i ^(www.gemini.taobao.net|my.gemini.taobao.net|auction1.gemini.taobao.net)$
/ J, R& E, Y" N+ ]( F; p1 i* ^& n# R) y2 o" g
#如果请求域名满足trade.gemini.taobao.net 返回 true -i是忽略大小写$ |; p- Z2 ]5 @* ?. s2 ~
3 A4 c0 W, O2 k7 M8 d9 _/ x/ F3 A
acl tm_policy hdr_dom(host) -i trade.gemini.taobao.net+ P+ E5 \, P. C. c9 {+ k

- Q3 H* Y; e0 _##在请求url中包含sip_apiname=,则此控制策略返回true,否则为false5 F' A; a+ K! x' l5 f$ c; Y
  M$ O0 {7 Y6 \& r
acl invalid_req url_sub -i sip_apiname=) q9 U# t- t9 Y. h

5 M. b# q) H2 Y9 z- }  f" v##在请求url中存在timetask作为部分地址路径,则此控制策略返回true,否则返回false/ Y  Q* x0 n! R1 o; H  j
' n% \; |$ l% {$ y) B! z
acl timetask_req url_dir -i timetask, T( N' i0 V6 y; [' S

2 s0 A. K8 }- G- Q+ v4 f6 ]#当请求的header中Content-length等于0时返回 true
, u! s* ?6 w" K$ a: c# [' r6 L3 t
0 B! M: [6 N, `( eacl missing_cl hdr_cnt(Content-length) eq 0
' [* W2 g( Q! n) \8 _. {- A8 A( X
" u4 S" y+ E- Z( O######################acl策略匹配相应###################2 r$ G0 a! I* ?+ W3 x
: D2 k. @: Y: g4 r) N9 @0 @
##当请求中header中Content-length等于0 阻止请求返回4033 M9 J" I" T% z, B

4 w/ g* T+ Q, j2 k5 Pblock if missing_cl
# ~: [; t- x( D0 y% v9 v" _1 T2 G! \. t
/ }; T% [9 q9 \5 k$ ^##block表示阻止请求,返回403错误,当前表示如果不满足策略invalid_req,或者满足策略timetask_req,则阻止请求。
7 \7 A; P) s+ @% _( [( h: x( a
3 D+ V- p; k' ~5 B" \  t4 Hblock if !invalid_req || timetask_req . p( B! p: b1 r) K9 K6 g! e# v$ K

% n/ {8 b! T+ W% F7 u4 W- j#当满足denali_policy的策略时使用denali_server的backend
' M" c: {7 h& D' }% B4 b
3 ^8 ~" }2 b8 C: Ouse_backend denali_server if denali_policy
/ r" l: f- q/ Y5 ]# K# h# s: r/ |7 T% p& a5 U
#当满足tm_policy的策略时使用tm_server的backend
% j! k) h" Q! N9 _9 N9 _" \- @
. `7 ^- k- c6 [( q5 zuse_backend tm_server if tm_policy
4 U- }& i/ `/ z/ f  z+ T$ V7 v+ T( [0 Y! r( r7 `
#reqisetbe关键字定义,根据定义的关键字选择backend* j5 ?* b1 J9 |& B

" Q! ^0 s$ X5 ~0 }$ U, Treqisetbe ^Host:\ img dynamic! M5 W" z0 O" q. u
* F2 }4 F9 c( Z' t
reqisetbe ^[^\ ]*\ /(img|css)/ dynamic, d$ }4 E1 e) _2 \
! a, e) g; F. D
reqisetbe ^[^\ ]*\ /admin/stats stats
! u+ u8 I/ h4 N' `) z' v
4 n! X3 K7 `+ T#以上都不满足的时候使用默认mms_server的backend; q3 }: [% M' s8 l. \! R8 ~( A

' Q6 I, [6 L6 D' P7 _$ h- j, |default_backend mms_server$ O  }$ ]; U2 t) l! u0 U8 }

* t: |$ E9 h, c/ j: |#HAProxy错误页面设置2 O5 |! c2 V  |& s7 G; N1 c. Z

1 s2 A7 \9 A7 N0 {+ d- `/ Berrorfile 400 /home/admin/haproxy/errorfiles/400.http  ]- ?1 g& \% o" ^

' W& c7 l+ u. Oerrorfile 403 /home/admin/haproxy/errorfiles/403.http
4 s; W8 V; x* Q# O2 {1 I0 \2 D. I
5 ]: M" N2 i! i1 _2 n& ^$ g  Qerrorfile 408 /home/admin/haproxy/errorfiles/408.http
* r' n. ~; S; G  \) z; f0 e8 w; R5 f# r
errorfile 500 /home/admin/haproxy/errorfiles/500.http
+ T3 z! ~/ F( m5 k& `$ ^
- E1 {$ R$ i, g( V0 Ferrorfile 502 /home/admin/haproxy/errorfiles/502.http
% f5 i  x( y. z2 p0 w: E  O
7 a' n1 r4 {& @- c% x9 f# d7 verrorfile 503 /home/admin/haproxy/errorfiles/503.http2 C6 j2 ?% o0 ~  L8 }" Q5 S* E
( K' S7 z- x" g+ f
errorfile 504 /home/admin/haproxy/errorfiles/504.http
# k2 n  I3 A, Y, U; M1 U  A* p0 i( E* a8 F& w; ]; q
##########backend的设置##############
# c3 {- x% N. A; S8 r3 V& P5 @+ x2 c2 m5 y
backend mms_server# q7 H3 N+ r, @% K
" V# a  d/ t( S: n! C
#http的7层模式
  D( n* p% [0 a# i" k0 [  }* l5 u9 U; K
mode http
5 K. B! X+ E9 F/ g9 j, P0 K- O% }" G  Y2 j6 @% N
#负载均衡的方式,roundrobin平均方式
7 \9 Y8 H6 H' j7 ?, w) M2 n- v2 Z" x2 H5 I
balance roundrobin
. R& N$ L2 |5 S9 n8 L: \- M
& N- f" q$ Z! q8 g2 [5 X2 l4 I#允许插入serverid到cookie中,serverid后面可以定义; u8 `% f- E( a
5 Q4 K  D5 ]: P+ d
cookie SERVERID
0 ]/ ~- O+ D/ k5 W7 m, |5 R/ H
- [5 |: p* A5 f6 h. \8 a+ Z#心跳检测的URL,HTTP/1.1¥r¥nHost:XXXX,指定了心跳检测HTTP的版本,XXX为检测时请求
+ c' O" g* ?0 H$ V
# r$ c+ m- L$ Q0 a#服务器的request中的域名是什么,这个在应用的检测URL对应的功能有对域名依赖的话需要设置
( G2 }$ t( x5 H0 o: W4 `9 p1 A4 G  E% W4 o% `5 r
option httpchk GET /member/login.jhtml HTTP/1.1\r\nHost:member1.gemini.taobao.net' \* ?1 C& b( K7 P+ X# S6 W- I1 g( I

+ P5 w5 i/ ~3 v* N) f#服务器定义,cookie 1表示serverid为1,check inter 1500 是检测心跳频率
% j3 w; v& U+ V9 v0 }8 [( G) w% z
( ?9 ?3 n1 k7 g  @9 k$ W#rise 3是3次正确认为服务器可用,fall 3是3次失败认为服务器不可用,weight代表权重. O7 S! s1 ]/ A* p1 u" K

+ g. I5 {, l3 Oserver mms1 10.1.5.134:80 cookie 1 check inter 1500 rise 3 fall 3 weight 1
5 r& o2 W+ U, \' m, h' K
* N: e; _: f7 K( M3 @server mms2 10.1.6.118:80 cookie 2 check inter 1500 rise 3 fall 3 weight 2: g* ]+ R. P7 E0 P
  K3 o+ h/ |2 z$ [  J
backend denali_server
6 g: i$ i, h, S: d0 L! Z) P: f* c/ P+ E6 D* _0 G  F% i: ]( \
mode http
9 j9 K/ L5 |8 S) [6 _
+ d/ P9 x* ^7 D#负载均衡的方式,source根据客户端IP进行哈希的方式
1 z9 j3 T6 t& I9 U0 {( \; n3 K& c" K( w
balance source- T# ^- l* m; \6 _* u& x' F

! }/ b2 O* A. Q; _5 M# }#但设置了backup的时候,默认第一个backup会优先,设置option allbackups后+ e/ k: |* y2 d! C. Q1 S, i

2 o$ G& n2 O, `8 k# d#所有备份服务器权重一样
$ Z: z  N! d2 a' B: I2 A$ m# _3 E
0 f  z! i( \& U3 A5 Noption allbackups
1 Z; A- Y9 }6 w" x6 G9 {' B# t( a  T' m
#心跳检测URL设置
, H) i7 `! T, z# a  }7 y' s9 z7 ~  i8 C8 J1 _1 q2 E( q% [
option httpchk GET /mytaobao/home/my_taobao.jhtml HTTP/1.1\r\nHost:my.gemini.taobao.net
7 c! Y0 D$ R5 x' h3 P1 E3 T" }4 a
#可以根据机器的性能不同,不使用默认的连接数配置而使用自己的特殊的连接数配置
- D  z4 w7 l/ I  n# v- ~; I! f- `4 }9 y9 }7 H  X
#如minconn 10 maxconn 20( O7 ~$ ^- c. |) O/ w% n
0 x- E/ S4 s, a# C) r. V
server denlai1 10.1.5.114:80 minconn 4 maxconn 12 check inter 1500 rise 3 fall 3
+ d! u  v, E" K+ \" J( L. P
" {. g% x7 V! [: [) qserver denlai2 10.1.6.104:80 minconn 10 maxconn 20 check inter 1500 rise 3 fall 3
8 ~- N% I. f6 c6 i6 e$ l+ y7 C. d1 y- T* m( B2 n! u" _7 _
#备份机器配置,正常情况下备机不会使用,当主机的全部服务器都down的时候备备机会启用
( d9 N* N) ~; S- @% N* R
- \/ e# ?9 s) o& nserver dnali-back1 10.1.7.114:80 check backup inter 1500 rise 3 fall 3$ d0 n7 O' w: S* G$ D* K7 t
; j% ~* L9 `* i/ m, L! I
server dnali-back2 10.1.7.114:80 check backup inter 1500 rise 3 fall 3
) W8 y/ ]' r# b( A1 [, {. A) B) z5 X+ G$ {9 k# }
backend tm_server
4 V; e4 C5 ]9 c8 G5 `
- g4 v7 S+ V- j/ Y7 o* ~+ bmode http+ @# k: l& {# b! M: q7 I( x! `
, d0 F. L2 }) _7 y$ n! i1 z* D
#负载均衡的方式,leastconn根据服务器当前的请求数,取当前请求数最少的服务器* z1 [* N6 a# I1 b
; E0 K  ]3 z$ G
balance leastconn
. B" _' V9 d- \+ Z3 ]
! r5 X3 m+ e) C/ P0 n, l" goption httpchk GET /trade/itemlist/prepayCard.htm HTTP/1.1\r\nHost:trade.gemini.taobao.ne5 w* y3 Z# p+ M: y
) F; i. u& Z- v# S! M) W# S
server tm1 10.1.5.115:80 check inter 1500 rise 3 fall 3
  u. p5 o" T6 A- a; H, }: ]% N$ A# K" ~; p0 X" u$ ?/ R' d
server tm2 10.1.6.105:80 check inter 1500 rise 3 fall 3
! F; {/ P$ I" v& ?4 S9 }6 O/ V2 e& i( ^+ p
######reqisetbe自定义关键字匹配backend部分######################## N! F+ y1 D* T$ e" X+ V

: r- @! P: d. w/ Dbackend dynamic
. ^' f/ x' z* i8 A: L+ Z# _: I( x  i2 m7 Y/ e9 @
mode http. f3 S9 H7 i! z0 `  Q; I

) ]. K$ Y; O! M9 w) Pbalance source
0 L8 n' W* o8 q) C4 {% S- F1 k4 Q
" a6 }' ~# D3 p" C8 C$ H' b  eoption httpchk GET /welcome.html HTTP/1.1\r\nHost:www.taobao.net  I8 |- F: v, a* C) W2 a
9 A# M/ g, @5 L- U  h
server denlai1 10.3.5.114:80 check inter 1500 rise 3 fall 3* [9 ?2 i% M. d8 m

) d( J! z; x! D% b& nserver denlai2 10.4.6.104:80 check inter 1500 rise 3 fall 3# W; Z/ Y3 R) Z. F
+ j7 a6 x! _& S# ]$ ?* U" ^
backend stats
* U4 C% k7 \) N: v- G! n4 A. c. p6 b4 N4 `( O  _' L; Y9 P# ]  @
mode http
( L4 [# z! ]* X# O# T. _# P* o4 t- _- C2 t
balance source
5 C9 j" E) @: b& O% K. v& W# X" l
option httpchk GET /welcome.html HTTP/1.1\r\n Host:www.163.com
+ q/ ?+ w0 ]1 q
: `( x; T+ D& g+ X! Sserver denlai1 10.5.5.114:80 check inter 1500 rise 3 fall 3
; k% C1 P9 }7 u% c4 x
7 D/ N& J4 ]% e- ^; ^. Iserver denlai2 10.6.6.104:80 check inter 1500 rise 3 fall 3
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-6-12 04:29 , Processed in 0.025043 second(s), 23 queries .

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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