易陆发现互联网技术论坛

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

haproxy配置文件讲解

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

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

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

x
global                                                       # 全局参数的设置
% t5 o& W1 a; i$ ]    log         127.0.0.1 local2                      # log语法:log <address_1>[max_level_1] # 全局的日志配置,使用log关键字,
! x: t/ @' `4 `; z1 R/ P                                                                     指定使用127.0.0.1
+ T- Y% T; n& X7 r! W2 C' K2 s7 ?7 N7 D                                                                     上的syslog服务中的local0日志设备,记录日志等级为info的日志
, K( x% e' l) d* Q% Z) U    chroot      /var/lib/haproxy                 #改变当前工作目录. p6 |3 h  a2 }8 Z, \
    pidfile     /var/run/haproxy.pid          #当前进程id文件7 u: A; U7 I0 N  ?3 i" B: H
    maxconn     4000                                #最大连接数+ V& A! ^9 g, A. N7 s
    user        haproxy                                #所属用户
9 K- A9 m* ?- j+ t    group     haproxy                                #所属组; E1 L' l! d) L" w5 |8 J! ]' S
    daemon                                               #以守护进程方式运行haproxy
7 |1 r3 X8 ^; A- O    stats socket /var/lib/haproxy/stats6 T" @4 m9 v- N5 F% a# p! n
defaults
+ K, ^% A' H+ d6 g& l    mode                    http                        #默认的模式mode { tcp|http|health },tcp是4层,http是7层,health只会返回OK1 W/ C/ k$ u% n
    log                        global                    #应用全局的日志配置
$ v* V( D3 H( ~    option                  httplog                  # 启用日志记录HTTP请求,默认haproxy日志记录是不记录HTTP请求日志( E+ g# Q" V7 O5 m+ r; l
3 @4 R; h+ |, T2 n- d9 i6 D+ o
    option                  dontlognull          # 启用该项,日志中将不会记录空连接。所谓空连接就是在上游的负载均衡器2 l4 {! K* _$ V8 @/ k% a2 B! p
                                                                   或者监控系统为了探测该 服务是否存活可用时,需要定期的连接或者获取某
) J" P* k& K' H) d                                                                  一固定的组件或页面,或者探测扫描端口是否在监听或开放等动作被称为空连接;$ K1 P4 n3 f- L, S
                                                                  官方文档中标注,如果该服务上游没有其他的负载均衡器的话,建议不要使用
$ _$ _/ `9 N5 u( Z2 s                                                                   该参数,因为互联网上的恶意扫描或其他动作就不会被记录下来
  I2 k9 h! Z- z' \6 P    option http-server-close                   #每次请求完毕后主动关闭http通道
  ^$ L7 u/ m! v5 o3 S. A    option forwardfor       except 127.0.0.0/8   #如果服务器上的应用程序想记录发起请求的客户端的IP地址,需要在HAProxy
* i3 f8 d' e# w# s" ]/ {* o' b) }                                                                            上 配置此选项, 这样 HAProxy会把客户端的IP信息发送给服务器,在HTTP5 W9 K5 r  T, [; P6 w/ o0 o" b+ \  C
                                                                            请求中添加"X-Forwarded-For"字段。 启用  X-Forwarded-For,在requests
, I7 a( l9 }. B$ H8 A- r# i5 Q5 P                                                                            头部插入客户端IP发送给后端的server,使后端server获取到客户端的真实IP。
7 C5 n; q7 }' E% X    option                  redispatch                      # 当使用了cookie时,haproxy将会将其请求的后端服务器的serverID插入到
  q$ b: M7 i! w* W& Z; i7 T! v                                                                            cookie中,以保证会话的SESSION持久性;而此时,如果后端的服务器宕掉
% A2 U( r0 |* L$ |                                                                            了, 但是客户端的cookie是不会刷新的,如果设置此参数,将会将客户的请
/ X; f3 T! |6 }( V# k1 C                                                                            求强制定向到另外一个后端server上,以保证服务的正常。: ~3 U5 n  l, s6 D& c
    retries                 3                             # 定义连接后端服务器的失败重连次数,连接失败次数超过此值后将会将对应后端4 d/ C3 D4 Y. N3 R# u
                                                                  服务器标记为不可用
/ }" c7 \. O7 C* C( z5 ~$ a8 {( C    timeout http-request    10s             #http请求超时时间, l6 u! j( |+ y* i1 t
    timeout queue           1m                 #一个请求在队列里的超时时间3 r1 v, ]7 f, i3 c6 s: ]
    timeout connect         10s                #连接超时8 l3 g/ H4 P1 I. ?
    timeout client          1m                   #客户端超时
+ T- \% ~3 h) B6 R2 @, t    timeout server          1m                   #服务器端超时
5 I' h, u/ o/ H9 z( z    timeout http-keep-alive 10s           #设置http-keep-alive的超时时间+ A  Q. z; O& O: A1 F( U4 V
    timeout check           10s                 #检测超时+ Z' C+ a3 a, W9 m4 @3 _
    maxconn                 3000                 #每个进程可用的最大连接数
+ t9 }0 l6 p6 F" c7 I' Ufrontend  main *:80                             #监听地址为80: R3 Y5 M% J3 z' V- k+ P
    acl url_static       path_beg       -i /static /images /javascript /stylesheets" A# d' o$ l/ Y
    acl url_static       path_end       -i .jpg .gif .png .css .js
! H% E/ r( I! P1 ?* {9 v* Y    use_backend static          if url_static
) p. _$ ?& q7 t2 E2 F    default_backend             my_webserver     #定义一个名为my_app前端部分。此处将对于的请求转发给后端
* J" G7 A2 [0 B! B/ o* rbackend static                                                 #使用了静态动态分离(如果url_path匹配 .jpg .gif .png .css .js静态文件则
. f8 D4 Q# v: _! x                                                                            访问此后端)" E; S: A, x4 ?* Q( a" U
    balance     roundrobin                               #负载均衡算法(#banlance roundrobin 轮询,balance source 保存session值,7 T; ^$ S0 y1 E0 B- {
                                                                           支持static-rr,leastconn,first,uri等参数)6 ^: Q1 h1 n  Z! E: U( ^
    server      static 127.0.0.1:80 check             #静态文件部署在本机(也可以部署在其他机器或者squid缓存服务器)
- U. W; i; g4 X2 H' ]& f0 Jbackend my_webserver                                  #定义一个名为my_webserver后端部分。PS:此处my_webserver只是一个
  A' X+ F1 c3 X% M, W" R                                                                            自定义名字而已,但是需要与frontend里面配置项default_backend 值相一致: l8 c. ]8 Y6 \0 H
    balance     roundrobin                               #负载均衡算法
5 F# q# _, T' X& z    server  web01 172.31.2.33:80  check inter 2000 fall 3 weight 30              #定义的多个后端9 B  |$ O6 {" M% ~1 d+ Q% ^. h1 _% O
    server  web02 172.31.2.34:80  check inter 2000 fall 3 weight 30              #定义的多个后端) x" f1 [3 c, H" i/ ?
    server  web03 172.31.2.35:80  check inter 2000 fall 3 weight 30              #定义的多个后端" C2 W. ~/ ^% j. b$ O% q
/ _' n/ c8 ?( M

3 G; T) s6 r( O9 d4 G; t
 楼主| 发表于 2021-7-12 13:55:30 | 显示全部楼层
常用配置选项:0 V( i2 O  n6 z, q
3 b# R9 E) S" ?  N

& i0 i: G7 R4 y: n: n  |6 f: ?: _
% H* m) z. j9 f3 h# dOPTION 选项:
$ F) ]3 T( ~/ q- R. S  G2 s
! D4 t" o, n$ a2 ]/ S! h7 f5 Woption httpclose :HAProxy会针对客户端的第一条请求的返回添加cookie并返回给客户端,客户端发送后续请求时会发送+ z/ h/ N0 T  G3 [8 w/ j/ h
" Q* k8 d+ S0 ^. m/ k
                             此cookie到HAProxy,HAProxy会针对此cookie分发到上次处理此请求的服务器上,如果服务器不能忽略9 T% B- ^" a( d. ~+ s6 @! x9 ?- R

% G- X; h1 g# {5 v* g# O                             此cookie值会影响处理结果。如果避免这种情况配置此选项,防止产生多余的cookie信息。
; u0 N/ u/ n6 n, M$ p, F) H
' J  H8 w' h: u0 V  boption forwardfor :如果服务器上的应用程序想记录发起请求的客户端的IP地址,需要在HAProxy上配置此选项,这样( f2 P+ d8 a* }9 |2 T) L

& c4 Z1 g0 J% r2 G% [+ E  g8 D                               HAProxy会把客户端的IP信息发送给服务器,在HTTP请求中添加"X-Forwarded-For"字段。% ^* [% s6 ~% F& ?* k

, L$ w3 P/ x3 [# g5 [option originalto :如果服务器上的应用程序想记录发起请求的原目的IP地址,需要在HAProxy上配置此选项,这样HAProxy
  x; S/ C: T# `: |0 w+ @
4 c4 s! M+ e5 ^/ v0 C9 \6 l6 j3 Y                              会添加"X-Original-To"字段。
* Q1 W) ], G: q- q$ g& d
' P: N! a; m8 `/ qoption dontlognull :保证HAProxy不记录上级负载均衡发送过来的用于检测状态没有数据的心跳包。8 B/ B8 [& S) `2 R8 d. e* u0 Z  o

/ d: t, N3 o0 O % h# Z$ x0 k7 B; Z

