- 积分
- 16843
在线时间 小时
最后登录1970-1-1
|

楼主 |
发表于 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 |
|