|
|
楼主 |
发表于 2021-7-12 13:55:30
|
显示全部楼层
常用配置选项:
9 K4 m Z6 l" n& D4 ^ r3 e2 Y2 G; l: p3 g
# i" u3 y: E: g) R1 ~' A, D% m. O% @( M! L* w. e" Z! I* R3 f" n
OPTION 选项:
8 F( R( a, Q B. ?2 f3 I' Z0 e# o# _- z
; @* m4 w+ p. t! n, O+ Doption httpclose :HAProxy会针对客户端的第一条请求的返回添加cookie并返回给客户端,客户端发送后续请求时会发送
: X P- F7 C' S4 Y, e5 T* P& E5 J" h6 U: n
此cookie到HAProxy,HAProxy会针对此cookie分发到上次处理此请求的服务器上,如果服务器不能忽略
3 U' ?7 o* Z+ s D1 B& x! l7 S/ I w' t4 d
此cookie值会影响处理结果。如果避免这种情况配置此选项,防止产生多余的cookie信息。
" k0 V+ a8 ]) z Q# d5 E2 b2 o( p5 h7 c
option forwardfor :如果服务器上的应用程序想记录发起请求的客户端的IP地址,需要在HAProxy上配置此选项,这样, M$ N1 L- ]/ L# C! |
( U' p. o9 \: V HAProxy会把客户端的IP信息发送给服务器,在HTTP请求中添加"X-Forwarded-For"字段。
+ Z$ y0 C9 E3 C1 J, [4 |/ H
, R4 d' i, P+ }* e8 [option originalto :如果服务器上的应用程序想记录发起请求的原目的IP地址,需要在HAProxy上配置此选项,这样HAProxy
: C1 d- C1 R" o( _9 D! R2 Z5 z5 c5 X4 j$ [
会添加"X-Original-To"字段。; |4 E% W% F+ k0 T$ e7 ?
+ `( M) b+ u- p
option dontlognull :保证HAProxy不记录上级负载均衡发送过来的用于检测状态没有数据的心跳包。
9 r( E" d* A- h% c- B0 B
" a! @" `* ~% p7 }$ B
6 ^6 R$ M; i: [3 s: ?* u2 r% W9 N2 g5 R: z8 d4 S5 L
BALANCE 选项:* w8 C8 M/ [ K H1 E" C' n, k
- H7 Z- i) Q+ Qbalance source :如果想让HAProxy按照客户端的IP地址进行负载均衡策略,即同一IP地址的所有请求都发送到同一服务
7 i% q; i" H k* ^5 Y, t9 u& p+ R6 _
器时,需要配置此选项。
) c8 z' m0 z3 g0 i5 `; {$ K9 S, V& X
) r0 m' O* P- A+ j- [9 ebalance roundrobin :HAProxy把请求轮流的转发到每一个服务器上,依据每台服务器的权重,此权重会动态调整。最常: U) r3 A V6 z# L
! r1 \! n/ ]# i( s! ? 见的默认配置。
& q! t" b2 D, `( k' X2 M" v! B8 \- c# t( e+ G/ r* C5 d
, ^5 v& f' }$ ^: Y7 e0 Y8 }$ v- R
* i6 F8 ~! j N- @, b6 B1 B, w7 f% {COOKIE 选项:
& P. u. e- v) X4 u, u
1 L: H j& P( }- vcookie JSESSIONID prefix :如果客户端只支持一个cookie,并且服务器上的应用程序已经对返回设置了cookie,. H9 I# L, F" {+ [
( M" Z- R. M4 H# ~6 `# T HAProxy设置此选项可以改写应用程序设置的cookie信息,把服务器的信息添加到原cookie中去。
4 H% h( X+ b0 R: r/ n% m
9 X. C8 [7 X0 v7 `; u$ c, ccookie SERVERID indirect :HAProxy会删除添加的cookie信息,避免此cookie信息发送到服务器。
* U; u! l$ o' Y6 w% W) U% S
: q7 Q4 x/ Z) I# o) p% r4 |0 Qcookie SERVERID rewrite : ^9 _' j F. b: y) }
% l3 w) o: K: L5 u3 E( L, Wcookie SERVERID insert :
/ r8 a Y$ `0 m4 {5 }# Y! h) ^- p
cookie SERVERID insert nocache :
( ^3 ?( c) A8 k3 ]4 y( f7 _: h
# c+ Q$ H9 w, q |2 gcookie SERVERID insert postonly :: H! j: h& n) K7 I' g
& H b4 r, `; \0 \9 ^) ]& i/ a
0 m }$ ]# M \1 \$ m: U6 E7 c% S6 Q
$ ^ D9 u( E- N+ Z& soption httpclose3 P, T' ?& U5 [* y
no option httpclose. p! B1 @, B! P8 r( b
Enable or disable passive HTTP connection closing 启用或禁止消极的HTTP连接关闭0 r. m, @; E" a
May be used in sections : defaults | frontend | listen | backend
# k: j1 U$ X2 J. ?9 n/ h yes | yes | yes | yes4 j) W0 K2 }5 i& g
Arguments : none
, o6 W9 i& S; \! y6 ]2 R: X g
! b) x6 U$ W( f1 |& o 默认的,客户端与服务端的通讯,HAProxy只做分析、日志和分析每个连接的第一个request。如果设置了 "option
4 K( q! w& ?; T8 _& n; W httpclose" , 则会检查双向的http头是否有"Connection: close",如果没有则自动添加,使每个客户端或服务端在每次传输后,都会主动关闭TCP连接,使HTTP传输处于HTTP close模式下。任何 "Connection" 头如果不是"close",都会被移除。
) S8 V8 `" t" Q% k7 M6 k, H
- P5 e3 t/ M. c, Z" q: s8 k 很少会有服务器不正确的忽略掉头,即使收到"Connection: close"也不关闭连接,否则就是不兼容HTTP 1.0浏览器标准。 如果发生这种情况,可以使用"option forceclose",在服务端响应后主动关闭请求连接。选项 "forceclose"还可以及早释放服务连接,而不必等到客户端的应答确认。
2 f" d0 W" O" c" S7 F! Q- C
; _1 _$ r8 c& }! J R4 J 这个选项可以设置在frontend或backend上,只要其上可以建立连接。如果同时设置了"option forceclose",那么它比"httpclose"优先。如果同时设置了 "option http-server-close",则会实现"option forceclose"的效果。2 R( t4 E( [3 D" A: c
, Z Q" \" l: Ooption forceclose
( F' b) a) M9 ?. hno option forceclose
( P5 G5 G% n6 ]* n" G' k, o1 x' w8 l$ [6 ~# [& j
Enable or disable active connection closing after response is transferred. 启用或禁止response后的主动关闭连接
6 A& ?6 x3 K+ ~5 u. i( D6 V, J' {& S+ c5 K6 C0 P! G
May be used in sections : defaults | frontend | listen | backend
T, A6 F; R: \5 Z; L7 d yes | yes | yes | yes
: b2 l* q9 ]( s! P/ M8 D4 k
/ y# p7 R$ ]" @ Arguments : none
0 w: `0 a8 p; l3 [$ `: p 有的HTTP服务器收到"option httpclose"设置的"Connection: close",也不会关闭连接,如果客户端也不关闭,连接会 一直打开,直到超时。这会造成服务器上同一时段内的大量连接,日志中也会显示较高的全局会话时间。3 c2 E$ L* V) Y0 B! v2 ]# S8 [
9 _: {! m! {$ d* u0 S7 C9 B: D
此时,可以使用 "option forceclose",当完成响应时,立即关闭对外的服务通道。该选项隐式打开httpclose选项。需要注意,该选项允许解析完整的request 和 response,所以可以很快关闭至服务器的连接,比httpclose更早释放一些资源。
1 ^- k" s) K8 F% K8 M0 j' o 如果同时启用了"option http-pretend-keepalive",虽然会禁止发送 "Connection: close"头,但是依然会在整个response被接收后,关闭连接。! i, O* Q: z# U( ]# _; j
! g x3 G; X. M7 Q
option http-server-close
% ]/ `4 j5 L1 k8 p$ E! f7 r- Vno option http-server-close( ~+ B+ d4 b( M& e# s
Enable or disable HTTP connection closing on the server side 启用或禁止关闭服务端的HTTP连接
" o3 {9 _$ K8 }* I2 b- d3 ? May be used in sections : defaults | frontend | listen | backend
( V7 D5 F, U2 `5 G yes | yes | yes | yes
- i3 d4 z9 L Y3 R/ k6 @; \ Arguments : none* Q4 }# L1 {" W
默认的,客户端与服务端通讯,haproxy 只是分析、记日志,并处理每个连接的第一个请求。该选项设置server端为HTTP 连接关闭模式,并支持客户端为HTTP keep-alive的pipelining模式。提供了最低的客户端延迟和最快的服务端会话重用,以节省服务资源,类似"option forceclose"。还允许无keepalive能力的服务端在keep-alive模式下为客户端提供服务,但是需要符合 RFC2616。需要注意的是,有些服务器遇到"Connection: close" 时并不总是执行关闭,那么keep-alive 则无法使用,解决方法是启用 "option http-pretend-keepalive".
6 y( L. U* |: a. E2 t, q/ a5 V# O0 }# o4 [; _: ?
目前,日志无法指明请求是否来自同一会话;日志中的接收日期为前一个请求的结束;请求时间为新请求的等待时间;keep-alive request time 存活请求时间为超时时间,绑定 "timeout http-keep-alive" 或 "timeout http-request"的设置。3 |' Q9 g& T& [
这个操作可以设置在frontend或backend上,只要其上可以建立连接。需要注意的是,这个选项可以与 "option httpclose"结合, 但 "option httpclose"优先级更高,结合后基本实现了forceclose的效果。
* [9 g" Y4 m3 o& Y% [0 ^. P( B3 K2 A
. s" w1 H3 i7 l# h8 f" r) Aoption http-pretend-keepalive (http-假装-长连接)
3 r. f( b" N. V3 {no option http-pretend-keepalive
; n: |) S& l# ~% Y Define whether haproxy will announce keepalive to the server or not 定义 haproxy 与服务器是否是 keepalive 的。& y, K7 K# ?2 D8 d9 \" V) G3 {: E
May be used in sections : defaults | frontend | listen | backend5 x% H7 M" B7 c
yes | yes | yes | yes2 D& p2 g$ p: M9 N9 u- e1 v9 b
Arguments : none. p2 M0 y. j0 {5 G
当声明了 "option http-server-close" 或 "option forceclose", haproxy会在给server的request头中添加 "Connection: close" 。然而有些服务器看到这个头,会返回未知长度的response,并自动避免chunked encoding,其实这是不对的。它会阻止haproxy保持客户端长连接,还会使客户端或缓存接收了未完成的响应,却认为响应结束了。7 A t( K+ P6 i' Z# E& J
设置 "option http-pretend-keepalive", haproxy会在服务器端保持长连接,服务端则不会出现前面的问题。当 haproxy 获取了完整的response, 才会以类似forceclose的方式关闭服务端。这样客户端得到一个普通的响应,连接也在服务端被正常关闭。
/ j1 m! G8 F3 y y* o, T 建议不将其设为默认值,因为大部分服务器会在发送完最后一个包之后更高效的关闭连接,并释放缓存,而且网络上的数据包也会略微降低整体的峰值性能。但是启用该选项,haproxy会略微少做一些工作。所以如果haproxy在整个架构中是个瓶颈,可以启用该操作,以节省CPU。
8 U# q' _; f2 H
0 O1 {; c+ ^9 G: K) u& C% H 这个选项可以设置在frontend或backend上,只要其上可以建立连接。这个选项可以与 "option httpclose"结合, 使服务端keepalive,客户端close,但并不建议这样做。: n7 G: P' d5 x( B- ]
& e- B7 |: A- `
* c2 j. i# s0 }# }
$ `$ @2 N0 v+ d% ~balance <algorithm> [ <arguments> ], I: }' g* p: x- W! G5 R- w
balance url_param <param> [check_post [<max_wait>]]2 f1 q9 w0 ]% c/ z) Q: j
定义选择后端服务的负载均衡算法/ r* g1 K( L6 |8 u
May be used in sections : defaults | frontend | listen | backend7 o+ w# x2 d6 B/ m) |3 J/ ^
yes | no | yes | yes; _! c3 a: o: g. q6 ]$ U( Q
Arguments :' \; R; k: D. Q- a1 A2 Q' L
<algorithm> 是负载均衡时选择服务器的算法,没有持续信息时可用,或连接重定向到另一个服务器。<algorithm> 可以是以下几种:& h9 ^6 s& m5 p' X- H
roundrobin 每个服务器根据权重轮流使用,如果服务器的处理时间平均分布,这是最流畅和公平的算法。算法是动态的,对于实例启动慢的服务器的权重会在运行中调整。每个backend的活动服务器在设计上限制为4128个。在一些大的群里面, 当服务器很短的宕机后恢复回来,有时会有几百个请求被重新整合到群当中,并开始接收处理。尽管很少发生,但是很正常。这也说明了有机会监视它们,所以不必担心。+ c) c% r( x# \ W& X
: Z: Z* M% d: b$ r% V" w3 ]
static-rr 每个服务器根据权重轮流使用,类似roundrobin,但它是静态的,意味着运行时修改权重是无效的。另一方面,它对服务器的数量没有设计上的限制,服务器启动后便会立即进到群中,整个分发方案会重新计算。这会略微降低CPU的运行(约1%)。
2 j$ I5 K2 y3 q5 R$ b! K# j1 |% z/ e7 \
8 h+ d. \; b* }( W! k0 ?3 N% c* b leastconn 连接数最低的服务器优先接收连接。Round-robin用于负载相同的服务器,使每台服务器都被使用。leastconn建议用于长会话服务,例如LDAP, SQL, TSE等,而不是很适合短会话协议,如HTTP。算法是动态的,对于实例启动慢的服务器的权重会在运行中调整。
# r( O' I" d4 b8 D( I
& s- x. |8 |' |( s4 \+ {5 A B source 对源IP地址进行哈希,用可用服务器的权重总数除以哈希值,根据结果进行分配。只要服务器正常,同一个客户端IP地址总是访问同一台服务器。如果哈希的结果随可用服务器数量而变化,那么有的客户端会定向到不同的服务器。该算法一般用于不能插入cookie的TCP模式。它还可以用于广域网上,为拒绝使用会话cookie的客户端提供最有效的粘连。该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是算法会根据"hash-type"的变化做调整。
+ }5 u! f) y( N4 Y5 X8 i
; ?$ [, F. m! u& W uri 对URI左端(问号之前)进行哈希,用可用服务器的权重总数除以哈希值,根据结果进行分配。只要服务器正常,同一个URI地址总是访问同一台服务器。一般用于代理缓存和反病毒代理,以最大限度的提高缓存的命中率。该算法只能用于HTTP后端。该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是算法会根据"hash-type"的变化做调整。, n) B7 W x$ D2 d6 O! m5 C- c
算法支持两个可选参数"len" 和 "depth", 都是后跟正整数。“len”参数指定算法只处理URI从头开始的字符数,据此计算哈希。因为大多URI以"/"开头,所以"len"最好不要设为1。"depth" 参数指定URI中最大的路径深度,据此计算哈希。请求中的每个斜线为一级。如果同时声明了这两个参数,则截取URI时必须同时满足。
5 ], h; m0 D) w7 p+ t7 k+ e
1 G4 g- q9 F3 | url_param 在HTTP GET请求的查询串中查找<param>中指定的URL参数。
9 q+ j3 V4 T$ d. o' E; @; r 若使用了修饰符"check_post",如果在URL问号('?')后面的查询串中找不到参数,就会搜索HTTP POST 请求实体。或者在指定的一些字节后面尝试搜索消息体。如果搜索不到实体, 则使用round robin算法。例如,假设客户端总是在前128个字节发送LB参数,就可以指定它。默认为48。如果到达网关的字节数量不够,实体数据是检索不到的,至少有:(default/max_wait, Content-Length or first chunk length)。如果Content-Length没有或为0,就不需要等待客户端发送更多的数据。当Content-Length有值且大于<max_wait>,则等待仅限于<max_wait>,并假设有足够的数据用于搜索参数的存在。万一Transfer-Encoding被用了,则只能检查第一个块。如果参数值被块边界分隔开,则只能随机均衡负载了。
4 l' Z, W$ R1 v& Q8 j k1 e8 o X 如果参数后面跟着 ('=') 和一个值,则可以根据这个值进行哈希,用可用服务器的权重总数除以哈希值,根据结果进行分配。
3 t2 H4 [# C+ x& G3 L 还可用于跟踪请求中的用户身份,只要服务器正常,同一个用户ID的请求总是发给同一台服务器。如果没有参数或参数没有值,则使用轮询算法。该算法只用于HTTP后端。该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是算法会根据"hash-type"的变化做调整。
. J K* ?+ O/ ^& {% q4 J$ M1 `. b- I4 K+ i, ^0 J0 @
hdr(name) 在每个HTTP请求中查找HTTP头<name>。与ACL函数'hdr()'一样。括号括起来的头名字不区分大小写。如果缺少头或头没有任何值,则使用roundrobin算法代替。 0 d; u1 S/ F$ _, f4 }4 C; K/ X
启用参数'use_domain_only',哈希算法将只用于一些类似'Host'的特定头的主域部分。例如主机值"haproxy.1wt.eu",则只考虑 "1wt"。该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是算法会根据"hash-type"的变化做调整。
' `: {: h) @) M& | a( E# x6 N. c* s) x
rdp-cookie8 u2 |0 i! P1 C9 D/ S6 P, f
rdp-cookie(name)% _$ V, h8 ~+ R
为每个进来的TCP请求查询并哈希RDP cookie <name> (或“mstshash”如果省略) 。与ACL函数 'req_rdp_cookie()'一样,name不区分大小写。该机制用于退化的持久模式,可以使同一个用户(或同一个会话ID)总是发送给同一台服务器。如果没有cookie, 则使用roundrobin算法代替。
' M8 X2 _0 k) @: o3 H- N 必须注意该声明要生效,前端必须确保在请求缓冲中已经有RDP cookie,所以必须使用规则tcp-request content accept' 和ACL 'req_rdp_cookie_cnt'相结合。3 Z: b, [1 N/ x7 D
该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是算法会根据"hash-type"的变化做调整。; o) z1 |" T @0 A! ^
# R8 f5 _) J( G <arguments> 是用于一些算法的可选参数列表,目前只有"url_param" 和 "uri" 用到,例如:
: r% i' g1 r* K# \/ \ balance uri [len <len>] [depth <depth>]
+ b5 M+ u, k: Z balance url_param <param> [check_post [<max_wait>]]" ~7 X+ s; A. [) z" S/ ?
, n: ~* M9 _+ d* l 如果没有其他算法、模式或选项的设置,后端的负载均衡算法默认为roundrobin。每个后端只能设置一种。
/ k' R0 S) t h$ c Examples :
0 J9 C {& o2 `3 i! Y5 B3 z4 L balance roundrobin
& R1 d; m- \6 Y0 J8 w2 @ balance url_param userid) J1 j) ~ [# c" t' f5 Q
balance url_param session_id check_post 64
+ p( k) U3 n3 d& @ ]# X balance hdr(User-Agent)2 }* U: ?2 |1 j+ Y& ]
balance hdr(host): E9 n, Z3 w0 e' ~# o* W
balance hdr(Host) use_domain_only/ }$ A% D: ?: @/ ?3 A
) N( N9 \# ~- {8 G( k. L" M
注意: 以下的警告和限制是使用“check_post“扩展和”url_param”所必须考虑 :4 e5 P4 H! M A& ~7 ^
- 所有POST请求都要考虑,因为在包含二进制数据的体或实体中,没有办法决定是否会找到参数。因此需要另一种方法,限制POST请求的体中不含有URL参数 (见 acl reqideny http_end)
+ v8 Y1 o' q8 m4 [ X/ p% M( I& u1 \
- 大于请求缓冲大小的 <max_wait> 值是没用的。在build时设置缓冲大小,默认16KB。
" Z( c2 a: ~: `: P - 不支持Content-Encoding, 参数搜索会失败;负载均衡会改用 Round Robin。
* a6 i6 W* y/ e! Q5 j/ K& j - 预计: 不支持100-continue,负载均衡会改用 Round Robin。% I) m8 o2 Z# m# @# y6 q, t% v% E
- Transfer-Encoding (RFC2616 3.6.1) 只在第一个块中支持。如果在第一个块中的参数值不完整,选择的服务器就没有定义。(实际上取决于在第一个块中定义的有多小)
M$ P# z7 Y, n& T - 该特性不支持生成100, 411 或 501 响应。 ]! c+ m$ C; x) i% i
- 有的情况下,需要"check_post"只是要查看整个消息体的内容。检查一般会停在任意数量的空格(LWS: linear
/ K; i. C; f3 c# x white space)或控制符上,表示这可能是一个URL参数列表。这可能不是一个关于SGML的类型消息体。
( C1 P$ [; d# @( N
- q1 V) I# S* n/ g7 C See also : "dispatch", "cookie", "appsession", "transparent", "hash-type" and "http_proxy".0 z6 d- I+ r2 Z( U; K# w
_0 P% K$ l! B( ?
8 h7 u! p$ U7 p. A8 ~* f& \, x
7 L# L2 v! Y$ a/ ^
hash-type <method>0 t9 X3 V1 Z' e; Q
将哈希映射到服务器的方法。Specify a method to use for mapping hashes to servers
9 {" V9 N6 ?1 A6 R# h May be used in sections : defaults | frontend | listen | backend0 o1 {, H! V8 ^) A3 `5 Y; a: \$ Y
yes | no | yes | yes
( A, S( s7 j7 ^3 O# p H0 ` Arguments :
j3 r0 B' w: [" `. |/ u map-based 哈希表是包含所有在线服务器的静态数组。哈希结果很平滑,并考虑了权重,但是会忽略服务器启动时的权重变化,也就是说不能慢启动。另外,服务器是根据数组中的位置所选择的,所以服务器数量变化时,大部分映射也会变化。当一台服务器启动或关闭,或服务器加入到群中,大部分连接会再分配给不同的服务器,这对有缓存的实例会比较麻烦。
, R- [' e7 O5 }- m, i: J" a/ T
6 C& w- x+ U* S# l* u9 ] consistent 哈希表是由每个服务器构成的树,会在树上查找哈希Key,并选择最近的服务器。这种哈希是动态的,支持服务器启动时修改权重,所以可以慢启动。它有一个好处是当服务器启动或关闭时,只有其本身的关系被移除,当服务器加入群时,只有一小部分的映射会被重新分配,所以是一个比较理想的支持缓存的算法。但是根据其原理,算法不会非常平滑,有时候必须调整服务器的权重或ID来获得更平衡的分布。要保持多次负载均衡时的相同分布,服务器ID是绝对不能变的。(roloand:haproxy根据服务器的ID初始化其哈希值)
0 C1 _. H7 K a 默认值是"map-based",建议大部分情况下使用。" H+ A2 D$ I" \8 c' f
5 Q z* t$ u8 |% n See also : "balance", "server"% O/ d, A7 y" G1 d* I9 i G
1 T/ w+ s1 \ H$ N7 Q s, i5 C! Q0 H/ `& y5 L- y+ n0 ~1 \
dispatch <address>:<port>
/ \& \# r+ ?- D/ f) b# X/ w* G2 ]3 s2 M 设置一个默认的服务器地址, y. P. P" U0 h! m- `
May be used in sections : defaults | frontend | listen | backend
. J) k8 D" H. }, Y, Z! X no | no | yes | yes
, P" K1 p; P% |; A6 P5 F; @; U' \ Arguments : none
7 I8 b7 R. Q# C5 v+ T' x0 h <address> 默认服务器的IPv4地址,也可以是主机名称,名称只在启动时解析为IP地址。1 `# T, T' A: t }: k' |$ Q5 G
<ports> 端口号,所有连接都会发送给这个端口,但是不允许像其他服务器一样使用端口偏移(port offsets)。
+ Q1 ~2 g+ ^ D$ Y1 P7 {$ g$ y5 i, t
"dispatch"关键字指定了一个默认的服务器,用于无可用服务器时的连接的处理。过去常用于前传非持久连接给后备负载均衡器,由于定义简单,还用于简单的TCP中继(TCP relays)。 建议对于明确的连接处理,应使用"server"直接声明。& s( |. z+ U' h& D" r5 D
4 ~$ T/ Y! @) c! D2 @
====================' N, u4 C0 K& N5 f) e* o
! _. `1 {- q3 {2 o一:Global parameters
I2 j* H* f% H9 D0 g. @2 t* Process management and security
5 ~/ G! \: i6 P7 I% @3 i- chroot 改变当前工作目录! Q9 c4 h( `8 Z: o5 r
- daemon 运行方式为后台工作1 {9 X. u& ^9 ~
- user - group 工作用户和组+ ]* H& k" _' |6 W U
-log <address> <facility>日志输出设备
1 N3 \/ {: r! K/ U+ V4 }, {- nbproc 创建工作的进程数目' l: @* O3 n" v3 L8 C- `8 V
-pidfile pid文件位置+ k2 M& F# y3 N2 S* ]
- ulimit-n 设置每个进程的可用的最大文件描述符. W- I+ o! C7 H4 X- q8 n
- stats 创建监控所用的套接字目录 D* G }% V) j G- W
- node 创建另外一个节点名字共用一个IP地址,用来识别哪个节点在处理流量, N* s& W9 q$ d/ {
- description 描述实例的名称' R- @7 Y" F7 q3 x K, t* R* s7 ^; ~
maxconn <number> 每个进程可用的最大连接数
+ u! Q1 s0 e ]6 M4 Ymaxpipes <number> 每个进程可用的最大管道数; `, T4 I6 H+ E7 }! U- P
nokqueue nopoll nosepoll nosplice 禁用这些功能
1 `4 l8 R0 Y& M6 b7 _spread-checks <0..50, in percent> health check 的时间间隔) E! I; S) H; X' {6 B
tune.bufsize <number>
. ?% W+ h' \8 V: itune.maxaccept <number>
d+ C1 a) q3 a( g6 U8 |5 @tune.maxpollevents <number>
5 A* k0 I/ V; B" Rtune.maxrewrite <number> 1 e: V( C/ s9 O* X7 J: C
tune.rcvbuf.client <number> 2 T" R1 G% w F1 B3 L
tune.rcvbuf.server <number> + D$ ~3 ^% I# U
tune.sndbuf.client <number> ; T) {1 Y- R( Z- r
tune.sndbuf.server <number>
8 X+ H: ]; D b以上凭字面理解吧% f8 k' n. B5 T3 ]
debug 调试模式,输出启动信息到标准输出
N* X5 c" }5 a- Aquiet 安装模式,启动时无输出
7 x5 s) U! R" r% J( A6 j, v
4 H/ A6 M8 r: c5 s/ a二:defaults 块. X7 o& O, e, d z3 c ~$ S( J
作用于其后紧跟的listen块,直至下一个defaults 块,下一个default 将替换上一个块作用于以后的listen$ T. N$ g& z7 p2 A& d ^
frontend 块,接受请求的端口组# F) D: `3 e$ L5 ~+ C
backend块,后端处理的server 组3 Y- Y$ I# k# b; U* H3 b T
listen块,frontend和backend 块的结合
, g9 _1 m, d) v2 F, ], P- @* u' k& |" b0 Q+ Q) o% \
三:常用配置命令
3 Y. _% k( R% S! o% }8 a# w
8 { C- l8 L' t7 d- T9 Wbalance <algorithm> [ <arguments> ]
! O( [3 T2 ~2 M6 m$ \balance url_param <param> [check_post [<max_wait>]] 负载均衡模块设置4 H: |$ \" X' {. z7 E
$ s, S% h0 q* v* AExamples :. B0 J; s! H( I0 T' R( I7 ]
balance roundrobin
: A2 f8 C8 ?' D" z: Gbalance url_param userid
: X/ u5 u; v! J% k7 `5 }balance url_param session_id check_post 64
+ p- \& b1 w/ ]0 j. q: `balance hdr(User-Agent) & Q x4 J. ]( a Q( n) A
balance hdr(host) ' R; s% p. R! H
balance hdr(Host) use_domain_only # g z2 z' h! q& S2 C. H6 `- d) j
# y6 O0 E- S0 D- ^! N dblock { if | unless } <condition> 在7层阻止访问! n5 p7 ~9 z6 t* N% [8 n
Example:
& D" f" n% v' D, ]; a8 Jacl invalid_src src 0.0.0.0/7 224.0.0.0/3 acl定义和squid 很像1 P% u1 }' b+ W9 s) }7 t9 q
acl invalid_src src_port 0:1023
" {. o0 n3 Y) k: ]& Zacl local_dst hdr(host) -i localhost
* [: { @9 T; yblock if invalid_src || local_dst $ Z' N4 O- e3 Y9 v
) C: \0 @7 k" V& Q! F5 \capture cookie <name> len <length> 在请求和回应包中捕捉记录指定长度的cookie,name 为cookie的开头几个字母
8 B t" A. l: e- r8 ~3 k6 x
- R, u: O4 l# `+ X- S: aExample:
. J8 q7 O- X+ H) ?3 J2 m" bcapture cookie ASPSESSION len 32 & }6 R3 {) T2 A, z t. f
# N6 d J6 H. w" r7 V9 |* `
capture request header <name> len <length>
8 m/ r. q: j4 w- i. }' g) Scapture response header <name> len <length> 同上" h1 f5 _# q6 I/ s0 n6 v! y
6 a5 `6 I$ w( x, Iclitimeout <timeout> (deprecated) * |0 y0 X0 ?& ?+ Y/ y* J1 E5 e
contimeout <timeout> (deprecated) 客户端超时时间,不赞成设置, j4 {" O# N0 c& N8 h0 c, r: n
7 ]; l3 N8 t7 J3 T
cookie <name> [ rewrite | insert | prefix ] [ indirect ] [ nocache ] [ postonly ] [ domain <domain> ]* 允许持续的基于cookie 的后端连接
& }& L P) H: E( v" Q. Y/ [
' q5 A A3 I) Ndefault_backend <backend> 默认应用的后端
/ h# t8 A0 H3 Y+ |
: m( Z# E1 s. ]# i8 {' DExample :
# O! p3 c: z, xuse_backend dynamic if url_dyn : b" ]7 M& e0 J) p0 ?
use_backend static if url_css url_img extension_img . P. t' ~' b5 B3 N7 Z$ y
default_backend dynamic 当没有匹配时就用dynamic
1 m; B& Q) J$ u3 r8 a
0 d8 D$ T. C4 A: R& serrorfile <code> <file> 定义出现错误的代码的返回页
2 M4 X$ \' K* E% ZExample : & ]/ G7 g+ d% ~6 \
errorfile 400 /etc/haproxy/errorfiles/400badreq.http ) r3 Y. X% X5 f9 n" A/ j0 V6 R" S1 Q
errorfile 403 /etc/haproxy/errorfiles/403forbid.http
W" ~; }# ?) Q+ C( J8 eerrorfile 503 /etc/haproxy/errorfiles/503sorry.http 3 t, \0 L3 c+ f5 E6 B
1 r% m1 s5 s* ?/ t2 A$ R f1 Y& {) a! _7 o/ i% \& {7 V
errorloc <code> <url> errorloc302 <code> <url> 出错重定向到指定url& v" k1 L" S$ |& L$ _+ R
force-persist { if | unless } <condition> 在特定条件下,强制继续连接down 掉的服务器后端2 e6 N: \! k7 w8 g3 a! f: i
fullconn <conns> 定义后端组的最大连接数
1 I2 {+ h9 Z# B8 y8 {grace <time> haproxy停止后,再持续多长时间用于处理连接
' G8 [: Y' z1 J$ t9 X2 Ahttp-check disable-on-404 如果后端检测返回404,将不再把后端计入负载均衡5 f7 u6 M+ l# q k3 a# ~
http-check send-state 允许haproxy 发送 X-Haproxy-Server-State
( V+ O+ v+ y. E. Nhttp-request { allow | deny | http-auth [realm <realm>] } [ { if | unless } <condition> ] 七层访问控制
$ Q0 Q+ {+ y- h) p6 m/ {: U( j1 VExample:2 [* \3 x' {6 d+ S+ S
acl nagios src 192.168.129.3
; U0 k+ o# s$ M, l, V& Y2 W+ W0 jacl local_net src 192.168.0.0/166 x% H6 [6 w# g! p
acl auth_ok http_auth(L1) A8 I3 C4 H) M, M( t: p4 j9 u0 v5 k
3 ^* Y" e* _" V, v' Nhttp-request allow if nagios
/ b0 A6 t+ W4 I% ?& ?http-request allow if local_net auth_ok
) v4 X) \8 |( f. n) [1 m/ T/ B/ X7 O, V Ohttp-request auth realm Gimme if local_net auth_ok( b/ I* E' a% i# H% L
http-request deny/ h5 j% t: e! O/ [; p
/ s# v# R& x9 e$ B1 QExample:
1 W) a8 h! L) y! J, H- P7 {acl auth_ok http_auth_group(L1) G1
- _! H! x; y+ r$ g2 ^
9 X* W9 n% h/ z9 w+ ?$ Dhttp-request auth unless auth_ok
. Q2 w2 F! Y0 \2 s3 q. o
! y9 \+ o; J. ]mode { tcp|http|health } 设定启动的实例的协议类型- T, ^4 @5 K3 ]5 e y) w
monitor fail { if | unless } <condition> 监控失败条件设置
0 E- [* r& a/ m/ ]" W' H% a+ m
) p" D% W$ _' o4 ?option abortonclose 丢弃由于客户端等待时间过长而关闭连接但仍在haproxy等待队列中的请求! V) {' ^1 y% M6 A9 c5 C+ [
option accept-invalid-http-request 接受无效的http请求,建议关闭(开启可能有安全隐患)' l" g2 W0 N) ^9 O7 F& I8 a: {
option accept-invalid-http-response 接受无效的response ,建议关闭" q R* ?7 [% c2 V1 A
option allbackups 应该是后备服务器,如果正常的后端无法使用,就使用这些后备的设备,balance方式还是用原来的,没有优先的选择,常用来提供错误的页面
3 |1 M8 J! p; o9 Y( toption checkcache 分析后端response,阻止可缓存的cookie,它对response 进行严格检查,包括"Cache-control", "Pragma" and "Set-cookie" ,查看在客户端代理那边保存是否有风险,如果这个允许的话,符全以下条件 的response 将被允许,其它的将被阻止。$ |- x0 M$ D( o0 F' ~' z
- all those without "Set-Cookie" header ;
% F0 C* T& |9 p9 M# p1 H L" z' c- all those with a return code other than 200, 203, 206, 300, 301, 410, d( q! @% C5 n+ E3 k3 D
provided that the server has not set a "Cache-control: public" header ;8 @1 L# |2 \4 I. ]
- all those that come from a POST request, provided that the server has not
' X* l$ c) O- n' C4 w& Jset a 'Cache-Control: public' header ;7 U. V5 Q6 O! d! V6 A- _4 @
- those with a 'Pragma: no-cache' header) V1 h1 M8 t# U0 Y2 {+ c0 t
- those with a 'Cache-control: private' header- m' ]- K4 W7 |% G
- those with a 'Cache-control: no-store' header
7 s* r( i) H( N* T- those with a 'Cache-control: max-age=0' header, m0 m# K! N6 [ f( W% t
- those with a 'Cache-control: s-maxage=0' header
, _! c$ n" ^1 H+ v2 _- [- those with a 'Cache-control: no-cache' header
% @1 R5 v$ d9 j' P- Z3 B2 I- those with a 'Cache-control: no-cache="set-cookie"' header
- A! g; \: Q( o9 y% b1 W/ z" _- those with a 'Cache-control: no-cache="set-cookie,' header; n0 L) O/ e6 i6 C+ B/ \& y* u; K
(allowing other fields after set-cookie)
! }2 n. u2 M4 e; c7 N0 @/ `- {2 A5 a+ R- n" B
option clitcpka 是否允许客户端发送tcp keepalive 包,这个和http 的keepalive 没有关系8 @) ^6 C" E0 M2 a, h
option contstats 允许连续的流量统计更新" M' W7 g K/ w9 J- t- ^ c
option dontlog-normal 开启正常连接的日志
7 |* ?. g: _& v/ k! i1 Z( C, d7 coption dontlognull 记录空连接
/ n! H0 g" ~5 j# y9 O* Ioption forceclose 允许关闭session 在后端把response 发送后7 z9 ?- {: f: g" Y7 U' `1 }
option forwardfor [ except <network> ] [ header <name> ] 允许在request 中加入X-Forwarded-For header 发往server$ R/ B, f; C6 M" Z7 A* S
option http-pretend-keepalive 定义是否haproxy要宣布同server keepalive- }2 P2 s( a' K: z
option http-server-close 是否开启在server 端 connection closing0 r( ~ r' n4 N0 Y
option http-use-proxy-header 用non-standard Proxy-Connection 替换 connection
+ I; e) [3 k+ B" R, K# \$ m# ~* _1 Z/ _0 B w1 u7 h
6 ^: _; D$ e1 s2 k& L9 koption httpchk <method> <uri> <version> 允许用http协议检查server 的健康8 D/ p% ?7 d, f$ I' @1 q k
Examples :2 {# ?! D9 C$ X/ y& I. ~
# Relay HTTPS traffic to Apache instance and check service availability
; q+ G" `; M1 q+ d# using HTTP request "OPTIONS * HTTP/1.1" on port 80.
. S; A( i1 @! z4 {7 vbackend https_relay1 V9 e8 U4 z5 ~0 w3 z
mode tcp* H3 B9 j7 t! I; T* }: n
option httpchk OPTIONS * HTTP/1.1\r\nHost:\ www
, E- _+ g% A& @4 P" }server apache1 192.168.1.1:443 check port 80* m: F) c* v m2 x. n" ]+ E7 v
9 W8 y3 w- F2 g* i# K5 t
option httplog [ clf ] 定制日志格式
4 P5 ]. v) [! H4 ^option http_proxy 开启http 代理模式,只有最基本的代理功能
; z- l" |1 D1 S2 t" Woption ignore-persist { if | unless } <condition> 在某条件下拒绝持续连接,适用于对静态文件的负载均衡) `; n3 Y1 r! U
option independant-streams 启用双向超时处理,如socket 的read 和write
% R. M$ R$ C6 J8 g( b% [( Aoption log-health-checks 记录健康检查日志
" `% v* r4 Z: v4 H+ b. }( Q; poption log-separate-errors 对非完全成功的连接改变日志记录等级
. ]! y( ]: X' a# p8 X4 i8 F4 ]option logasap 大传输大文件时可以提前记录日志
+ l* I- y& q+ d0 ooption mysql-check mysql 健康检查
0 p: [! l/ t& v; Y8 S0 a8 A. Toption nolinger 清除肮脏连接后开成的tcp 状态及占用的资源,不过并不是强列要求你用这个选项,当然如果你有thousands of FIN_WAIT1 sessions on your system ,那肯定得用了$ n/ _! e3 x4 N! C" r# T3 [
option originalto [ except <network> ] [ header <name> ] 允许在requests中加入X-Original-To header 发往server9 ~4 M9 a" ] P! e( E/ {% M6 `+ l
option persist 强制将http请求发往已经down 掉的server
; I) c6 W9 ^+ b! V( r! K9 doption redispatch 是否允许重新分配在session 失败后
% y& D( Z I- c1 F+ F5 D& o& Roption smtpchk smtp 检查% d6 T) x% x$ L1 N, Q- P
option socket-stats 允许对单个socket进行统计% ~- j( R: ]# m1 N" @3 S5 }
option srvtcpka 是否允许向server 发送keepalive+ m% O. I4 e& }" c0 [2 T* t
option tcpka 是否允许向server和client发送keepalive
, ~, T- [; m4 K0 d. j3 g/ _option tcplog 允许记录tcp 连接的状态和时间
% X+ }5 l9 _ Q' J& }2 j2 Foption transparent 允许客户端透明代理
9 \& {$ |0 F7 s8 W5 b4 ?( Nrate-limit sessions <rate> 设置frontend 每秒处理的连接的上限,如果到达上限就停止建立新的connection: M: [. y; C" l( c
; ]' C* b* r' K# v# g) S
redirect location <to> [code <code>] <option> [{if | unless} <condition>]+ h `, k0 f# c6 m! `/ b$ m
redirect prefix <to> [code <code>] <option> [{if | unless} <condition>] 重定向,相当于rewrite
4 G g. P& M! ]- v' D3 b; z9 P2 @" D0 p$ W& i) S0 R7 ~5 c f
Example: move the login URL only to HTTPS.
) \2 v9 J; Y0 I* W1 v9 Macl clear dst_port 80- W$ s# w8 c) q2 \/ }2 } }' N
acl secure dst_port 8080
) a4 I' d$ h6 r- uacl login_page url_beg /login
$ Q+ v% O1 p E t' tacl logout url_beg /logout
/ n/ C, ~) V' K( z+ c9 I2 P. [" pacl uid_given url_reg /login?userid=[^&]+ t) r3 t9 P) j9 @1 X
acl cookie_set hdr_sub(cookie) SEEN=1
& X& j5 v2 y) T0 F2 D9 Q* F
6 b0 y9 p2 o. l6 G( e% `+ M9 F6 sredirect prefix https://mysite.com set-cookie SEEN=1 if !cookie_set; @0 H+ b3 u$ e; }
redirect prefix https://mysite.com if login_page !secure3 m( g' N/ G Y" G- }
redirect prefix http://mysite.com drop-query if login_page !uid_given
9 |0 ]3 l: l1 yredirect location http://mysite.com/ if !login_page secure
5 q. W% r& o% T9 C! B6 i! |redirect location / clear-cookie USERID= if logout
: A% j5 k0 W4 |( H
! I, O) o. s8 F/ Q9 U6 _Example: send redirects for request for articles without a '/'.
# l6 A! H0 v/ Eacl missing_slash path_reg ^/article/[^/]*$
( X5 J: y) K3 P" r0 b8 \6 Oredirect code 301 prefix / drop-query append-slash if missing_slash" v7 [1 s0 [& F( j( p6 t
redisp (deprecated) ~8 r0 Z2 X( w: l
redispatch (deprecated) 开启session 重新分配在connection连接失败后,不赞成启用5 r& O5 c% |- `
reqadd <string> [{if | unless} <cond>] 在http请示的末尾加上string: `& u0 b) e$ l
5 [3 I+ {$ ~# v' yExample : add "X-Proto: SSL" to requests coming via port 81
3 T% f/ M5 E% b( n9 yacl is-ssl dst_port 81
3 ~% P' X# N! Y5 v- R' breqadd X-Proto:\ SSL if is-ssl
/ Q& M$ n; d" L3 K2 T5 K7 A A& @. H7 o, X) e5 ]
reqallow <search> [{if | unless} <cond>]
; u. R) M9 u% P/ t" g" areqiallow <search> [{if | unless} <cond>] (ignore case) request 请求访问控制8 G4 r `3 m" D. b5 E+ {
) Y6 s+ P/ [0 fExample :0 [: t; ]1 r2 F h! N) j5 J
# allow www.* but refuse *.local
4 @* g+ `% |+ |, L7 y; Oreqiallow ^Host:\ www\.# _: U2 A: @& s2 r
reqideny ^Host:\ .*\.local
( i/ g# Q: k( b/ D! g6 ^: g* T2 \7 Z0 f1 j$ K" f
reqdel <search> [{if | unless} <cond>]
; { \% S$ W4 v: Oreqidel <search> [{if | unless} <cond>] (ignore case) 删除请求的head 中的内容
$ i, S$ T1 _' b! c) c, O/ c4 `* L9 Q* G. Z( ^5 H) c
Example :
& x+ q9 U: w3 _1 F$ Y: ~" s# remove X-Forwarded-For header and SERVER cookie$ E# p8 W( m- S: b0 \
reqidel ^X-Forwarded-For:.*/ A) l- h3 ?0 X
reqidel ^Cookie:.*SERVER=
) i" a; P3 l8 q5 `. e1 t4 q# `0 T3 x) ]. | o* r9 C! z. i
+ b9 V) B: N& F8 X+ ?
reqdeny <search> [{if | unless} <cond>]
/ P4 `- k( ]* s5 G+ Mreqideny <search> [{if | unless} <cond>] (ignore case) 拒绝访问
# ^( \+ P: X5 b( J* m% I4 O& g0 M2 A4 { o% o
reqrep <search> <string> [{if | unless} <cond>]
* l' H# w1 N! t; Hreqirep <search> <string> [{if | unless} <cond>] (ignore case) request 请求替换
$ S- l% ?8 C8 j9 ~# U1 x9 K7 NExample :) K6 t- ] m: V. a' d
# replace "/static/" with "/" at the beginning of any request path.$ l; i8 d7 L( G1 F `( G, l
reqrep ^([^\ ]*)\ /static/(.*) \1\ /\2
) ^- ?9 m# a/ C3 K: t! K4 g# replace "www.mydomain.com" with "www" in the host name.
5 Y3 X0 s5 Z( ]$ G+ w& G( ?# |reqirep ^Host:\ www.mydomain.com Host:\ www5 r* S& W. L& p6 a! m" V
5 C4 d' P& O! C3 W
reqtarpit <search> [{if | unless} <cond>]
. j: I- I, @% treqitarpit <search> [{if | unless} <cond>] (ignore case) 阻止http请求中的某些信息) h; W: b7 W% L/ e8 O
5 @0 [0 I/ h& LExamples :
' \" ^* b7 o$ d% q# ignore user-agents reporting any flavour of "Mozilla" or "MSIE", but
% \$ Y# s7 n/ d) K5 ?/ S, q6 X; Z# block all others.$ H8 I/ A! F$ q7 A- {. J
reqipass ^User-Agent:\.*(Mozilla|MSIE)4 g2 m( c" Z1 o* N9 H- S
reqitarpit ^User-Agent:
; ?+ M/ l/ d, c+ Z+ N) K
; F3 O) \$ S3 D: D% }) f' M# block bad guys
! j- ~! p# w$ L% x$ ~: iacl badguys src 10.1.0.3 172.16.13.20/286 a9 B+ G. V/ m: b# n# s5 y$ t
reqitarpit . if badguys0 l4 q0 h4 g! @5 t3 {
8 M! \3 K3 F2 \$ z/ c
retries <value> 当对server的connection失败后,重试的次数2 f2 v9 ?2 l, q% G* y
rspadd <string> [{if | unless} <cond>] response 增加信息! I( }' f T W# X
rspdel <search> [{if | unless} <cond>]' A4 J8 B0 \* Z% L' e, V: ]
rspidel <search> [{if | unless} <cond>] (ignore case): {8 j* b) Y5 l! B8 J
rspdeny <search> [{if | unless} <cond>]. ~- ~6 w/ E3 c. P7 I
rspideny <search> [{if | unless} <cond>] (ignore case)
& b8 O5 b9 U; Hrsprep <search> <string> [{if | unless} <cond>]
# p( k, L9 Z' s$ Srspirep <search> <string> [{if | unless} <cond>] (ignore case)) i6 z. g$ y& X w6 x6 O$ i6 E% v
以上和request 的差不多
+ {9 u {; `, S' ?8 g/ `
6 ^/ K8 _: O8 x' N" _* csource <addr>[:<port>] [usesrc { <addr2>[:<port2>] | client | clientip } ] 定义从代理出去的连接的对象,用于限定地址可以访问server4 S0 V! l& P, I |
0 e1 w9 E' g( i+ \5 ^
一些timeout
/ h1 y% a7 c7 q. M; @8 r6 ~- b& t
srvtimeout <timeout> server 处理超时,不赞成设置
1 f6 V- w- \( ]# c7 B3 W& |timeout check X - X X
" i/ e5 T" }5 H) t0 Utimeout client X X X -
& Z7 D1 R! T% U9 otimeout clitimeout (deprecated) X X X -
0 I( u' {) I3 x, r+ }2 Wtimeout connect X - X X
7 g4 P- A. C8 M4 btimeout contimeout (deprecated) X - X X; m1 ]% F+ r: l; [- R: ^
timeout http-keep-alive X X X X, e1 U, N* @$ ^- u) V8 `* t# ?( U
timeout http-request X X X X) @2 z6 {$ ~ ^: B( G' B1 N
timeout queue X - X X
& H5 ^4 d: l; w) V* @$ M0 k; gtimeout server X - X X
* s, C) t; j: H& ?/ gtimeout srvtimeout (deprecated) X - X X
9 s9 @) d3 ?4 {9 H0 ~timeout tarpit X X X X
: b0 ~. x3 q9 c# k3 g/ V( A8 r$ a4 D# e. p8 c# B
( y7 G2 _, J- s
stats auth <user>:<passwd> 监控统计的帐号和密码+ j/ Q c, n `9 a+ I5 D( ]6 s
backend public_www$ R$ M; k; d# A. Z! w# N% r
server srv1 192.168.0.1:80: M2 G# @! E7 Z6 t
stats enable
' d! S9 @# h- }* ystats hide-version
# s& X/ [6 h* w& f& \3 ~stats scope .4 o8 d( [( c+ m s, O: v$ q x% m1 Y
stats uri /admin?stats
2 z) j$ _" N% ~2 Istats realm Haproxy\ Statistics1 J$ T% w* n. g& z8 b' s& x
stats auth admin1:AdMiN123' h/ w$ X5 Q D2 ~. J+ z
stats auth admin2:AdMiN321
% t d) Q; k( Y. |
' G9 Y' R) T' M R* Z- Z1 o# internal monitoring access (unlimited)
$ a2 ]+ ^! Z; i9 ?% Ybackend private_monitoring
/ y/ M9 W. T+ r' gstats enable: P0 B5 }* K6 k* Y- a
stats uri /admin?stats
0 ?- \- T' r/ K1 d4 V) `stats refresh 5s$ E, w, G, |' f5 K6 c* ]
# \+ Z: [4 p) A, ?$ v
还有很多参数,以上能用到的也没有几个,只要满足当前需求就好,对于性能要求高的话,建议把不需要的功能 都关了吧.. H- @, H$ {3 v( ^& r$ W
, d5 S; [+ ? H n, X====================
& g. ~* J' ^, H1 t# Q% m! j
% t, L* U' p6 T# R2 M5 ?. uHAProxy的配置示例& q) T! i9 V: K, d+ l
7 n7 Y6 S: Y% R# v0 p
HAProxy配置中分成五部分内容,当然这些组件不是必选的,可以根据需要选择部分作为配置。
# Y' w4 T+ u* V, a5 Yglobal:参数是进程级的,通常和操作系统(OS)相关。这些参数一般只设置一次,如果配置无误,就不需要再次配置进行修改! g2 i+ s, Q" f7 b9 D2 Z. [
defaults:配置默认参数的,这些参数可以被利用配置到frontend,backend,listen组件
+ E# u( y# J9 g6 V8 U# l0 Rfrontend:接收请求的前端虚拟节点,Frontend可以根据规则直接指定具体使用后端的 backend(可动态选择)。
3 ~7 W' Z( {$ Cbackend:后端服务集群的配置,是真实的服务器,一个Backend对应一个或者多个实体服务器。0 d3 k i$ _& }2 A1 b& C7 J
listen:Frontend和Backend的组合体。( J2 ~0 F9 h0 H- w
$ L7 @1 s9 ]0 w' n( y+ c" \
下面是HAProxy的一些常用的配置,这个配置是用来说明HAProxy的一些常用功能的配置,具体详细配置请查看安装目录下的doc目录下的文档文件,或者到http://cn.haproxy.org/下载中文配置说明文档" Y1 c9 S' [0 h; g& q5 ^* Y% T7 ~/ g
' M+ ^4 i* }: f- P- w* P
配置具体实例,后附说明:
+ F6 z7 l R7 G+ g
N6 t3 e' w5 A3 X" t& b. `/ Bglobal
: g# l8 M! ?8 F# H8 r+ Q
( X" H7 v. `$ i; l2 }% T5 \: }#全局的日志配置 其中日志级别是[err warning info debug]6 L( e# b, ~$ D% j* L/ r
4 v4 M% k5 V0 b, C) I#local0 是日志设备,必须为如下24种标准syslog设备的一种: 9 ^; n3 R1 [2 ]0 _+ g
3 E: j! W& p4 m; D. P) ^* _/ o0 _
#kern user mail daemon auth syslog lpr news
6 t5 z6 O# p2 c9 w
, i' a; x' A" P& ], r#uucp cron auth2 ftp ntp audit alert cron2
3 A- O8 p; N/ K" K; {0 T% C3 Q+ n
2 `4 [" ?7 m; I+ o$ G* e5 M$ u#local0 local1 local2 local3 local4 local5 local6 local7
3 e: Q9 @( B0 Y
( ]! }# {. r4 ]6 Y+ P0 W" }#但是之前在/etc/syslog.conf文件中定义的是local0所以
5 v' @, P% E! _* u! Q" S5 M, T0 o! M, A
#这里也是用local0' C/ G. s5 z# F' E4 L; W' g% i
9 Y& @5 l% Y0 vlog 127.0.0.1 local0 info #[err warning info debug]/ a7 q1 b" T( C% ^2 }3 j
9 h( Q# X; W: b* v. h( I#最大连接数# Q+ O! V; u' \0 U5 Z8 ?2 E! d
6 v/ I8 x' u4 s2 e: @' [maxconn 4096; w" N4 K; J# L6 X* ]9 S2 X
: q" C* h Z/ V7 X F7 Z6 z0 }#用户4 [! D+ v& ~7 x1 Z4 F* w
" K2 b2 P* z& L1 R+ ?9 ~8 x
user admin
' C+ R" n0 s5 N5 y+ N& Q1 [7 ~* A6 {! x* T0 b
#组6 y L2 j/ v2 `5 }2 _9 U
+ V9 V' Q# p- n+ T5 {6 C& N, Q3 N9 qgroup admin- [0 X$ g7 a L+ P/ V
4 L+ O3 y2 H$ M8 o3 R: Q
#使HAProxy进程进入后台运行。这是推荐的运行模式5 j6 T, m! V0 @9 k. w" O( J7 `* i0 \
/ W, ^4 C1 V" |2 L4 F
daemon
- ^* k, ^! T% g
5 G. e# J2 {# z% p6 {#创建4个进程进入deamon模式运行。此参数要求将运行模式设置为"daemon"
0 l# h" D6 v+ @" G1 X6 G# E/ z! f! P' z) ^1 Q3 K; N
nbproc 43 n! k4 R4 K! l5 k a
4 V" J% F, _9 z
#将所有进程的pid写入文件 启动进程的用户必须有权限访问此文件。) ]2 t" R8 K7 w, B' Z# D
4 {6 k( S; B. ` j2 wpidfile /home/admin/haproxy/logs/haproxy.pid
* [" i6 C# ?/ `3 {' q1 V+ A1 O- W
- o3 F! }5 o& J" p2 W1 Qdefaults
0 p+ q1 w; _. t+ b. [& T
; L, C* p8 A- h/ S" r#默认的模式mode { tcp|http|health },tcp是4层,http是7层,health只会返回OK$ D. {+ L- {$ Z% F' T
7 ~7 [4 R$ M0 W7 p" `mode http
9 b& e0 d4 ^/ A+ U5 H& G7 g% `" V; U: _
#采用http日志格式
( z# o3 i) U. o7 M D. M* u) ~1 S& l ]* U
option httplog
' \' a# v: _% L% [" C+ W4 r7 |9 F2 B, A" n
#三次连接失败就认为是服务器不可用,也可以通过后面设置0 d( Y$ w) I7 P+ e* } L$ W8 ~
( k/ s, R9 H: m7 D7 q9 zretries 3& j( o( T/ |' @# D) O/ p/ Z2 |. j
; q, w& ]3 K2 y! y如果cookie写入了serverId而客户端不会刷新cookie,7 |8 j3 E0 |. Q0 i8 _
/ j1 k y# b- ~: F; u" L& T#当serverId对应的服务器挂掉后,强制定向到其他健康的服务器3 }; U2 o" z: z2 _0 X
! H, y% F& i/ O0 Q" \option redispatch
. e" ` P% C3 w+ O0 R- F* C' {' J% d4 S% @2 L
#当服务器负载很高的时候,自动结束掉当前队列处理比较久的链接5 O. X* R. l* b8 P a+ t3 Y
( ^! b5 K- Y6 ?5 |/ E* Doption abortonclose
5 q, M% I3 Y9 k4 O' Z
/ ~- h1 f3 L# t5 Z, w#默认的最大连接数- F$ T8 X7 _3 e7 s- ~3 S: y
# G! V, l8 b# V/ q! bmaxconn 4096
& V" a6 o' a* a. z- I r# c; V
' k" g1 a3 T! ~! w2 ]6 u4 u#连接超时/ g l7 u1 ~, \' N* n
" N8 X: G0 b: [7 C
contimeout 5000) z$ n4 J }4 \
, K3 u K5 m0 r+ ~
#客户端超时. }8 {( H& ~' j- ] z, M
; J) }8 ?( Q, Y& H8 N( F) g
clitimeout 300004 n) l; j" @% c% d
4 I) U9 t) b9 n/ G#服务器超时% {0 a2 i N% l$ G6 M
2 I$ Y2 S# k; `8 lsrvtimeout 30000" n1 l. Q! e' z; D' p1 N
9 i# u' k2 n9 l& _#=心跳检测超时
' E# d" L% [6 F( ]9 c) _- R/ s& o" o
) j6 F F2 T2 ~timeout check 2000' {& R5 ?) [ n( `* t- A
3 Y u; K: K% V" j
#注:一些参数值为时间,比如说timeout。时间值通常单位为毫秒(ms),但是也可以通过加#后缀,来使用其他的单位。
, u5 E8 F5 F. R3 e6 S: r& ?' M: C3 U# C0 W
#- us : microseconds. 1 microsecond = 1/1000000 second$ ^* } \2 M/ k! o
3 B. q8 |/ k7 q, W L% q, p. I
#- ms : milliseconds. 1 millisecond = 1/1000 second. This is the default.9 v6 m! E; S' i* i- M: W
$ {$ H9 ?: Z! p+ o( P. A$ v
#- s : seconds. 1s = 1000ms
. m- I) x& s& e+ J2 k1 G* N' I6 C7 z
#- m : minutes. 1m = 60s = 60000ms! j; [9 \' X; K, t4 X1 x' Q' {
) N: I/ k D% z! M( `0 _4 x
#- h : hours. 1h = 60m = 3600s = 3600000ms
3 j Q& F; X/ m. }" j, z7 g
2 ?2 ?, `1 b) m4 N" R0 E9 \' p#- d : days. 1d = 24h = 1440m = 86400s = 86400000ms
' A+ f$ v6 X% @! r- |+ C! O7 d0 J1 h. q8 x9 h' `" z2 |7 s
########统计页面配置############# ]7 h. t2 B6 e( B8 A* D# o
: a' f) ^6 w. z3 }listen admin_stats
7 R3 }7 t% c& o, b1 u! O0 k. P" m E' g
#监听端口# z9 C$ I& A d3 \
* P5 M$ r; s% e9 G% rbind 0.0.0.0:1080# B* ^8 |7 I1 M Q
8 B: J- q) [ y [9 t#http的7层模式
% k, v" g/ o% q M0 F! t3 x& f# q$ [1 S2 H; E3 u8 P, r+ E/ n
mode http
" {. Q: l: P% Y
9 ~9 [4 e0 P( |$ Z( r1 V2 {# J# v#日志设置
1 s6 B3 H# Q6 ?0 k& \' |' a5 J C* B$ C8 {9 x+ T; s2 p c& D
log 127.0.0.1 local0 err #[err warning info debug]" s& q; b2 R4 Y' S
6 U p% M/ q# V! U1 r
#统计页面自动刷新时间
4 X! ` z0 v# d; h' C" u( _! R* d3 k) Y
stats refresh 30s1 g1 O0 Q# W6 E$ q h* f
/ N% z; t c8 |% U#统计页面url
& M3 x6 v7 r1 R$ i3 y3 p/ |4 \+ H7 g/ l6 U: g* Z5 D
stats uri /admin?stats
: B* u* _0 Z3 b, X8 u0 h1 O- b2 A: ]* \1 l
#统计页面密码框上提示文本; F1 m U' v0 r- B0 J8 o/ X( _! V$ V1 j
- b) L/ w R" Y v9 J
stats realm Gemini\ Haproxy9 o+ Q( j( Z% {' j* q
: G j3 b9 H, ^& p) Z! E' u) F# c#统计页面用户名和密码设置) t, z9 K9 o2 ?1 T! J. m; v
* m$ N+ @/ u! {( X, c
stats auth admin:admin8 o- g/ b; B5 q; z' O/ A% U
6 L/ d1 e& k/ l0 [ Z2 A7 Z8 ~6 J
stats auth admin1:admin1& c" D, J( f8 q
( d5 v; u8 ~0 Z2 G* Q#隐藏统计页面上HAProxy的版本信息$ }# d: Y5 o5 r* O+ Z
5 a2 _0 `! _* p" K9 L* B+ o" ], @3 `
stats hide-version
1 V; B& p- K7 k0 }/ A' D
" U: X z8 I5 L1 b% F: z#######网站检测listen定义############9 M" s2 m8 q# ]0 w: T
2 I$ L; B, v( d- tlisten site_status: @4 o; H# Q( }, B2 z5 a
" w6 d3 F( a, W8 a7 `
bind 0.0.0.0:1081/ @4 ?6 R" h2 Q$ {$ _- z& ^2 g
{7 A+ a2 g) h3 Hmode http
- ^3 P& P. U( m+ T* L+ z. n6 M9 [
' Z U5 T" i8 }1 j4 Vlog 127.0.0.1 local0 err #[err warning info debug]: _+ K& w4 Q2 S2 V
3 y$ K! R; r9 T) J7 V#网站健康检测URL,用来检测HAProxy管理的网站是否可以用,正常返回200,不正常返回500
- z" A% P7 t) X" r
; w, k' J3 ?. T! v; J$ K1 u4 Tmonitor-uri /site_status. v1 c4 A" Q1 c2 ~
, k& Y8 J: u( c* ?& e0 D& m a' s
#定义网站down时的策略$ G) t4 ^0 Y% r, k% |
" \+ @2 }4 x* ?2 d+ \( A, b
#当挂在负载均衡上的指定backend的中有效机器数小于1台时返回true
1 {) p7 h& v! [% v
% p: t' Z5 T; H3 F- a' E5 hacl site_dead nbsrv(denali_server) lt 1
; |3 Z4 j( S5 z" Q- U' D% _9 S; w$ c1 ]5 y' x
acl site_dead nbsrv(tm_server) lt 1
. y. E/ r; g& R
. t4 |6 k3 _1 w% X2 J0 xacl site_dead nbsrv(mms_server) lt 19 i6 }" n6 N/ g5 k
5 Y/ C8 G5 h' r2 O) E: Q3 J
#当满足策略的时候返回500& O5 [. y+ P+ m3 ]9 C$ t
) W7 e1 h0 L/ R, \# omonitor fail if site_dead
$ d- y/ |6 B$ S$ ~
! W* @" D- f3 r#如果192.168.0.252或者192.168.0.31这两天机器挂了2 g$ d2 ]0 M3 Z7 q
0 S5 a! E a6 L#认为网站挂了,这时候返回500,判断标准是如果mode是
2 `* ~6 k8 f' L7 ]: ~; f
# ^3 o( W8 f2 _; y6 b7 }3 ?#http返回200认为是正常的,如果mode是tcp认为端口畅通是好的
5 J1 N* n+ x& j7 V) Q. [
& n; c' s; S0 dmonitor-net 192.168.0.252/31
5 s! q0 d# f8 U# {" _/ `) l. ~% c( }! `: f) E
########frontend配置############
+ n0 i5 `& ?0 A* D. k, X/ `: b; y- t9 k) k) E n, d8 K
frontend http_80_in
6 q7 `- g' I2 Q a; }0 p9 k2 z8 |3 L9 {0 a- L3 l
#监听端口; i. O& z9 S& I& _7 t
3 o% Q! j! h; J
bind 0.0.0.0:80
7 [0 _' z& B4 f. ^3 _
+ m e ?0 @& Z8 S' Z% A! s/ o#http的7层模式
4 r5 R# ^$ h, }3 R1 \0 y2 k4 }9 q7 S5 ^# H
mode http
) Q5 h W9 I8 \
" R; M& ?# \% B1 G2 r" X#应用全局的日志配置
z# w, v/ ]+ d J5 Z& P" [, k# a" q
log global2 [: Q. v2 c/ C! P! u3 ?
. s" y o, P8 k; a: V#启用http的log4 d- m2 I! Y+ W2 x. e7 q
4 H6 z5 F. |+ T9 z( k" Aoption httplog
% r( L2 u8 S7 j; d U; V1 X" ?3 T$ i, S0 ~9 Y5 b5 z5 D1 n8 d
#每次请求完毕后主动关闭http通道,HA-Proxy不支持keep-alive模式) F: @3 X) [8 P w
, j4 E M8 D9 z9 A: }- z
option httpclose& D% J# N% ^& J3 D7 ?
% W+ ?- o# o) \0 B9 w#如果后端服务器需要获得客户端的真实IP需要配置次参数,将可以从Http Header中. h. O% V( H. d4 A2 W( q' y
+ a# @& D2 b% L2 s* l8 k0 u5 D- i#获得客户端IP
& {5 }0 E3 X3 q; L- E0 ^7 x7 p! \+ Q1 n3 u6 }( i
option forwardfor
) m, P$ A3 ^8 |0 _9 ~( P& v
) d; j& C6 |+ T% g###########HAProxy的日志记录内容配置##########
8 M) f5 M0 h9 v
, J9 {. b) h- k( P& _" hcapture request header Host len 407 }7 n. G& Y3 c- F
$ P0 y8 Z/ M$ K6 x2 E4 N7 q
capture request header Content-Length len 10
& C K4 D$ w5 @, Z* A2 x
, S" G* b$ B$ S& c$ j: ocapture request header Referer len 200& Q8 ^4 h- X/ B
$ P+ s# k2 X0 Ecapture response header Server len 40
% q: q8 Y$ D# o0 E. O7 b* S. W4 ]/ O) J7 F. N
capture response header Content-Length len 10+ X+ f$ X- n2 I6 |$ z) q
% ^7 @, p7 t9 xcapture response header Cache-Control len 8# ]$ m# q0 T9 R! ?
~# g" L2 g6 t, q' J####################acl策略定义#########################0 v( O. B5 M1 n% q- ` H# d
q- C) \1 }$ n2 j7 r3 s0 R, K T' \#如果请求的域名满足正则表达式返回true -i是忽略大小写
2 g1 x( B1 I; i1 D9 e$ d
) N- ], R3 w/ x! |+ Aacl denali_policy hdr_reg(host) -i ^(www.gemini.taobao.net|my.gemini.taobao.net|auction1.gemini.taobao.net)$
5 D) i% G4 i' r
" @, S6 M: Y! u* m#如果请求域名满足trade.gemini.taobao.net 返回 true -i是忽略大小写, L3 M3 l+ q6 T, _% L& v/ P4 z/ s
8 P& u1 X% B L8 m( |7 r
acl tm_policy hdr_dom(host) -i trade.gemini.taobao.net
8 \# H' \- ], j; \3 \9 m& ~7 d
- {- _% m" G7 m3 J##在请求url中包含sip_apiname=,则此控制策略返回true,否则为false
( l& L2 W' Q: `, I+ ~" n. C o7 v) Q5 M
2 \2 s/ | D: Hacl invalid_req url_sub -i sip_apiname=
9 Z& z4 z* I/ R( n, F; r# D# W
" ?% W) q. w- m) `: }##在请求url中存在timetask作为部分地址路径,则此控制策略返回true,否则返回false
$ Y, A1 v( A E) j1 W$ _! R- U0 v% H Q( s! h' q A3 e
acl timetask_req url_dir -i timetask
) `# s$ Y8 X0 E( J! s
# ?4 E8 Z8 |$ _- Y- ]: A#当请求的header中Content-length等于0时返回 true$ J6 n( P1 ~ U, ]% o$ s* \1 z
' T- \) v4 ~4 P5 i7 \acl missing_cl hdr_cnt(Content-length) eq 0" | \ r9 q: @3 J8 d
, D0 J+ m- Z' H8 q! f. U* e
######################acl策略匹配相应###################0 l- ]* m5 D+ ~
9 N7 N# f" T {$ p, p3 C; U##当请求中header中Content-length等于0 阻止请求返回403/ c* z+ S% {7 W8 {. r( n5 c9 I
5 S8 _# {, h' i8 V$ }block if missing_cl" b, T* x* w: g# X: S2 |! ^" Q
$ R3 |+ X$ u$ {1 o0 i: P##block表示阻止请求,返回403错误,当前表示如果不满足策略invalid_req,或者满足策略timetask_req,则阻止请求。
* g- D' v% @/ S3 x
: i/ h H |, v' j/ M' s2 @/ Xblock if !invalid_req || timetask_req
* C# M, T* ]- k: U
3 o) _' c. m' L, R#当满足denali_policy的策略时使用denali_server的backend
) p( \, m8 p6 L2 N: Y8 ?& K$ G R
use_backend denali_server if denali_policy6 s9 M, p% s7 C! l. E
7 ^ \" |: J4 M& @( f
#当满足tm_policy的策略时使用tm_server的backend
6 I# g0 X q( l0 x8 Z* O% O
: d) ?6 y# L6 G; s1 q2 W' I* U# buse_backend tm_server if tm_policy
+ g L1 r+ i$ G4 _; X) q v6 i
* K/ v/ }3 L+ [) X4 G#reqisetbe关键字定义,根据定义的关键字选择backend' d; t# u. e6 p% ?2 r
. T+ t9 U; J$ r% R
reqisetbe ^Host:\ img dynamic8 K; |, @# S$ V
# P9 I/ O& |3 E. M* Ireqisetbe ^[^\ ]*\ /(img|css)/ dynamic% \* O, S3 P; f& u3 V. p4 |! [
; b. q2 m5 p% V6 vreqisetbe ^[^\ ]*\ /admin/stats stats( m; k) c9 Y- A' H8 i. r
: R* s0 a" W0 \7 V5 [* X8 V#以上都不满足的时候使用默认mms_server的backend6 B# {* |& Z! M, m a6 H, {
5 |* s+ W. v* z
default_backend mms_server
$ x5 K3 D8 e( {0 e$ Z' u
1 z( c8 z% D v2 s2 x8 r#HAProxy错误页面设置$ M( ~( G) l2 w7 `; A) V
: L* H1 I# F* U+ n- ^& g5 e
errorfile 400 /home/admin/haproxy/errorfiles/400.http& F) }8 U3 z" l" L
x1 v- x6 w' E7 ?& W* O/ E% C4 x
errorfile 403 /home/admin/haproxy/errorfiles/403.http
+ ^1 x: R' G/ j2 r
Z% p7 f3 Y2 T# t# x8 Oerrorfile 408 /home/admin/haproxy/errorfiles/408.http
5 g; f- D! X& o( `+ O9 H. k5 g" q8 v$ j8 u% q: D
errorfile 500 /home/admin/haproxy/errorfiles/500.http
, s8 n! O6 n- R& O8 H7 P
8 ?4 t' V6 j$ A3 H2 L1 Yerrorfile 502 /home/admin/haproxy/errorfiles/502.http% @( I# a6 p2 h/ R4 _
, ^8 M0 Y0 O3 T* T+ S
errorfile 503 /home/admin/haproxy/errorfiles/503.http
8 f/ o, J8 C& K! Q. F5 y+ _6 Z. I* L3 w9 I. U F* {/ D; J+ e* K
errorfile 504 /home/admin/haproxy/errorfiles/504.http
% n" f; W, d, a R8 e# ]" ]2 Z0 x+ Q' } C/ N; I2 ]
##########backend的设置##############$ Z* P1 }: Q3 Q
j8 p& k0 X; V) J
backend mms_server- w" }$ [4 p1 u: @' F( \
: O3 l! K/ w$ @6 P#http的7层模式7 L$ E" ?5 N J" }4 r) H& C+ D
8 p; h6 a& p- H9 Omode http1 d# p7 Y1 o2 E1 q
8 d: _ q6 _4 @, q. {) N* }
#负载均衡的方式,roundrobin平均方式
2 {$ B- S( K; I |
; D ` }) q& Cbalance roundrobin
* w( x, _/ `1 `6 G, M6 B
: m p- F2 }* Q5 ^+ [* X3 E#允许插入serverid到cookie中,serverid后面可以定义3 M3 Y8 D6 P- z0 g4 c# C
$ w/ V2 q. z- z
cookie SERVERID" D b& X% D7 A! \& s
n/ @! |7 R9 p) x# w/ X* V
#心跳检测的URL,HTTP/1.1¥r¥nHost:XXXX,指定了心跳检测HTTP的版本,XXX为检测时请求6 D' V$ l: a O3 v' @: Z( P
! u8 t% G8 y' t7 O
#服务器的request中的域名是什么,这个在应用的检测URL对应的功能有对域名依赖的话需要设置
6 R' q. y- G6 U" x; }
1 M8 c6 Y" _* L/ {option httpchk GET /member/login.jhtml HTTP/1.1\r\nHost:member1.gemini.taobao.net
9 ~9 e, K1 R: U: a% |- b
- b G$ s$ @5 K5 p* A% \#服务器定义,cookie 1表示serverid为1,check inter 1500 是检测心跳频率4 y7 {/ i5 y5 d( D. J0 z
8 D$ a; J; _( g% n& e0 L#rise 3是3次正确认为服务器可用,fall 3是3次失败认为服务器不可用,weight代表权重
" d9 g$ R; o% `( a: i T6 M4 d V* b) |
server mms1 10.1.5.134:80 cookie 1 check inter 1500 rise 3 fall 3 weight 1
- F* Q! {/ I% _
& B7 U+ `. |& ?; P# m, s s6 oserver mms2 10.1.6.118:80 cookie 2 check inter 1500 rise 3 fall 3 weight 2: f" \ X& y* S( J. v% I/ I
2 J( E. O, c" V! Y1 f
backend denali_server
/ z2 @) K3 }- v6 c# j. j
& H5 a/ h* Y; @5 smode http0 e4 ~: v) h, O Y) H
/ w0 p1 S1 P$ B0 G; w' t
#负载均衡的方式,source根据客户端IP进行哈希的方式
* U6 x9 K! }; }% [% X( ` }& H& |5 w2 t' N7 g8 T9 p I
balance source
$ K. ^4 n9 |9 o( p" ~% B+ x7 [. K- e) j8 V( J
#但设置了backup的时候,默认第一个backup会优先,设置option allbackups后$ o4 ]7 \8 q" {1 S; }3 c* ^
' t+ T. j8 D' A6 I" p; O, c#所有备份服务器权重一样8 J5 f0 h" D7 C6 m. u9 T9 \3 \
" X' d9 _& j4 Z2 Hoption allbackups
% |6 b# v8 P' L- h* i9 S$ _( b( E' m0 T v' _6 W
#心跳检测URL设置
# d3 K6 x$ c/ m
4 a* K% |+ v* v. uoption httpchk GET /mytaobao/home/my_taobao.jhtml HTTP/1.1\r\nHost:my.gemini.taobao.net
- L) { ~+ w) w9 Y$ H" P! e1 o& V* L; G+ @$ R! l v& z2 w
#可以根据机器的性能不同,不使用默认的连接数配置而使用自己的特殊的连接数配置9 B6 B5 E. \& D4 L3 }
4 s1 A) a5 m# K+ G/ K
#如minconn 10 maxconn 20
: ~% A9 B9 f* G: z7 o# ~$ d2 n( t* ^. O! y6 _
server denlai1 10.1.5.114:80 minconn 4 maxconn 12 check inter 1500 rise 3 fall 3
* n1 N5 x& g0 N& o2 N6 Q0 p4 P1 a% r- p, d
server denlai2 10.1.6.104:80 minconn 10 maxconn 20 check inter 1500 rise 3 fall 3, p! j8 q& w9 A6 C
* X% H+ H5 \+ G5 g* b0 R#备份机器配置,正常情况下备机不会使用,当主机的全部服务器都down的时候备备机会启用
5 `' S& L s: I& T: K1 m& C
" H2 h p* U2 h1 Zserver dnali-back1 10.1.7.114:80 check backup inter 1500 rise 3 fall 3
2 L2 n& F- Z( K" Z+ y* s
! F& w5 ]" d7 [% n/ \$ pserver dnali-back2 10.1.7.114:80 check backup inter 1500 rise 3 fall 3
" E' _# M: J3 R- m4 n' ?
2 O" N1 ?& [5 @( d/ }! `backend tm_server) J4 b' F: k1 A+ X5 c2 m4 @1 q7 ^: t5 `
- ?* e6 S7 m; e0 d/ kmode http
* u5 B) w! d" \7 O7 Q/ g! ~# V5 Y) U* f8 F4 y/ ?7 A. e
#负载均衡的方式,leastconn根据服务器当前的请求数,取当前请求数最少的服务器' }. a Q7 K% T9 R1 j5 g- q- J/ I
3 f4 A! p5 I5 s; Q7 _. H2 s a" p
balance leastconn
$ e: ^* _& A. E# g; o' H2 ~* c7 p, U* |3 i# L ^9 \0 c
option httpchk GET /trade/itemlist/prepayCard.htm HTTP/1.1\r\nHost:trade.gemini.taobao.ne( e4 w& \4 ~ {. t
( x5 e* S! _% v5 X4 zserver tm1 10.1.5.115:80 check inter 1500 rise 3 fall 3! v/ y/ z+ D0 L: K4 n
% P" t; N# q0 e$ H% J' ~
server tm2 10.1.6.105:80 check inter 1500 rise 3 fall 3
: v* }4 K' J8 f0 B' o" R0 M( l* f& Q( t' o
######reqisetbe自定义关键字匹配backend部分#######################
, s8 C7 p* B8 H; d3 E# N. d E( N
backend dynamic1 C+ z2 [( D4 q0 D
4 [2 ]% f3 u$ S! H- a9 qmode http
1 M6 C( C" f k9 p
6 C3 m* ~, R5 Y0 Zbalance source
4 z) ]9 q# Q: U5 x+ D' Y$ x2 p" ?
! x8 @( L( \& g. S6 U$ W2 {# j0 Zoption httpchk GET /welcome.html HTTP/1.1\r\nHost:www.taobao.net6 n2 Z% Z2 v) z5 u h" T
: s$ y5 T6 J$ x+ M
server denlai1 10.3.5.114:80 check inter 1500 rise 3 fall 3
$ H; }4 i) E7 {: O1 u
0 m$ t7 ~: c( x7 k, L0 Pserver denlai2 10.4.6.104:80 check inter 1500 rise 3 fall 39 `5 m4 v& F/ k1 v- p+ Y- O0 ?$ c
$ f, g* N3 Z% C( P+ v8 Y2 cbackend stats9 j$ e0 L. ^; V9 z
3 `6 l/ L* [& L1 K3 m% E3 T1 `3 Jmode http9 S$ A- U2 x& r5 f* I
+ S: G+ J ~, ]# Q
balance source7 W4 ]( O& a- ~: q b( h- K5 o
Y: H2 t0 L+ T- toption httpchk GET /welcome.html HTTP/1.1\r\n Host:www.163.com
" H8 `: K4 Y3 Z0 N( W: G! b9 Z) i1 w( h5 B: n/ { ~4 [, b B
server denlai1 10.5.5.114:80 check inter 1500 rise 3 fall 3
& D( _0 ~) a/ L8 k8 D- e9 s8 m7 l+ o6 x
server denlai2 10.6.6.104:80 check inter 1500 rise 3 fall 3 |
|