( j+ A% _7 b. t: p; O1 K/ O0 LBALANCE 选项:
5 x) J* V; q2 d3 z. Z& }! ]( o/ B: i9 W: U( j2 J2 `* {0 a  f7 m  b0 ^# s
balance source :如果想让HAProxy按照客户端的IP地址进行负载均衡策略,即同一IP地址的所有请求都发送到同一服务
' m6 w. u7 T( i: b
7 o" X1 l$ M0 S                             器时,需要配置此选项。/ c* G0 O7 n; s: E- ]

. O  l# Q6 f/ f0 ^8 b' Qbalance roundrobin :HAProxy把请求轮流的转发到每一个服务器上,依据每台服务器的权重,此权重会动态调整。最常
9 H3 y1 G. x/ a, b- ~1 P- Q/ f
% Z6 O9 ~- K: n. a2 O0 E; g                                   见的默认配置。; j2 c+ C8 L* Z% p$ i
! \; P1 f8 c. a4 ~) n2 R% y

3 [! w* t" J; S' m  u" T/ J; u' z  e/ Y! p2 R
COOKIE 选项:
( W3 V7 H; _1 n" _- ~0 t, @
. {5 R) W) Z& N: M4 Z' D7 ocookie JSESSIONID prefix :如果客户端只支持一个cookie,并且服务器上的应用程序已经对返回设置了cookie,8 l8 z  `3 X% e( ~0 V

; k2 ]5 g( m/ C3 o' u) [                                               HAProxy设置此选项可以改写应用程序设置的cookie信息,把服务器的信息添加到原cookie中去。2 z( y9 k) ^7 B' J- v+ s* C+ d

8 z8 U! H! ^& E6 [cookie SERVERID indirect :HAProxy会删除添加的cookie信息,避免此cookie信息发送到服务器。6 v) \; b' K8 ?1 u9 `  S

6 R6 [& e* C& E1 `2 Q# D& Q7 v" ^7 [cookie SERVERID rewrite :
$ R7 ]  `" a( \' }
3 b% e7 U) U6 g+ Q8 W- A/ s3 ecookie SERVERID insert :$ w0 `8 v& P3 W' S; t  o% y4 T

, Q5 k5 {9 n# [' ^, wcookie SERVERID insert nocache :6 G# j7 _2 h) E! o7 n+ D

4 u4 ?  \0 o# k$ D. c) v8 [cookie SERVERID insert postonly :9 j! I) t, [7 n$ S" ]
9 G" t0 T% S( A  q

; o) F. X% j) i- w' M( U$ a! e2 o& N5 {/ v
option httpclose) {* I. D  i; a/ U/ w
no option httpclose
- Q& \2 M4 U% o" |  Enable or disable passive HTTP connection closing   启用或禁止消极的HTTP连接关闭( E4 t% {4 n; s6 G$ }7 g) M5 x6 G
  May be used in sections :   defaults | frontend | listen | backend
$ f  c) T' b2 m! h$ k4 Y$ d" v                                 yes   |    yes   |   yes  |   yes1 n  _, R! {5 c- T
  Arguments : none
$ |4 Z# [7 z# F3 R3 m  ! B" o1 b* m- @
  默认的,客户端与服务端的通讯,HAProxy只做分析、日志和分析每个连接的第一个request。如果设置了 "option7 L; {+ O9 _% X5 [. t" S
  httpclose" , 则会检查双向的http头是否有"Connection: close",如果没有则自动添加,使每个客户端或服务端在每次传输后,都会主动关闭TCP连接,使HTTP传输处于HTTP close模式下。任何 "Connection" 头如果不是"close",都会被移除。, l' j$ I, i) S$ Y, O
' M  E! X/ P1 {7 i* y1 ]- Q
  很少会有服务器不正确的忽略掉头,即使收到"Connection: close"也不关闭连接,否则就是不兼容HTTP 1.0浏览器标准。 如果发生这种情况,可以使用"option forceclose",在服务端响应后主动关闭请求连接。选项 "forceclose"还可以及早释放服务连接,而不必等到客户端的应答确认。. l) [' ~, u7 i, r
$ I9 q& z8 A, T
  这个选项可以设置在frontend或backend上,只要其上可以建立连接。如果同时设置了"option forceclose",那么它比"httpclose"优先。如果同时设置了 "option http-server-close",则会实现"option forceclose"的效果。
- o- M% h+ l: O% y: j# Z; ]. b# f8 y6 Z6 |5 g' |+ i4 D. H$ |$ e' p
option forceclose3 @% F9 \2 R* Q5 _
no option forceclose
2 l* w8 r5 a6 \( a& R& y: a( ?7 }4 M3 E' V* o2 y
  Enable or disable active connection closing after response is transferred.     启用或禁止response后的主动关闭连接
+ L' q5 [( l  v# d; s9 v* B. c7 B1 B  F' N2 o
  May be used in sections :   defaults | frontend | listen | backend
4 b- w5 o  r" }- |' |$ M% V                                 yes   |    yes   |   yes  |   yes2 ~! B7 R- }- V1 j9 Q4 t
3 d5 P: c1 u7 ~6 W: O( n- O2 c9 u$ E& p
  Arguments : none
  n) ^# w9 ~0 T; C+ s        有的HTTP服务器收到"option httpclose"设置的"Connection: close",也不会关闭连接,如果客户端也不关闭,连接会 一直打开,直到超时。这会造成服务器上同一时段内的大量连接,日志中也会显示较高的全局会话时间。8 t( K  M) ~: U  j+ p

: Z3 S4 x" v! \: e5 w3 F        此时,可以使用 "option forceclose",当完成响应时,立即关闭对外的服务通道。该选项隐式打开httpclose选项。需要注意,该选项允许解析完整的request 和 response,所以可以很快关闭至服务器的连接,比httpclose更早释放一些资源。
- b7 J# A' P& w: D4 a5 H! d        如果同时启用了"option http-pretend-keepalive",虽然会禁止发送 "Connection: close"头,但是依然会在整个response被接收后,关闭连接。
% D- j% @) |. z  N& c- {3 |/ A6 x
option http-server-close
# R' O, [- [& N$ I6 Cno option http-server-close
/ u9 [; K* c( {& a) l  Enable or disable HTTP connection closing on the server side  启用或禁止关闭服务端的HTTP连接* e1 S& R4 ]' [$ C* F7 r
  May be used in sections :   defaults | frontend | listen | backend+ a( O, l+ X; e% I
                                 yes   |    yes   |   yes  |   yes: o# O/ c0 j2 o: @
  Arguments : none
2 U0 {1 A8 b- M    默认的,客户端与服务端通讯,haproxy 只是分析、记日志,并处理每个连接的第一个请求。该选项设置server端为HTTP 连接关闭模式,并支持客户端为HTTP keep-alive的pipelining模式。提供了最低的客户端延迟和最快的服务端会话重用,以节省服务资源,类似"option forceclose"。还允许无keepalive能力的服务端在keep-alive模式下为客户端提供服务,但是需要符合 RFC2616。需要注意的是,有些服务器遇到"Connection: close" 时并不总是执行关闭,那么keep-alive 则无法使用,解决方法是启用 "option http-pretend-keepalive".% |9 w$ n% ?, Y7 ?

/ ~7 G* {: u( e- E; A& N9 B     目前,日志无法指明请求是否来自同一会话;日志中的接收日期为前一个请求的结束;请求时间为新请求的等待时间;keep-alive request time 存活请求时间为超时时间,绑定 "timeout http-keep-alive" 或 "timeout http-request"的设置。
7 f0 o( w. @; {6 {* W; N2 ^     这个操作可以设置在frontend或backend上,只要其上可以建立连接。需要注意的是,这个选项可以与 "option httpclose"结合, 但 "option httpclose"优先级更高,结合后基本实现了forceclose的效果。
! X! X! P, \& Q/ K8 e- Q3 ~. R9 k3 u& S( A/ {+ |# d5 d2 y2 @
option http-pretend-keepalive (http-假装-长连接)
% T% ]8 f. J/ [no option http-pretend-keepalive
+ c5 c# P% r) b: q+ f  Define whether haproxy will announce keepalive to the server or not  定义 haproxy 与服务器是否是 keepalive 的。6 V( ?# W' b& }
  May be used in sections :   defaults | frontend | listen | backend
; v, F+ c; i" e6 w3 T                                 yes   |    yes   |   yes  |   yes
$ @$ I, `& a( }9 h6 d) H7 U  Arguments : none& N! L4 y/ Z  i( {( R
    当声明了 "option http-server-close" 或 "option forceclose", haproxy会在给server的request头中添加 "Connection: close" 。然而有些服务器看到这个头,会返回未知长度的response,并自动避免chunked encoding,其实这是不对的。它会阻止haproxy保持客户端长连接,还会使客户端或缓存接收了未完成的响应,却认为响应结束了。6 J) o- p. _! Q1 v) n. _
    设置 "option http-pretend-keepalive", haproxy会在服务器端保持长连接,服务端则不会出现前面的问题。当 haproxy 获取了完整的response, 才会以类似forceclose的方式关闭服务端。这样客户端得到一个普通的响应,连接也在服务端被正常关闭。+ t8 m8 f* G) i: ~1 J$ m8 o; d# j
    建议不将其设为默认值,因为大部分服务器会在发送完最后一个包之后更高效的关闭连接,并释放缓存,而且网络上的数据包也会略微降低整体的峰值性能。但是启用该选项,haproxy会略微少做一些工作。所以如果haproxy在整个架构中是个瓶颈,可以启用该操作,以节省CPU。
2 J4 Y6 x$ M8 g  J% h5 t: k9 r3 U+ s& E. E! Q
     这个选项可以设置在frontend或backend上,只要其上可以建立连接。这个选项可以与 "option httpclose"结合, 使服务端keepalive,客户端close,但并不建议这样做。
( d! P; e! i& T" B5 Z, j" l
* j# `8 E1 o& e' B& k5 _" i' U+ {) H2 I' ]" g

! Z/ D: i% \( Y9 s; ibalance <algorithm> [ <arguments> ]* ], ^7 N% z; F# D0 @
balance url_param <param> [check_post [<max_wait>]]5 F. D! p# e) D
  定义选择后端服务的负载均衡算法
+ S, d" q5 q/ g$ d% L  May be used in sections :   defaults | frontend | listen | backend- v% p3 I9 k3 R. H
                                               yes   |    no    |   yes  |   yes
4 P& W4 t" [0 q$ i/ T2 k8 P  Arguments :4 a# {' g5 w0 M' r
    <algorithm> 是负载均衡时选择服务器的算法,没有持续信息时可用,或连接重定向到另一个服务器。<algorithm> 可以是以下几种:/ h2 P5 S& U9 ?! L" }
      roundrobin  每个服务器根据权重轮流使用,如果服务器的处理时间平均分布,这是最流畅和公平的算法。算法是动态的,对于实例启动慢的服务器的权重会在运行中调整。每个backend的活动服务器在设计上限制为4128个。在一些大的群里面, 当服务器很短的宕机后恢复回来,有时会有几百个请求被重新整合到群当中,并开始接收处理。尽管很少发生,但是很正常。这也说明了有机会监视它们,所以不必担心。: ?- W% v9 s/ X+ _! X: U$ y

" N2 j. ]/ s% }/ r. s9 o5 b! y      static-rr  每个服务器根据权重轮流使用,类似roundrobin,但它是静态的,意味着运行时修改权重是无效的。另一方面,它对服务器的数量没有设计上的限制,服务器启动后便会立即进到群中,整个分发方案会重新计算。这会略微降低CPU的运行(约1%)。
: i9 B7 a$ m/ m; ]+ s/ K3 u
3 I; j( R7 p1 Q5 \  _+ u      leastconn  连接数最低的服务器优先接收连接。Round-robin用于负载相同的服务器,使每台服务器都被使用。leastconn建议用于长会话服务,例如LDAP, SQL, TSE等,而不是很适合短会话协议,如HTTP。算法是动态的,对于实例启动慢的服务器的权重会在运行中调整。
4 O; H8 \+ ~, `% w$ W2 N- E3 _8 [! ^/ w: {; W' G1 }% l9 N
      source    对源IP地址进行哈希,用可用服务器的权重总数除以哈希值,根据结果进行分配。只要服务器正常,同一个客户端IP地址总是访问同一台服务器。如果哈希的结果随可用服务器数量而变化,那么有的客户端会定向到不同的服务器。该算法一般用于不能插入cookie的TCP模式。它还可以用于广域网上,为拒绝使用会话cookie的客户端提供最有效的粘连。该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是算法会根据"hash-type"的变化做调整。3 g: Q/ b0 ^& m, T* ^

- k$ [( G, h% a3 d8 s' @' l      uri        对URI左端(问号之前)进行哈希,用可用服务器的权重总数除以哈希值,根据结果进行分配。只要服务器正常,同一个URI地址总是访问同一台服务器。一般用于代理缓存和反病毒代理,以最大限度的提高缓存的命中率。该算法只能用于HTTP后端。该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是算法会根据"hash-type"的变化做调整。
$ N2 ^6 K$ |! h% {! S& K                  算法支持两个可选参数"len" 和 "depth", 都是后跟正整数。“len”参数指定算法只处理URI从头开始的字符数,据此计算哈希。因为大多URI以"/"开头,所以"len"最好不要设为1。"depth" 参数指定URI中最大的路径深度,据此计算哈希。请求中的每个斜线为一级。如果同时声明了这两个参数,则截取URI时必须同时满足。
, I6 U3 w  l9 y( F' s1 a! r3 J2 Q) V# ^
      url_param  在HTTP GET请求的查询串中查找<param>中指定的URL参数。
& B& S5 V2 B$ `8 ]% f0 o; R                 若使用了修饰符"check_post",如果在URL问号('?')后面的查询串中找不到参数,就会搜索HTTP POST 请求实体。或者在指定的一些字节后面尝试搜索消息体。如果搜索不到实体, 则使用round robin算法。例如,假设客户端总是在前128个字节发送LB参数,就可以指定它。默认为48。如果到达网关的字节数量不够,实体数据是检索不到的,至少有:(default/max_wait, Content-Length or first chunk length)。如果Content-Length没有或为0,就不需要等待客户端发送更多的数据。当Content-Length有值且大于<max_wait>,则等待仅限于<max_wait>,并假设有足够的数据用于搜索参数的存在。万一Transfer-Encoding被用了,则只能检查第一个块。如果参数值被块边界分隔开,则只能随机均衡负载了。2 K- }- p5 S0 m- R  V2 j8 O
                  如果参数后面跟着 ('=') 和一个值,则可以根据这个值进行哈希,用可用服务器的权重总数除以哈希值,根据结果进行分配。. U% U0 u  k& p6 q! b* h: s( H: B& T
                  还可用于跟踪请求中的用户身份,只要服务器正常,同一个用户ID的请求总是发给同一台服务器。如果没有参数或参数没有值,则使用轮询算法。该算法只用于HTTP后端。该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是算法会根据"hash-type"的变化做调整。+ W- h" B$ x0 k& k" w9 I6 B4 N
" u( Z# f$ b8 ]% v3 a
      hdr(name)  在每个HTTP请求中查找HTTP头<name>。与ACL函数'hdr()'一样。括号括起来的头名字不区分大小写。如果缺少头或头没有任何值,则使用roundrobin算法代替。                  9 J3 o) F. ^+ _* `
                       启用参数'use_domain_only',哈希算法将只用于一些类似'Host'的特定头的主域部分。例如主机值"haproxy.1wt.eu",则只考虑 "1wt"。该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是算法会根据"hash-type"的变化做调整。  E/ D/ r: @9 ?7 E7 G

/ Y( j9 o+ M% ~, A" _! M1 C      rdp-cookie
: }3 ?3 R" K% I; q2 _      rdp-cookie(name)  @3 p4 Q# R3 x1 y, t
                  为每个进来的TCP请求查询并哈希RDP cookie <name> (或“mstshash”如果省略) 。与ACL函数 'req_rdp_cookie()'一样,name不区分大小写。该机制用于退化的持久模式,可以使同一个用户(或同一个会话ID)总是发送给同一台服务器。如果没有cookie, 则使用roundrobin算法代替。5 ]! P; s. E2 C3 E2 n  x8 d
                  必须注意该声明要生效,前端必须确保在请求缓冲中已经有RDP cookie,所以必须使用规则tcp-request content accept' 和ACL 'req_rdp_cookie_cnt'相结合。
- Q& L) D/ ~( C& e$ j/ y                  该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是算法会根据"hash-type"的变化做调整。
, [- m. ]% s4 G, m
3 j3 E  }& q# K8 O4 _% z    <arguments> 是用于一些算法的可选参数列表,目前只有"url_param" 和 "uri" 用到,例如:% a* X1 B. B" d' r/ I1 b& L% Q
                balance uri [len <len>] [depth <depth>]
6 X7 O: y7 r0 c1 k! N                balance url_param <param> [check_post [<max_wait>]]
' U7 _! s8 d, h3 {  R: u: Y
3 [6 j% y7 D" Z" Y  如果没有其他算法、模式或选项的设置,后端的负载均衡算法默认为roundrobin。每个后端只能设置一种。
1 X7 M" b' _& W! J8 }  Examples :
2 l1 y9 a  _; {8 _) K        balance roundrobin6 u4 p8 d$ k0 X0 A8 @
        balance url_param userid& k0 F! p% _) j4 {( E" m) S" X0 w
        balance url_param session_id check_post 64
+ a" s; }( {5 ]+ e1 Z1 s; k        balance hdr(User-Agent)) K  ]% d# J& T( {
        balance hdr(host)
/ i1 ?; _0 Z6 [& @* C        balance hdr(Host) use_domain_only( B: r6 z" y7 i" P
4 G* ?( f9 E& T2 L! F7 n4 d, H# C
  注意:  以下的警告和限制是使用“check_post“扩展和”url_param”所必须考虑 :
% R. ^8 F" G/ x- r    - 所有POST请求都要考虑,因为在包含二进制数据的体或实体中,没有办法决定是否会找到参数。因此需要另一种方法,限制POST请求的体中不含有URL参数 (见 acl reqideny http_end)
, d# k! b  X" b: b8 P. Z/ }$ q8 h! c1 G: T- L! Q
    - 大于请求缓冲大小的 <max_wait> 值是没用的。在build时设置缓冲大小,默认16KB。
3 i: h) B' K' [# i6 F" L9 p    - 不支持Content-Encoding, 参数搜索会失败;负载均衡会改用 Round Robin。
, t- o+ z' Y6 m8 c- `- c    - 预计: 不支持100-continue,负载均衡会改用 Round Robin。  X% J) k2 u0 J; h3 O
    - Transfer-Encoding (RFC2616 3.6.1) 只在第一个块中支持。如果在第一个块中的参数值不完整,选择的服务器就没有定义。(实际上取决于在第一个块中定义的有多小)
  ]' ?) C2 |3 F+ T  R) Q    - 该特性不支持生成100, 411 或 501 响应。
