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