* |$ @8 u0 _+ O+ b) D, D* A    -  有的情况下,需要"check_post"只是要查看整个消息体的内容。检查一般会停在任意数量的空格(LWS: linear
" w5 S0 t2 f) f      white space)或控制符上,表示这可能是一个URL参数列表。这可能不是一个关于SGML的类型消息体。$ P1 z# m& o) L3 P( m

6 \* K1 V! j1 R$ O# v4 p  See also : "dispatch", "cookie", "appsession", "transparent", "hash-type" and "http_proxy"." g9 q3 `& i2 E

- g; A& {9 D( X6 G5 b % C4 r6 N3 x, X5 X( h
; v1 l4 \- Q+ W* s
hash-type <method>0 o) K1 @, k5 P' g! d' q: l
  将哈希映射到服务器的方法。Specify a method to use for mapping hashes to servers) ]& U, H  Y5 M' J6 U: r9 P
  May be used in sections :   defaults | frontend | listen | backend. M2 M8 N6 j$ }" V. I
                                               yes   |    no    |   yes  |   yes1 ?8 O  w3 ]9 K! I/ \$ }. w. o
  Arguments :
9 N/ z% K$ k, d+ y! {4 v( E4 [8 x    map-based  哈希表是包含所有在线服务器的静态数组。哈希结果很平滑,并考虑了权重,但是会忽略服务器启动时的权重变化,也就是说不能慢启动。另外,服务器是根据数组中的位置所选择的,所以服务器数量变化时,大部分映射也会变化。当一台服务器启动或关闭,或服务器加入到群中,大部分连接会再分配给不同的服务器,这对有缓存的实例会比较麻烦。
3 Z+ a" N; z% X4 [0 o+ l; ]
( b. G6 R- Y3 P9 j    consistent  哈希表是由每个服务器构成的树,会在树上查找哈希Key,并选择最近的服务器。这种哈希是动态的,支持服务器启动时修改权重,所以可以慢启动。它有一个好处是当服务器启动或关闭时,只有其本身的关系被移除,当服务器加入群时,只有一小部分的映射会被重新分配,所以是一个比较理想的支持缓存的算法。但是根据其原理,算法不会非常平滑,有时候必须调整服务器的权重或ID来获得更平衡的分布。要保持多次负载均衡时的相同分布,服务器ID是绝对不能变的。(roloand:haproxy根据服务器的ID初始化其哈希值)
1 F" h1 Y5 {8 i( f   默认值是"map-based",建议大部分情况下使用。
; X& i; T6 p1 i% E, f( S( S
/ I2 J8 }- M6 p. ~/ k  See also : "balance", "server"( }, w% v, i0 s4 Y$ q: a

  u" P+ G! t5 A4 n( h0 x* m* u! l4 h  e. w" v
dispatch <address>:<port>' N3 O% i4 X% h) v2 r- k
  设置一个默认的服务器地址
; M7 H( p5 w& I' i& a8 r  May be used in sections :   defaults | frontend | listen | backend+ s9 a! m* D8 p# z/ v  U# O
                                               no    |    no    |   yes  |   yes2 J: v/ w+ g" z
  Arguments : none" U2 D! E! E( p+ w2 k+ z3 H
    <address> 默认服务器的IPv4地址,也可以是主机名称,名称只在启动时解析为IP地址。
0 W  u! o: m) |6 L1 d$ Q4 `3 E$ L    <ports>  端口号,所有连接都会发送给这个端口,但是不允许像其他服务器一样使用端口偏移(port offsets)。
& u3 e8 {9 j: z9 ~" a. B+ j6 E" E- h2 a0 O
   "dispatch"关键字指定了一个默认的服务器,用于无可用服务器时的连接的处理。过去常用于前传非持久连接给后备负载均衡器,由于定义简单,还用于简单的TCP中继(TCP relays)。 建议对于明确的连接处理,应使用"server"直接声明。
0 N- P* {) @. a+ Z& g5 k8 O
7 q8 p$ G* Q* g: B  o& g====================2 B# i$ I5 O$ X' Z

9 e3 J8 F4 z7 t3 v; r一:Global parameters
# U& q- O- b; o4 ?+ O3 d, j6 k* Process management and security- A! A1 U- a/ M5 L6 d! g% K  N
- chroot 改变当前工作目录( p  K/ q, c+ a9 V
- daemon 运行方式为后台工作
. r$ C2 N4 f! ]0 w# [- user - group 工作用户和组
1 z/ H9 Q' d* d9 F4 i-log <address> <facility>日志输出设备
4 f6 i/ S% w, y* m7 M6 f' `& D- nbproc 创建工作的进程数目# K+ x& @4 }; G8 H( u' R
-pidfile pid文件位置
) N8 Y: w! X1 R/ A& F- ulimit-n 设置每个进程的可用的最大文件描述符, [/ @: K7 j. g
- stats 创建监控所用的套接字目录
- R3 f9 q" M* P# Z- node 创建另外一个节点名字共用一个IP地址,用来识别哪个节点在处理流量  S% \8 p) E! W+ L
- description 描述实例的名称6 r1 ^% I# s) P7 H4 t/ B
maxconn <number> 每个进程可用的最大连接数
0 J! q/ f% \5 k' |7 Dmaxpipes <number>  每个进程可用的最大管道数4 ]  I  u+ y3 p1 h6 y; j. A
nokqueue  nopoll  nosepoll nosplice  禁用这些功能
# ~7 r) I* h3 y1 g6 F5 `spread-checks <0..50, in percent>  health check 的时间间隔
( i4 R2 G! `! F" w" h( @) gtune.bufsize <number>
! F; r! U: R% a+ C8 [6 r( @/ Ltune.maxaccept <number> 4 Y1 `, W1 `( n
tune.maxpollevents <number> 6 |$ F7 m9 A9 d4 e6 I% W
tune.maxrewrite <number> , {, ^) }0 M' T, v
tune.rcvbuf.client <number> 8 F5 k: I4 e. ^- a/ P8 q
tune.rcvbuf.server <number> 7 K8 E3 H- Q: u) p4 e
tune.sndbuf.client <number>
1 H0 u3 r; K2 C; k% L0 ^tune.sndbuf.server <number> - F& K) E1 [& _' A" W1 T, G
以上凭字面理解吧; `% |% W# c3 h' M
debug  调试模式,输出启动信息到标准输出
- z6 k1 J( T) c7 L6 V4 o# T" `+ Xquiet   安装模式,启动时无输出1 \) w2 n- U% [2 I) Y( r. P
( k, k0 [+ r0 {% f- t
二:defaults 块
: [9 J  n& y4 U2 i) M6 Q0 W% u作用于其后紧跟的listen块,直至下一个defaults 块,下一个default 将替换上一个块作用于以后的listen
5 S1 i* @# A. S6 U! G6 q+ Q1 \frontend 块,接受请求的端口组5 A' h' J( [6 N: ]& h' t% `% z
backend块,后端处理的server 组7 S8 T2 ?+ l6 K. O6 _3 g+ w  t
listen块,frontend和backend 块的结合: ]7 T3 j" K7 J

9 c6 I$ W# a! ^! i$ o; a/ p: U三:常用配置命令, \0 n, t6 X7 ^5 j- M' B! |& I
8 {, U+ R0 j# Q, m, g
balance <algorithm> [ <arguments> ] 6 Z; @+ w' I4 S8 O; o
balance url_param <param> [check_post [<max_wait>]]   负载均衡模块设置4 P* H8 ^# l( |. Y( L+ w1 ^, `

& i1 o0 r0 x+ V2 QExamples :1 G/ f; ?: p6 h3 b/ n1 e& y5 Q4 ?
balance roundrobin
1 B% O% n( ~% o* Jbalance url_param userid  
: b+ a0 @+ `6 t% b/ [. I/ c, bbalance url_param session_id check_post 64
) s- B, q) L. t; v: I  z% rbalance hdr(User-Agent) 0 j( O: g" a4 e; B3 \) E# O" i
balance hdr(host) 3 f: n; M& m- r
balance hdr(Host) use_domain_only
; E; e7 t5 o5 \9 q/ r" X
/ R" O( L4 x' _- J5 d$ fblock { if | unless } <condition>  在7层阻止访问
! i8 ], Y6 f4 q% c1 N8 DExample: 5 H, n) W& m7 n* n8 X9 o- A
acl invalid_src src 0.0.0.0/7 224.0.0.0/3  acl定义和squid 很像3 G' ?: w5 o  D- c/ }* g  \9 a
acl invalid_src src_port 0:1023
2 m( E5 O1 G7 }8 Racl local_dst hdr(host) -i localhost % H2 B* b$ B0 q! P
block if invalid_src || local_dst
: s& H- m, d$ N8 F7 s8 n6 x8 G2 {2 E9 N' j% J
capture cookie <name> len <length>  在请求和回应包中捕捉记录指定长度的cookie,name 为cookie的开头几个字母( t! g6 p9 [. a3 d6 c) K

' H7 n4 g! g* E# J& p: v" TExample:  R( M& }' {8 s- A  M
capture cookie ASPSESSION len 32 $ ?) N) |6 J6 y: q* A, J; h
6 S' x& Q. x  z/ \. I2 ~9 ~
capture request header <name> len <length> 0 J- |7 \; ]9 R
capture response header <name> len <length> 同上& x* X6 m: T7 n+ w6 o# \  @

- s- ~- y, t( k4 q+ f+ d5 J9 O" cclitimeout <timeout> (deprecated)   J2 E- p% z& T* O
contimeout <timeout> (deprecated)  客户端超时时间,不赞成设置
. `9 k+ y2 g: ^6 c$ Z6 t
: Q6 J) f1 @4 k, l) ]8 ccookie <name> [ rewrite | insert | prefix ] [ indirect ] [ nocache ] [ postonly ] [ domain <domain> ]*   允许持续的基于cookie 的后端连接( w+ f$ `) K. T
+ d3 S1 v9 [# j; D3 Y
default_backend <backend> 默认应用的后端% D% j. }# V4 O) l0 p
1 Y9 V& d. M/ ^$ r: j1 i2 Y; [3 B3 L
Example :
: M( T# m2 p1 [1 [8 \- {" @1 ^0 n# Uuse_backend dynamic if url_dyn 1 a( s1 b3 }( [  x2 ~$ M
use_backend static if url_css url_img extension_img ( f  z% k( w2 [- Z- U
default_backend dynamic    当没有匹配时就用dynamic4 P$ U6 `& h" w( N5 m4 X9 A

! j0 f' J& Z# g7 L7 [errorfile <code> <file> 定义出现错误的代码的返回页' f& ^, T( [' \0 \
Example :
3 d9 R- K. E& Q8 `0 d& Gerrorfile 400 /etc/haproxy/errorfiles/400badreq.http
2 s2 M, B/ [; uerrorfile 403 /etc/haproxy/errorfiles/403forbid.http 4 V# j' U" c3 y& K& x# h1 Y
errorfile 503 /etc/haproxy/errorfiles/503sorry.http
! P* E% M. R6 U+ ~8 f6 j! f  y/ ]" h4 G+ t8 W$ F. k
& S/ |$ E* a5 i. h0 _' Q
errorloc <code> <url> errorloc302 <code> <url>   出错重定向到指定url
2 c+ `! v7 ^2 sforce-persist { if | unless } <condition>  在特定条件下,强制继续连接down 掉的服务器后端
5 I/ l2 z" U  A6 j0 c2 }fullconn <conns>  定义后端组的最大连接数8 u( R9 S5 c1 j
grace <time>  haproxy停止后,再持续多长时间用于处理连接
5 T; P! ]1 I& ]( l4 P$ Chttp-check disable-on-404  如果后端检测返回404,将不再把后端计入负载均衡
) A0 s: h( k6 C! A4 ^http-check send-state 允许haproxy 发送 X-Haproxy-Server-State- r8 ?9 \6 E# U! z. s
http-request { allow | deny | http-auth [realm <realm>] } [ { if | unless } <condition> ]   七层访问控制
% @$ C/ v% f' V! a, L6 KExample:
% w  i: r+ U' S, @( zacl nagios src 192.168.129.3) E1 m4 @* J/ ^+ p+ B0 J# d
acl local_net src 192.168.0.0/16
7 P3 R! ]! X, facl auth_ok http_auth(L1)0 m  w/ G5 |; M% w! L$ O$ }3 b! E' }
3 {1 Z7 }. G: y$ \, c
http-request allow if nagios- [2 p  J1 v9 l' x
http-request allow if local_net auth_ok$ r( J/ M+ J, Z" S8 B
http-request auth realm Gimme if local_net auth_ok
9 E0 _, j, B) P9 |  X5 whttp-request deny% U) |; l) k2 l  U) y7 G

5 }9 F' K( X- v* ^Example:
3 ?5 ^! Z7 `% @6 Oacl auth_ok http_auth_group(L1) G19 r/ n6 N5 _- M3 n. Z4 K& F

5 f# a( t: _# O3 j, L* r, L- k4 shttp-request auth unless auth_ok7 _5 s  f: C$ u  v: N/ Q! g/ p

( z! i& L2 J4 B  Z& Tmode { tcp|http|health }   设定启动的实例的协议类型
. e0 L5 n0 g+ K$ }" R! |& omonitor fail { if | unless } <condition>  监控失败条件设置0 K4 c  r4 V2 s- c8 h
- v" J% `% P" L
option abortonclose 丢弃由于客户端等待时间过长而关闭连接但仍在haproxy等待队列中的请求6 j' G+ p% b+ H% z( k
option accept-invalid-http-request  接受无效的http请求,建议关闭(开启可能有安全隐患)6 \/ I# J7 z. O* V. e; Z% z
option accept-invalid-http-response 接受无效的response ,建议关闭0 t  d  {! B/ P6 _8 K" `
option allbackups  应该是后备服务器,如果正常的后端无法使用,就使用这些后备的设备,balance方式还是用原来的,没有优先的选择,常用来提供错误的页面
% }  |: ~2 y& S0 s' M  T3 N  v. ooption checkcache    分析后端response,阻止可缓存的cookie,它对response 进行严格检查,包括"Cache-control", "Pragma" and "Set-cookie" ,查看在客户端代理那边保存是否有风险,如果这个允许的话,符全以下条件 的response 将被允许,其它的将被阻止。
# S/ e# h& v# \/ y  K2 N1 V- all those without "Set-Cookie" header ;$ u! Q7 n/ u  ?$ Z! Z0 u4 @
- all those with a return code other than 200, 203, 206, 300, 301, 410,- w, k% M" ]4 u% `3 R( i) H) g" \& l8 a
provided that the server has not set a "Cache-control: public" header ;
) S$ u1 C& U3 Y# u5 W% q$ R! d- all those that come from a POST request, provided that the server has not9 [2 C% S- U" H0 B
set a 'Cache-Control: public' header ;
6 h5 M) b$ |- T8 l" }  y/ c- those with a 'Pragma: no-cache' header
2 u3 t6 |& P& J- those with a 'Cache-control: private' header# J5 v! t  w+ I5 z+ {& l) {
- those with a 'Cache-control: no-store' header
, F; d; t; i" ]0 G$ d$ r4 d% X- Y+ ?- those with a 'Cache-control: max-age=0' header  a( k& n: E9 Z1 j+ L- Q# M
- those with a 'Cache-control: s-maxage=0' header
8 v0 A4 Y7 _# C8 u/ ^% w$ K" j$ `. a- those with a 'Cache-control: no-cache' header
2 s' M( ?% h9 }" x, m- those with a 'Cache-control: no-cache="set-cookie"' header
+ w7 s) Q- A' m: Y4 c1 h- those with a 'Cache-control: no-cache="set-cookie,' header( z5 {. w0 V, @
(allowing other fields after set-cookie)
- O; q# E- b+ D1 ~* F8 D1 c& M9 o/ v& K% }
option clitcpka   是否允许客户端发送tcp keepalive 包,这个和http 的keepalive 没有关系
# U3 {, \( T9 D2 I0 J6 Soption contstats   允许连续的流量统计更新* l- k  I) R8 Z
option dontlog-normal   开启正常连接的日志
# [' n" T9 k4 ^% g/ coption dontlognull   记录空连接
7 P) i3 R5 }0 h' L- Qoption forceclose  允许关闭session 在后端把response 发送后
8 W. f2 @. V6 z4 |% `+ |& @option forwardfor [ except <network> ] [ header <name> ]        允许在request 中加入X-Forwarded-For header 发往server* d8 T$ N) y) Z2 {% D, r1 R
option http-pretend-keepalive    定义是否haproxy要宣布同server keepalive9 a4 |9 K6 |( j
option http-server-close   是否开启在server 端 connection closing
9 v( [2 c. M" G& q. koption http-use-proxy-header    用non-standard Proxy-Connection 替换 connection6 c& T5 p# R9 t; F9 ~
( S/ n3 H% S: Z
$ u$ W+ u% O: X" m
option httpchk <method> <uri> <version>  允许用http协议检查server 的健康) |8 E+ s; b, p& D4 h
Examples :
( w4 E) G- Q; }3 G7 I# Relay HTTPS traffic to Apache instance and check service availability* I$ \. f+ X. B+ Y: r; L
# using HTTP request "OPTIONS * HTTP/1.1" on port 80.' _7 S7 A7 l9 }7 w' m/ |- f/ R& o4 `
backend https_relay% @9 I5 l* T0 P( c5 ], S* b- V+ l
mode tcp
8 X' \, d4 M. d" \1 C' loption httpchk OPTIONS * HTTP/1.1\r\nHost:\ www5 O: J) ]# p: g* v, p. j
server apache1 192.168.1.1:443 check port 80. Y! I" l; ^5 M0 [( n

4 n/ b1 o7 Z! V+ o% r2 A- p, Coption httplog [ clf ] 定制日志格式
5 g6 J$ \) L) s3 J6 d* |3 [option http_proxy  开启http 代理模式,只有最基本的代理功能4 }8 M$ z) [+ H! {0 i; n
option ignore-persist { if | unless } <condition> 在某条件下拒绝持续连接,适用于对静态文件的负载均衡6 Y" k; b/ [8 @1 ^
option independant-streams  启用双向超时处理,如socket 的read 和write
7 `" S  b5 L% ]0 E4 ^/ [. }8 coption log-health-checks   记录健康检查日志
5 s; w7 }* I. I8 loption log-separate-errors   对非完全成功的连接改变日志记录等级) @- U% c1 q$ O% ]
option logasap   大传输大文件时可以提前记录日志
" v+ f3 ?5 q% ^( c  }option mysql-check   mysql 健康检查
* ^5 o$ @2 a4 @option nolinger  清除肮脏连接后开成的tcp 状态及占用的资源,不过并不是强列要求你用这个选项,当然如果你有thousands of FIN_WAIT1 sessions on your system ,那肯定得用了1 ]' E! i  u# G' g& S& c) u( h
option originalto [ except <network> ] [ header <name> ]   允许在requests中加入X-Original-To header 发往server5 B+ Z, D% S5 V# U7 K0 m
option persist     强制将http请求发往已经down 掉的server' Q1 k' ?* Q; r* z, `9 O9 l& j" R" _4 S
option redispatch   是否允许重新分配在session 失败后
' e8 l/ o) ~/ h9 S& Aoption smtpchk   smtp 检查
) P& b8 b0 B& w. D" Yoption socket-stats  允许对单个socket进行统计
8 o- _$ \2 J3 Z# }5 J: y! poption srvtcpka  是否允许向server 发送keepalive, k) x/ c$ y& M1 w/ e, b: h3 c
option tcpka 是否允许向server和client发送keepalive
. z" f# V' f  v: J9 aoption tcplog  允许记录tcp 连接的状态和时间
+ g) A3 B- |2 C, D' \( noption transparent   允许客户端透明代理9 S, A3 H3 f" I7 C4 B6 I
rate-limit sessions <rate> 设置frontend 每秒处理的连接的上限,如果到达上限就停止建立新的connection$ c5 k" J/ E9 e  U) W1 Y

/ c$ L1 t+ K- Q- f" predirect location <to> [code <code>] <option> [{if | unless} <condition>]: P, U$ d% Q/ A: l' A! e( r
redirect prefix   <to> [code <code>] <option> [{if | unless} <condition>] 重定向,相当于rewrite) v% L! \4 L) {& ^( C$ V

# W9 a: u! J. h0 e) l+ h% G6 Q7 pExample: move the login URL only to HTTPS.
) D4 E+ U" t. R' J/ ]acl clear      dst_port  80- b* U4 A7 a9 b: w5 S
acl secure     dst_port  8080
) T$ X+ f" [9 [acl login_page url_beg   /login, K* ^6 ?$ o; C
acl logout     url_beg   /logout: V3 b$ s9 i" B, p( o) J
acl uid_given  url_reg   /login?userid=[^&]+* J. e4 L9 Z7 t' G( {$ B8 X0 R# V
acl cookie_set hdr_sub(cookie) SEEN=1
! r1 M- ]5 Z* ?, @9 Q& Q5 N: ^- A0 i; H
redirect prefix   https://mysite.com set-cookie SEEN=1 if !cookie_set6 H* z8 p, L& k4 m- s8 W
redirect prefix   https://mysite.com           if login_page !secure8 u+ y; a4 ^2 z8 Y- s- z% N
redirect prefix   http://mysite.com drop-query if login_page !uid_given2 u$ |+ B3 v8 U+ g4 w9 B* p
redirect location http://mysite.com/           if !login_page secure
6 h: M$ G1 @1 W1 r+ m; `7 qredirect location / clear-cookie USERID=       if logout
) m; {8 L% R1 ]  X( p- J4 v! E% c9 k7 F4 k# q
Example: send redirects for request for articles without a '/'., r5 i( k' W+ [. O  t0 b- R
acl missing_slash path_reg ^/article/[^/]*$4 S/ [: x7 r; D' c  U5 n
redirect code 301 prefix / drop-query append-slash if missing_slash
% I9 t$ {# M/ ?9 p& zredisp (deprecated)1 m8 @1 r( V0 I* Y" ^9 ?
redispatch (deprecated) 开启session 重新分配在connection连接失败后,不赞成启用. x- {. n2 }9 Q1 N+ M3 ?+ q
reqadd  <string> [{if | unless} <cond>] 在http请示的末尾加上string- [5 O/ O) i1 }2 T
) a: n( v) _3 f
Example : add "X-Proto: SSL" to requests coming via port 81
1 _' A3 ?% f- D) ^& Facl is-ssl  dst_port       81' p3 |9 v% Z/ [, |! t3 L
reqadd      X-Proto:\ SSL  if is-ssl  ]% S+ @. M, W, w# G; @7 V9 c

4 D  b; T8 A7 j4 B  O$ O, [reqallow  <search> [{if | unless} <cond>]
. I5 I  G6 k: p- r6 m! c6 mreqiallow <search> [{if | unless} <cond>] (ignore case)    request 请求访问控制
0 `" @& k9 ~1 b4 ]# @8 U
5 G$ R: B( z  j: M) S- r: OExample :
$ [+ n: x1 W+ {$ V5 V7 q" h# allow www.* but refuse *.local
+ }5 q2 d- e# P6 A% t- ~. _reqiallow ^Host:\ www\.
! _! C" O" o) a' Zreqideny  ^Host:\ .*\.local
  @9 R  W3 j8 v7 J8 n# k! g5 F# m# s9 A
reqdel  <search> [{if | unless} <cond>]) a, u  r$ u. Z0 [) u: w% ~
reqidel <search> [{if | unless} <cond>]  (ignore case) 删除请求的head 中的内容
  \" @9 q4 A6 s8 @5 H/ Z
+ c- r% J/ ^! I8 p4 I3 TExample :& a, T5 k) a& n9 p) }8 _
# remove X-Forwarded-For header and SERVER cookie1 o0 |- G5 C, o: Q& H
reqidel ^X-Forwarded-For:.*( _- [! X+ y  x2 d' W$ p4 ?- H/ V9 X# t
reqidel ^Cookie:.*SERVER=
  b- ~; w$ s2 i: o# m
8 w/ y$ S8 S3 N9 A5 V& ]9 F( ^$ x4 H4 N$ P/ b$ x  M
reqdeny  <search> [{if | unless} <cond>]
6 t7 I- ?, {" p4 jreqideny <search> [{if | unless} <cond>]  (ignore case) 拒绝访问2 y* D2 x7 p3 M

8 u( t& t" @1 Sreqrep  <search> <string> [{if | unless} <cond>]
% Q1 l+ X0 p7 @* nreqirep <search> <string> [{if | unless} <cond>]   (ignore case)  request 请求替换# A. c+ B0 T$ P/ L" @! _
Example :1 w% n2 G! Y% a0 o
# replace "/static/" with "/" at the beginning of any request path.
: r( J  W( [( ^/ \reqrep ^([^\ ]*)\ /static/(.*)     \1\ /\2) Z. h# W' L+ e* l- h3 d
# replace "www.mydomain.com" with "www" in the host name.
8 m1 ?) ~6 N. A$ Freqirep ^Host:\ www.mydomain.com   Host:\ www4 S! [/ o! d) Z* p# D: }; K$ h

  B+ ?( x. U8 H+ k/ jreqtarpit  <search> [{if | unless} <cond>]4 s2 W4 l6 p* I! p+ S- s
reqitarpit <search> [{if | unless} <cond>]  (ignore case) 阻止http请求中的某些信息2 g4 S, M3 T/ b1 W- a7 V
  v2 C0 @' Z! Y* x. l
Examples :3 j) b& q0 ^) E* G4 @) ^# @9 @
# ignore user-agents reporting any flavour of "Mozilla" or "MSIE", but
: S, N. r( [! C! P# block all others.8 o% K- G5 l8 G& ?
reqipass   ^User-Agent:\.*(Mozilla|MSIE)
) e- g3 u+ |3 r: B0 greqitarpit ^User-Agent:! B, F$ G: J$ [3 f, s9 N( S0 O

: f# g1 l% @: V# block bad guys
8 {  p! ~  e5 \' _* a) Zacl badguys src 10.1.0.3 172.16.13.20/281 n- U0 k" O1 n" r; Q" k
reqitarpit . if badguys: `, v+ {) {$ U! s
, B) h8 n; j- B% I" ~3 ?
retries <value> 当对server的connection失败后,重试的次数
2 c/ ^) h* }+ w4 M0 G+ [3 erspadd <string> [{if | unless} <cond>] response 增加信息, W# r3 O  [; t
rspdel  <search> [{if | unless} <cond>]
- J3 @, [9 N' Y. d2 U0 Z; Irspidel <search> [{if | unless} <cond>]  (ignore case)
4 Q3 e7 ?* Q/ ?1 Wrspdeny  <search> [{if | unless} <cond>]8 a3 m# K2 J7 \
rspideny <search> [{if | unless} <cond>]  (ignore case)
. r  w4 f& l( R: {rsprep  <search> <string> [{if | unless} <cond>]
% R/ u0 Y1 I' H* `" Q  }* Urspirep <search> <string> [{if | unless} <cond>]  (ignore case)* A0 Q8 T. g" r+ j6 K; i
以上和request 的差不多4 G" @. h' Q! ?$ s7 Q1 P) t, W3 Q

7 C9 F6 }6 K# D% |! W& y+ u/ xsource <addr>[:<port>] [usesrc { <addr2>[:<port2>] | client | clientip } ] 定义从代理出去的连接的对象,用于限定地址可以访问server8 p$ [- Z4 z6 I% G8 Q

. y& R$ A; }4 M) P; j* a一些timeout$ h3 ^2 c' R+ Y$ `

# |) {: t3 g' Nsrvtimeout <timeout> server 处理超时,不赞成设置' m5 \  H4 `/ S3 Z
timeout check                             X          -         X         X
# y/ ]/ e% I' Y/ vtimeout client                            X          X         X         -8 [! ]; `5 n5 Z4 F: D
timeout clitimeout          (deprecated)  X          X         X         -/ T: e4 |  \% e. V, M
timeout connect                           X          -         X         X# q! Y. O7 Y& ~; Z
timeout contimeout          (deprecated)  X          -         X         X* ]! c: K( e3 p2 q1 c
timeout http-keep-alive                   X          X         X         X; A" r; D9 O. W5 u3 y1 K6 q# s
timeout http-request                      X          X         X         X! t/ o3 h" j- O3 o; o1 p! r1 K
timeout queue                             X          -         X         X6 V6 E5 W$ y2 L' T* r# |2 v
timeout server                            X          -         X         X
3 P, e' y: r& r" ztimeout srvtimeout          (deprecated)  X          -         X         X: t0 R3 U% Z4 z( r  R
timeout tarpit                            X          X         X         X
/ u, J6 i! c* w  y4 f8 G2 T2 }/ Z
$ \: C) ~0 @; H. g" I  r
stats auth <user>:<passwd> 监控统计的帐号和密码
0 v6 g$ h5 M; p, k# H* J; xbackend public_www+ E( x/ ?" Q- T9 N
server srv1 192.168.0.1:801 X4 ^# {* u3 I/ l5 n
stats enable
. R; C! ~7 j2 q' [; qstats hide-version; g! I( f1 |+ y
stats scope   .2 ]5 D7 D( W- j( }; h0 l" G
stats uri     /admin?stats0 }6 c" ~$ ~  `  V9 U% P/ T5 E
stats realm   Haproxy\ Statistics0 h9 I9 O% L  M3 O
stats auth    admin1:AdMiN123
7 [8 d4 X$ V, M8 qstats auth    admin2:AdMiN321! p: h) j# c8 L1 _! A
% \/ R# z$ G' u- |% k
# internal monitoring access (unlimited)
  D' w% z3 ?1 I" {1 _; _backend private_monitoring# c/ w* y: v8 `
stats enable( T7 H8 |8 e/ A9 J  i1 e
stats uri     /admin?stats- I! M0 ?* @4 m  s- |
stats refresh 5s% {' f0 ?! G- l# z
8 u$ S* C7 c! q* ?
还有很多参数,以上能用到的也没有几个,只要满足当前需求就好,对于性能要求高的话,建议把不需要的功能 都关了吧.% M+ L  @/ i) g+ q3 Y. B

5 o( k$ x$ v- ]/ o" v% G====================
2 e: |& \( D& P9 z9 b9 t7 t
( Q% b( M1 G! K  xHAProxy的配置示例
) }' G! d: j: J0 I1 P5 m* r' j% z3 L/ v" O2 v6 t% a5 _
HAProxy配置中分成五部分内容,当然这些组件不是必选的,可以根据需要选择部分作为配置。$ U+ |  p& }4 T7 q3 y, L4 J( h) X7 R
global:参数是进程级的,通常和操作系统(OS)相关。这些参数一般只设置一次,如果配置无误,就不需要再次配置进行修改; _) E7 h: Q  R% L5 z. u, y
defaults:配置默认参数的,这些参数可以被利用配置到frontend,backend,listen组件8 }3 v! ~7 @' Q1 Z* r7 s
frontend:接收请求的前端虚拟节点,Frontend可以根据规则直接指定具体使用后端的 backend(可动态选择)。
! \7 q7 W, }3 `) {9 G5 [backend:后端服务集群的配置,是真实的服务器,一个Backend对应一个或者多个实体服务器。
! g5 A. a' E) \5 elisten:Frontend和Backend的组合体。
( \: |! J) L: ^, _8 f5 m
. ^! G+ a, m) _% [( z) \8 k  I; D下面是HAProxy的一些常用的配置,这个配置是用来说明HAProxy的一些常用功能的配置,具体详细配置请查看安装目录下的doc目录下的文档文件,或者到http://cn.haproxy.org/下载中文配置说明文档, ], b0 Q! q# o* c% S2 n0 H6 d6 I

; p8 |  t) w0 h. A3 Z- |1 W) m2 `配置具体实例,后附说明:/ U2 G8 \! r9 }' g, G( D

6 i0 g' B' o- O) b% Vglobal  A2 r/ T% Q' Y! F( b2 y/ I6 Q  m2 ]
( {7 q( ~8 S* ?8 q& Q0 i
#全局的日志配置 其中日志级别是[err warning info debug]. J9 v1 y0 f+ k# v. N

; o  b9 K9 X- z- y1 }5 l#local0 是日志设备,必须为如下24种标准syslog设备的一种:
9 i2 b- T8 P- B
( V2 M# y7 T- a. D! o  [! F#kern user mail daemon auth syslog lpr news ' ?0 x' z) b  ~% o
2 R- Y7 U$ r4 _- N5 @$ E
#uucp cron auth2 ftp ntp audit alert cron2   \) t! v* U7 N" h- I1 g& ~

/ b4 r6 A+ b7 X. S2 c9 t* K) B) l#local0 local1 local2 local3 local4 local5 local6 local7 , ^4 V3 S0 Z4 Z# q- y
& o6 q& b/ Z7 [4 Z
#但是之前在/etc/syslog.conf文件中定义的是local0所以9 o. H8 v4 P; Y. ?- b8 I# j1 t
( T. u9 u" l8 V: ~2 t1 E) w
#这里也是用local0
1 ^0 c$ g- G; w- [: f" @! _, q) ?
log 127.0.0.1 local0 info #[err warning info debug]
7 D5 j1 N6 V3 U) b/ A6 S4 Q5 l
, ^" L9 b- ?4 B0 {+ O  ~: g#最大连接数1 [2 C. {% R! e! z4 U" z. d4 y5 I

: a+ ?" U9 i  ~# g9 zmaxconn 4096
. U4 ^; s4 C9 o9 _/ F0 P  ~
" d& j* E% r: {, d( l#用户
9 g) |- Y3 B. m" R, o" z$ n! S( ]! V' [9 F
user admin
  A$ @/ _$ K$ Z# E' O0 p5 ]7 g0 I1 v7 g) y+ G. M# v4 a& @0 x+ n
#组- H4 O' h9 B8 n4 x
% V% v3 C, l3 O0 X# s; k
group admin' y  o: {% t; ]7 U! ?

1 o) Q$ ]0 b2 A5 [#使HAProxy进程进入后台运行。这是推荐的运行模式$ Q6 T! |* Z. @' V8 W3 v

+ m9 e2 ~# l* ~9 b) Y/ K5 ?. rdaemon& ?% g) |* g& B/ J0 X
5 I4 i* |4 |3 \
#创建4个进程进入deamon模式运行。此参数要求将运行模式设置为"daemon"- w% `  ^6 p8 e& t, }1 m

0 w4 r" B! A! D% F$ g1 [3 Gnbproc 4
6 Y8 o; n. A& A, V7 Z% D9 O$ O8 u% R, t
#将所有进程的pid写入文件 启动进程的用户必须有权限访问此文件。' e2 ^& B6 F) d$ k7 Z9 q* Z1 ?6 g9 F
. a% p. ?& y; h' m+ q
pidfile /home/admin/haproxy/logs/haproxy.pid7 I' I* R! }& `/ e" l

; L& T! c9 d* j) J/ Z5 ^defaults 5 F$ u4 f# c+ Q2 ?, m

5 k2 L+ Y' A" z5 w* z7 B  N4 O0 i& ?#默认的模式mode { tcp|http|health },tcp是4层,http是7层,health只会返回OK
7 w' N% i. P$ D5 U5 V1 d! w& e$ L. ^, r: |7 f5 O6 `& v/ ]
mode http
( Q2 f: U# W& {4 C1 W8 s" {- d; H& T3 l0 X5 L( M: D
#采用http日志格式7 U, e# n* m& r/ T% T! P
( `, a! R/ D0 I! L5 h* U
option httplog
) b( I& ^! L$ M9 U
% N$ c  O; g2 C) v5 u) W/ w#三次连接失败就认为是服务器不可用,也可以通过后面设置; D0 ^# H$ L/ p
) x4 g* v: r! I3 v
retries 3
# Y6 d: ~: }0 X7 T* X4 B1 _
  K3 _! G( z$ [9 z8 Z. n如果cookie写入了serverId而客户端不会刷新cookie,. e$ J% `! {( @. |

5 O' F6 W& ]+ f3 H6 R$ N) q#当serverId对应的服务器挂掉后,强制定向到其他健康的服务器
, K: J# }6 [6 p" Q. n9 Z7 _8 F! f  E4 b3 x1 G( C2 Q( X; |" H8 `3 `* t0 J
option redispatch
4 K' ?- I: Q. y; F0 J
4 j9 H$ L, b/ f% z' c; g#当服务器负载很高的时候,自动结束掉当前队列处理比较久的链接
8 R: W" \6 a) B0 \
4 X: Z5 Y* L- L8 }4 u3 \- Poption abortonclose
7 i( i/ Y1 n) u. w: t! K- D7 y) p) I% Z' ?( k# ^
#默认的最大连接数
/ @" z, f4 \9 w) W4 q
) V, J2 X1 d/ Hmaxconn 4096. T& \+ e5 Q2 d3 i

- M0 c, J3 p$ U# F% G) g5 \) k/ v* w- @#连接超时: K$ Q6 ~# c9 v. B1 m0 N, e- q3 k8 f

/ S7 D* C) e3 C* T; M9 Rcontimeout 5000. X8 [# l, D7 F( W- i1 ~5 S1 R/ U

7 V8 ]! B6 k& I5 T$ Y5 }#客户端超时8 |' E# Q+ D: [& M1 g; J' _; A

# Z/ U" F7 y: l! s+ Jclitimeout 30000
4 ^& v  H/ J2 V0 t8 O$ z6 S" U9 l$ _5 q4 T, U
#服务器超时. ]/ t: _# G- A/ M! }

2 ^# n! Y# }3 zsrvtimeout 30000
. \3 @- [1 M' t9 c
' h. E. e2 H/ X#=心跳检测超时
3 q6 ~; J% d/ z1 R( d0 z9 I% h5 T/ b  g
timeout check 2000
% N8 x4 j0 ]2 P8 H0 X) {* f$ @3 c9 s' p3 Y+ V) {8 v
#注:一些参数值为时间,比如说timeout。时间值通常单位为毫秒(ms),但是也可以通过加#后缀,来使用其他的单位。7 t! Q3 @# Q( ?7 N2 ?1 {& F
7 [7 ?) I( U7 e% ]; }
#- us : microseconds. 1 microsecond = 1/1000000 second
( a; k9 M) F& v0 ]4 _6 q' x/ N9 l1 ?7 ^; M3 e7 v1 b
#- ms : milliseconds. 1 millisecond = 1/1000 second. This is the default.# [, {  P% a1 O1 ^( Z9 T; C9 ?

! O8 d2 y2 n$ H* B5 |#- s : seconds. 1s = 1000ms7 X5 o# t% ]  e/ Z; [- w
6 U" z  a8 g" k$ b7 y
#- m : minutes. 1m = 60s = 60000ms
7 [: g" i, i4 d+ M; j. |2 v/ U
) R1 C; U  ~" [7 ~$ z& S, f5 u#- h : hours. 1h = 60m = 3600s = 3600000ms
0 c8 c3 M# L4 {! q& n
% I0 {$ c; J* B% \; I. `#- d : days. 1d = 24h = 1440m = 86400s = 86400000ms
( A  ?7 Z& T1 Z) j  g1 f# _( @$ g) M% w0 k# B9 J3 Z; d, a
########统计页面配置############' I6 u/ O- @; J/ N, I
1 a3 K2 {7 W# T& u/ q
listen admin_stats
: k' o& x  h- K( \
& W  a* `: L) W- l#监听端口0 c7 B9 D# `0 v2 I8 c2 y- ^/ \- t
9 y# v1 s3 t' }" {
bind 0.0.0.0:10803 M$ l  |1 S' g( c6 {8 [. z7 c1 d0 x
# D$ y1 A7 V5 I( }
#http的7层模式  c0 y- S6 m/ K

/ V, S& D2 m  V& T/ [, W- [mode http" Z* Z9 ~* c& |, O. u# r+ u

% i6 S/ i3 N1 q8 i#日志设置8 A" g, ]; J0 _* N: W, ~3 M3 H
7 d% K7 H1 t4 E1 d1 C! H" R$ f6 C( o
log 127.0.0.1 local0 err #[err warning info debug]( n* T% b8 t& ?* F5 E' R/ ^# l4 S

. t! J( b; F5 e" d#统计页面自动刷新时间" y. ^  b4 C6 \; I# t7 v
& K' P2 Q, ]- L" f* C5 o  d
stats refresh 30s  {. n4 D  X6 ?7 A- }" w

: [  _2 ~; x% ~6 u0 O& M& D#统计页面url
& l) @3 L" l5 \6 j9 ^
: d" o5 n- z) d0 \8 rstats uri /admin?stats! A) S& }* F9 o0 i

# |( s2 S1 P) G, ?! t! T#统计页面密码框上提示文本
" T/ R; j/ l9 x3 j  i" s8 N: u. s( ^( ^  J1 S& N! n
stats realm Gemini\ Haproxy; L8 G( ~& H/ f; F
% w1 n5 `: d  ^% w
#统计页面用户名和密码设置
- f# F2 s' r& B2 o6 U1 O6 R/ R
4 ?0 h/ H" @8 e. p8 n7 Ostats auth admin:admin" h, r! ^% L" Z  u
( o9 M  n- s' Z- o  Q: Y6 E
stats auth admin1:admin1
, i- u# n/ ]( U1 d; T0 s- w! q+ ]2 `5 }
#隐藏统计页面上HAProxy的版本信息6 Q8 D/ O4 g; W" y+ v5 b
0 Q  {. S, u( ?' d5 ^. h
stats hide-version
# x; q* G+ }/ R% a6 J; O& @
6 Y, N4 m8 X, j3 |0 ]#######网站检测listen定义############( r) [9 h  Z8 W. E2 F- q
. a7 o5 H" }  O9 S
listen site_status; Y4 o) D4 r% @3 C. N0 |% ?

0 V- t1 |' i; |+ V1 b# R: sbind 0.0.0.0:10816 E: w5 B$ ^  |( e( }

3 N) n0 x' C1 E$ o6 \# Bmode http
. \' }+ L- l( U% b
2 h" @; p, H0 }6 o( z: H0 [log 127.0.0.1 local0 err #[err warning info debug]% T2 a: y3 g) W, d) Z2 i4 \( ]* Y$ c
' b/ \  B8 v# s( A: C& F* I
#网站健康检测URL,用来检测HAProxy管理的网站是否可以用,正常返回200,不正常返回500
0 e# O9 S/ x9 C; D( G+ T/ `( l) F5 B
monitor-uri /site_status8 w7 U* K0 ?  p
: c2 F5 G+ W9 q1 s$ A6 f- B& l
#定义网站down时的策略
* O0 r" l- R  _, Q7 Q3 Z
7 B9 W, j$ Q; v( E  z2 r9 b. e/ u# D9 _#当挂在负载均衡上的指定backend的中有效机器数小于1台时返回true% q# y9 k' H! s5 W9 i

8 K6 X# c, p2 I# Z* D6 w, w* Z, aacl site_dead nbsrv(denali_server) lt 1
5 n, W# I/ G7 {2 ?
+ a  f$ a+ A4 |( S2 X$ Q$ L( facl site_dead nbsrv(tm_server) lt 1
# O% n3 A" @  n. O8 s6 k  h* R' ~  [1 m
acl site_dead nbsrv(mms_server) lt 1
/ ]9 W( D! ^% c4 P0 O
4 o; t! \7 ^1 e! r9 P#当满足策略的时候返回500
3 b3 x+ a. v# T6 y: C; _2 @
1 h( I( _9 D9 t7 imonitor fail if site_dead
) R0 |2 j# U! T1 t" T" H, P5 x( g9 |# q$ h9 m* }5 j9 L! K! S. c
#如果192.168.0.252或者192.168.0.31这两天机器挂了4 a  Z0 Z# D- E) J

2 k8 z; N" u4 l+ Z#认为网站挂了,这时候返回500,判断标准是如果mode是
& x) V* Q. A$ S- K3 k6 [" ^; p9 e" @/ z
#http返回200认为是正常的,如果mode是tcp认为端口畅通是好的
( P" a) A% g2 |0 a( U& C
5 l! K" e4 g9 J, }monitor-net 192.168.0.252/310 k# }' V/ k' ~, t4 M: R8 F9 x' `
6 a4 D0 V( M& |+ n1 B
########frontend配置############
, \  d7 q3 K* G
' a/ e6 }' L1 t6 i; Zfrontend http_80_in# T8 f7 y! _1 @  u* M/ c
# `  {8 K8 n  d3 A  n+ t
#监听端口
# \, D+ M- I- o* D1 @% G
: P3 {+ B% {0 t: B/ x. `bind 0.0.0.0:80% l: \% G' W0 u
3 b  m& |5 K9 X  G( G
#http的7层模式
3 @1 ^1 A: F& ~, e) Q5 {: K0 R1 {4 m! B  X. _  M: n9 v7 F/ D- A
mode http
  I# n5 [+ b$ Y* R2 D7 C& j! x* f% E0 y( S0 S$ y
#应用全局的日志配置
+ ]/ K, |; B7 M4 x  W8 r) t1 X$ S- A& g, V2 \: t
log global  M3 K, L  E  e) G5 }) Q1 \0 r
( [7 P8 z1 ~8 K* U) h
#启用http的log
3 t" R: j6 P( r" t* x5 v) t( w: ]  Y. j' }8 z
option httplog. ?7 U1 O# O  l. w
+ t& ]8 H9 k( |- H" l: M
#每次请求完毕后主动关闭http通道,HA-Proxy不支持keep-alive模式
4 A' r7 N, r% m
4 W- n6 Z' G8 v8 aoption httpclose
! C  m" s$ L( L/ H6 Y* P( Q
$ j! w5 T5 v3 {7 F1 g#如果后端服务器需要获得客户端的真实IP需要配置次参数,将可以从Http Header中
$ C% X  m) X" B- S2 ~1 I8 y; B% [* p6 k2 D
#获得客户端IP
* H! |! }- x/ m' r
& |6 J# m3 z) R9 G/ B, R3 Z0 a9 poption forwardfor0 a% F6 a" o+ C
" Q% Z* @# m8 e0 L8 ]9 U
###########HAProxy的日志记录内容配置##########  a( A% z/ @& l+ }8 m
! ]2 {2 W4 b" i
capture request header Host len 40/ P3 U% q3 {1 w8 g2 |+ V

0 K# Y' N) k& B0 C' P3 W- Q% Ocapture request header Content-Length len 10( U- H6 h# l% B+ |7 x. E  L
! l$ X% d- t7 m8 `8 e' H
capture request header Referer len 2000 }: V9 D& x0 B! o) C1 k# Z# o

4 c& m% j7 E( R: d/ F1 [6 k  `capture response header Server len 40
; y( N/ G$ g9 ~. c" I8 Q! i2 {, G6 @9 I" X0 P/ j( m& Z% A
capture response header Content-Length len 10
! h) }0 [0 Z% \) M
5 X5 c; Y# @/ A0 V) G% S+ pcapture response header Cache-Control len 8+ ^/ r6 w3 Q: Z2 v) O

* \& K" R- M( A# ]3 x) V2 q$ y####################acl策略定义#########################
. U" q! g& Y8 _* @4 t, Z/ d- r. X8 S9 P$ m' y+ `% A
#如果请求的域名满足正则表达式返回true -i是忽略大小写
2 Z# l: {6 ?" X7 E0 u  I$ N6 o- ]5 j; }- V+ q: y; H- _
acl denali_policy hdr_reg(host) -i ^(www.gemini.taobao.net|my.gemini.taobao.net|auction1.gemini.taobao.net)$3 ^5 M0 j9 N! p

/ N/ x/ {7 R& Q5 Z! u#如果请求域名满足trade.gemini.taobao.net 返回 true -i是忽略大小写
) m+ |9 E  L1 p1 U& z2 m& M
. n% R# C4 F0 ]3 ^/ L6 q+ P" O) dacl tm_policy hdr_dom(host) -i trade.gemini.taobao.net2 W  l1 B9 F3 _& r5 W0 X; C

; O: @4 }$ S, L) n$ G##在请求url中包含sip_apiname=,则此控制策略返回true,否则为false; ^8 J: t1 u" f1 w& O
7 D0 l" o% Y2 X$ @
acl invalid_req url_sub -i sip_apiname=. v( q" p. V% S( G
( n6 _/ G% {' ?- S2 X7 i
##在请求url中存在timetask作为部分地址路径,则此控制策略返回true,否则返回false/ `6 I* ^8 ~% U# l  p* W
; ]9 N7 O8 J  F( a( w  D
acl timetask_req url_dir -i timetask
. j2 |+ I2 K7 J. S+ u0 t- ~" x/ Y( ?9 S% ~
#当请求的header中Content-length等于0时返回 true
5 v" z: a& A2 E0 w$ Y; i" W9 ?7 |( t
acl missing_cl hdr_cnt(Content-length) eq 0
% a1 H* K7 v6 w+ D' b0 @( k4 X" u5 U6 q7 g2 v% _
######################acl策略匹配相应###################) a$ L  e! P9 k9 M- I4 `4 f
9 \) R, I& Q4 I0 U$ l4 N
##当请求中header中Content-length等于0 阻止请求返回403
& y' x  n4 u1 N- m
0 t2 M+ z7 n, x+ i2 q$ gblock if missing_cl' N8 e; E3 `# {
- X% |: R7 ?6 G& P, d. c
##block表示阻止请求,返回403错误,当前表示如果不满足策略invalid_req,或者满足策略timetask_req,则阻止请求。 9 y/ v. s' g* q) h/ r3 x5 n4 A
; v7 F6 E) X5 o+ K
block if !invalid_req || timetask_req
. ]. e+ Y! q" i( |
' N9 {" R6 [$ C#当满足denali_policy的策略时使用denali_server的backend9 t/ B  _# e. Z3 m% n' T0 h
* d5 S: z# `; U5 f0 i: L0 @* Q3 `
use_backend denali_server if denali_policy5 `8 H' w, }) O- b1 [, r2 W0 Y$ C

" V) y8 r- @: d  d#当满足tm_policy的策略时使用tm_server的backend& T& B! R  t. u# z& \  Y

6 j& R- ~) G; Y: a7 O4 g) ause_backend tm_server if tm_policy* Y$ J- g+ U, x7 T
. x3 u, w3 R4 o+ T# i! w
#reqisetbe关键字定义,根据定义的关键字选择backend
' f6 Q7 X! ?/ c. Q- P4 C! d
6 n3 C% v: d, B, R$ M+ ]reqisetbe ^Host:\ img dynamic
' o% j1 w/ s5 w. X4 a% A* Y% I# i- [% F
reqisetbe ^[^\ ]*\ /(img|css)/ dynamic) p, @$ u1 {( s; v
3 ~5 v. f5 O6 U: C+ g- R
reqisetbe ^[^\ ]*\ /admin/stats stats
/ S% d- x6 R$ l* G5 D, i
; i5 M& o$ C- f/ K) U#以上都不满足的时候使用默认mms_server的backend* m2 T; x; X: D5 M  V+ R, T5 Y
! m: }$ ?$ R: g/ e: _. Z' @
default_backend mms_server
# ]! y) }. L' y2 W" V. ?' B
/ H# U8 Q; p0 l. i# l1 N#HAProxy错误页面设置( Q  q% g! e; W$ h

  D6 L+ e. ]7 P6 i) Gerrorfile 400 /home/admin/haproxy/errorfiles/400.http
! h1 @% r+ ?/ k5 S- ~# l8 h
4 Y$ v" A0 b# K0 \errorfile 403 /home/admin/haproxy/errorfiles/403.http
( {' A2 _% k: _+ M  |/ s8 F  K+ y- H$ Z* h
errorfile 408 /home/admin/haproxy/errorfiles/408.http0 P+ ^9 y/ A3 A4 N3 H

  X+ ^! q0 N0 R/ N5 K2 Ferrorfile 500 /home/admin/haproxy/errorfiles/500.http/ C: s# Z5 w0 C) J0 b
4 {8 v; ?& I4 D7 v6 O3 ]
errorfile 502 /home/admin/haproxy/errorfiles/502.http/ ?0 ?/ v9 }5 W* N
" L( N3 e9 G9 y! O8 u+ g
errorfile 503 /home/admin/haproxy/errorfiles/503.http9 n/ ^) W7 y4 o0 ~) o5 d4 {

+ s' p) h0 Y  T/ a" Werrorfile 504 /home/admin/haproxy/errorfiles/504.http
9 \# ?. z3 N/ N' a+ Z/ Z7 N! C8 }: u/ g: C0 t) N1 Y
##########backend的设置##############; G) e4 l6 I5 @+ N; `( s

7 [3 s( N3 x) d0 L5 x; Q8 s( Dbackend mms_server9 M5 e0 }/ }% y8 o% ?
9 v1 L+ f* U; W2 ~) @5 o* `3 n
#http的7层模式
) ~0 x( K  Y% F, n" n, f+ s2 G7 I
/ I) _( M0 k0 R5 }' x" V. Xmode http; p6 v# K1 O3 F% H/ o- X5 E& g

. P3 W, w) H( x& ^" d+ S) t, V#负载均衡的方式,roundrobin平均方式4 U+ ^$ d- h  p. B
; d  W* Z* s& j; T
balance roundrobin, _% U7 x7 k: D1 B  x, }

5 x' d* c1 A1 [9 p- N# p( V#允许插入serverid到cookie中,serverid后面可以定义
/ S; S) l" W( O  g
9 ~4 n  q+ q6 k: W7 |  q5 o4 fcookie SERVERID
) \  S$ B9 Q5 {9 G% K4 c0 w. F1 ~/ |' g; _
#心跳检测的URL,HTTP/1.1¥r¥nHost:XXXX,指定了心跳检测HTTP的版本,XXX为检测时请求  k3 |! Q: a( H

4 i0 {7 y3 H0 ?" M: ~# \/ y#服务器的request中的域名是什么,这个在应用的检测URL对应的功能有对域名依赖的话需要设置1 z9 [7 l; c  G: e- i# K
1 c8 W% L% P0 Q
option httpchk GET /member/login.jhtml HTTP/1.1\r\nHost:member1.gemini.taobao.net
* \, k5 q& c, U) y6 f% m4 h/ f
0 q$ Z1 l" C5 O1 G  F#服务器定义,cookie 1表示serverid为1,check inter 1500 是检测心跳频率1 I  p/ ~( B: F% Y- f2 h0 [
" F; A1 t/ b& B* F- l$ F4 ~7 w; E
#rise 3是3次正确认为服务器可用,fall 3是3次失败认为服务器不可用,weight代表权重5 S6 J. C8 V0 {+ i6 s: T0 `! {0 z
3 Y; T1 _* i  _8 j- b# d, _
server mms1 10.1.5.134:80 cookie 1 check inter 1500 rise 3 fall 3 weight 1
& i" |8 K- @/ a; c: X
0 e1 X6 @7 c: Z! o# Iserver mms2 10.1.6.118:80 cookie 2 check inter 1500 rise 3 fall 3 weight 2
, i9 o0 F4 Q& S, V- }# L- V4 M9 Y% R7 t2 l6 }  r. W$ o
backend denali_server
9 C: z2 F) ?# n4 v: c, e
) ^6 m! _3 U9 F  e8 L7 N$ fmode http2 P7 A& g/ h1 h0 @

+ v# P: U: [! @/ c#负载均衡的方式,source根据客户端IP进行哈希的方式- a2 L  b6 a; M( g) p/ B
) p; b7 S% [/ G: ~- y" r0 k
balance source; _/ y1 E/ O- o, }* {
' U9 r2 T5 H0 R: U1 S
#但设置了backup的时候,默认第一个backup会优先,设置option allbackups后7 {% w: N9 K" k) u
( L4 l3 Q4 L' ~; b
#所有备份服务器权重一样: t0 V  y3 c1 L
+ z% _  `: h: m1 R+ }+ r
option allbackups
4 W' b# q5 z) A+ p) S. C: W  f
#心跳检测URL设置
( v, e+ ]2 f' _( c6 w
8 m  V- F$ w$ S. w2 j$ S6 q# Ooption httpchk GET /mytaobao/home/my_taobao.jhtml HTTP/1.1\r\nHost:my.gemini.taobao.net! H' u1 A4 P7 _7 W' i; X7 z, N

' e0 U7 p1 X2 _, `! v' n" `8 S#可以根据机器的性能不同,不使用默认的连接数配置而使用自己的特殊的连接数配置: h* U9 l7 c/ |( y" H& B. s  o

0 @8 l, F1 Q& m5 Q#如minconn 10 maxconn 20* W9 O$ n8 }/ t* T9 o
9 J4 u" R4 e& U8 h' Y
server denlai1 10.1.5.114:80 minconn 4 maxconn 12 check inter 1500 rise 3 fall 32 H" `7 A, ?3 H# X* A: S

, ~% P1 F" j/ U0 oserver denlai2 10.1.6.104:80 minconn 10 maxconn 20 check inter 1500 rise 3 fall 3
2 i" Q" C) n. h: R: d) J) V
- s! f" g' H7 y; `4 F5 u: R6 k#备份机器配置,正常情况下备机不会使用,当主机的全部服务器都down的时候备备机会启用8 m6 c# w7 V* R$ g: \+ C
) f6 \( r1 d8 e- |
server dnali-back1 10.1.7.114:80 check backup inter 1500 rise 3 fall 3
! u9 X# G, I* I! d3 [6 L/ K/ Y# a0 v
! v' w# ^) S# W% _; r; k) F2 r/ u, rserver dnali-back2 10.1.7.114:80 check backup inter 1500 rise 3 fall 3$ s' T$ l4 W! B9 G+ r( ^; L8 P) y$ s% u
" P* \# k4 Z# y, ]4 S; k% c
backend tm_server
8 ]7 Q( [3 O: o' ^! R1 R+ o% [; I+ r. s. p6 i0 y
mode http% t: M8 M, w6 V" @  g3 j  @

* G5 H9 }+ I) T: b& }#负载均衡的方式,leastconn根据服务器当前的请求数,取当前请求数最少的服务器) K* D' ~1 r1 t1 B8 k7 c
- R7 y/ u8 J. r  X: C
balance leastconn
" Y4 z0 _: N5 b5 Q$ b1 W4 T& \. D) P1 k* l5 Y4 s# Q; f; _
option httpchk GET /trade/itemlist/prepayCard.htm HTTP/1.1\r\nHost:trade.gemini.taobao.ne
& [" B- l% v0 x% f9 E, V9 S0 C. n
6 X& m) S5 S9 Y# o: oserver tm1 10.1.5.115:80 check inter 1500 rise 3 fall 3* R; g7 \) x* o+ s* g! G% y( s* D
! B0 A8 {. d" m, D" d
server tm2 10.1.6.105:80 check inter 1500 rise 3 fall 3
- u# t' x7 c$ t& W, ~: k9 R9 q  k  L  v8 O( u
######reqisetbe自定义关键字匹配backend部分#######################
, u. q1 ^( Z% M  V2 z
& ^& h- b1 C; A0 S* \# m: {/ c- xbackend dynamic9 g  E1 e/ ?# A, `

  K) Z' O1 G9 d' I3 B& Pmode http) O  ~% Q- h- {

6 ?; ^7 C- U" o+ h' h! ]8 tbalance source
+ R+ y( L5 c. c8 A2 k% D8 S" u+ v3 x: m9 t- {0 {% `! r
option httpchk GET /welcome.html HTTP/1.1\r\nHost:www.taobao.net
4 _* M  ^" ^5 N0 _2 J% P. ]4 A  H7 d
server denlai1 10.3.5.114:80 check inter 1500 rise 3 fall 3
. e( j4 D- p' a& U1 Y8 i
9 s+ @$ V  m  N7 T" userver denlai2 10.4.6.104:80 check inter 1500 rise 3 fall 3
1 E" {( m- |' D1 o
: N% |+ h( F6 O4 abackend stats0 v! C- ^" y, X# x6 \7 H

. n0 }9 K! h% ]+ T# ~mode http
; M; y1 \# E" |: R) b8 |$ Y, B9 U5 T8 S' Q* B
balance source% I3 S  I/ W9 w% V: q
* p' f, J5 L% i$ V) S3 c( ]' H
option httpchk GET /welcome.html HTTP/1.1\r\n Host:www.163.com6 K2 \- x! ?1 |2 A  A

7 v8 l4 C, t- E5 w8 qserver denlai1 10.5.5.114:80 check inter 1500 rise 3 fall 3
, B* A0 _+ Y& j7 L
) m6 t& j5 x$ J3 lserver denlai2 10.6.6.104:80 check inter 1500 rise 3 fall 3
您需要登录后才可以回帖 登录 | 开始注册

本版积分规则

关闭

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

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

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

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

Powered by Discuz! X3.4 Licensed

© 2012-2025 Discuz! Team.

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