|
常用配置选项: 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不记录上级负载均衡发送过来的用于检测状态没有数据的心跳包。
r/ M' x' g9 k I% J- S/ fBALANCE 选项: balance source :如果想让HAProxy按照客户端的IP地址进行负载均衡策略,即同一IP地址的所有请求都发送到同一服务 器时,需要配置此选项。 balance roundrobin :HAProxy把请求轮流的转发到每一个服务器上,依据每台服务器的权重,此权重会动态调整。最常 见的默认配置。
8 Q& j" a, o0 Q( k) C- `7 D3 iCOOKIE 选项: 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 :
0 d3 M/ z k8 F% e7 L [6 o
option httpclose
) i, K$ Z H" z( ^7 ?9 X. _no option httpclose
8 { U' {3 j0 p' R$ c Enable or disable passive HTTP connection closing 启用或禁止消极的HTTP连接关闭
2 Q" v7 S6 o% M- I May be used in sections : defaults | frontend | listen | backend" d5 Z; X/ h" C* j$ t3 X) E
yes | yes | yes | yes0 c. p6 o# w2 x. F: t
Arguments : none. Y ^1 z v2 J) ?
2 Z' O7 a5 Q2 M+ g' c. G 默认的,客户端与服务端的通讯,HAProxy只做分析、日志和分析每个连接的第一个request。如果设置了 "option* F( E8 k" Y& Q+ R, m. H B( q: [( P
httpclose" , 则会检查双向的http头是否有"Connection: close",如果没有则自动添加,使每个客户端或服务端在每次传输后,都会主动关闭TCP连接,使HTTP传输处于HTTP close模式下。任何 "Connection" 头如果不是"close",都会被移除。
1 ~- x) e! X4 k$ }/ |. m# L- H% v9 [2 r/ ~. \$ e* D- Y |8 _/ m d& m- O7 d
很少会有服务器不正确的忽略掉头,即使收到"Connection: close"也不关闭连接,否则就是不兼容HTTP 1.0浏览器标准。 如果发生这种情况,可以使用"option forceclose",在服务端响应后主动关闭请求连接。选项 "forceclose"还可以及早释放服务连接,而不必等到客户端的应答确认。0 x: C( C: P9 x
5 [) _+ h( K9 |; \, \& d
这个选项可以设置在frontend或backend上,只要其上可以建立连接。如果同时设置了"option forceclose",那么它比"httpclose"优先。如果同时设置了 "option http-server-close",则会实现"option forceclose"的效果。 option forceclose
8 w4 I. h- F1 C6 U0 [* H( Fno option forceclose Enable or disable active connection closing after response is transferred. 启用或禁止response后的主动关闭连接 May be used in sections : defaults | frontend | listen | backend
# S X/ o! [8 d4 S5 R v3 } yes | yes | yes | yes
, ~2 D% o8 I8 M: M% j7 y Arguments : none
1 f2 D- m# D4 t, X 有的HTTP服务器收到"option httpclose"设置的"Connection: close",也不会关闭连接,如果客户端也不关闭,连接会 一直打开,直到超时。这会造成服务器上同一时段内的大量连接,日志中也会显示较高的全局会话时间。 此时,可以使用 "option forceclose",当完成响应时,立即关闭对外的服务通道。该选项隐式打开httpclose选项。需要注意,该选项允许解析完整的request 和 response,所以可以很快关闭至服务器的连接,比httpclose更早释放一些资源。2 k7 e7 k, `! l7 Y0 [
如果同时启用了"option http-pretend-keepalive",虽然会禁止发送 "Connection: close"头,但是依然会在整个response被接收后,关闭连接。
$ D! A9 O% i# v) |
8 a0 q) u2 Q- P1 Y1 D0 N6 R" d% ioption http-server-close
- w$ ^% `& m* r& X; B" r/ G& \6 xno option http-server-close
, v. a3 K$ e' ?' n Enable or disable HTTP connection closing on the server side 启用或禁止关闭服务端的HTTP连接$ e |% i0 P) K# L
May be used in sections : defaults | frontend | listen | backend9 a% {1 D& r* ^; B; Q5 k ^7 L
yes | yes | yes | yes; \& f2 A; q7 K# O- ]$ h
Arguments : none5 w& I8 z% ? H5 ~% h. g
默认的,客户端与服务端通讯,haproxy 只是分析、记日志,并处理每个连接的第一个请求。该选项设置server端为HTTP 连接关闭模式,并支持客户端为HTTP keep-alive的pipelining模式。提供了最低的客户端延迟和最快的服务端会话重用,以节省服务资源,类似"option forceclose"。还允许无keepalive能力的服务端在keep-alive模式下为客户端提供服务,但是需要符合 RFC2616。需要注意的是,有些服务器遇到"Connection: close" 时并不总是执行关闭,那么keep-alive 则无法使用,解决方法是启用 "option http-pretend-keepalive".
- [4 i4 c/ t' y4 r5 U( g
, n7 o) K' _4 [ Y, J' o' S: X 目前,日志无法指明请求是否来自同一会话;日志中的接收日期为前一个请求的结束;请求时间为新请求的等待时间;keep-alive request time 存活请求时间为超时时间,绑定 "timeout http-keep-alive" 或 "timeout http-request"的设置。
0 u( h4 g5 t4 J 这个操作可以设置在frontend或backend上,只要其上可以建立连接。需要注意的是,这个选项可以与 "option httpclose"结合, 但 "option httpclose"优先级更高,结合后基本实现了forceclose的效果。
' d* I0 v3 q1 K, l% j* K3 l, Z! o) N$ e* {0 A/ B* v
option http-pretend-keepalive (http-假装-长连接)
4 X! Z" b/ {" }* a+ eno option http-pretend-keepalive: j- T! J& C* k2 ?! c0 r
Define whether haproxy will announce keepalive to the server or not 定义 haproxy 与服务器是否是 keepalive 的。
: m7 H# z: p# e' [* _ May be used in sections : defaults | frontend | listen | backend6 \& l% c+ z3 W; M% K
yes | yes | yes | yes' n7 p6 M0 S6 U2 n6 [, ^
Arguments : none
. m5 S4 ]. Y$ ~+ j& J, V, G: i 当声明了 "option http-server-close" 或 "option forceclose", haproxy会在给server的request头中添加 "Connection: close" 。然而有些服务器看到这个头,会返回未知长度的response,并自动避免chunked encoding,其实这是不对的。它会阻止haproxy保持客户端长连接,还会使客户端或缓存接收了未完成的响应,却认为响应结束了。, K0 ~( ?; F( d+ S7 D9 [
设置 "option http-pretend-keepalive", haproxy会在服务器端保持长连接,服务端则不会出现前面的问题。当 haproxy 获取了完整的response, 才会以类似forceclose的方式关闭服务端。这样客户端得到一个普通的响应,连接也在服务端被正常关闭。
7 i% @3 N' O, t2 ? 建议不将其设为默认值,因为大部分服务器会在发送完最后一个包之后更高效的关闭连接,并释放缓存,而且网络上的数据包也会略微降低整体的峰值性能。但是启用该选项,haproxy会略微少做一些工作。所以如果haproxy在整个架构中是个瓶颈,可以启用该操作,以节省CPU。: W* b9 H+ N$ s% U d
1 B R8 R& e+ v% O; D 这个选项可以设置在frontend或backend上,只要其上可以建立连接。这个选项可以与 "option httpclose"结合, 使服务端keepalive,客户端close,但并不建议这样做。 & k M5 _1 c$ d$ o7 k- f2 {& a
balance <algorithm> [ <arguments> ]. D4 K0 |1 \3 z) w& D ]; c7 L8 }
balance url_param <param> [check_post [<max_wait>]]
8 c0 Z1 m& |8 t/ z6 }: J 定义选择后端服务的负载均衡算法
C+ A- T6 b4 G May be used in sections : defaults | frontend | listen | backend
. p0 L6 N9 | l$ R. E a; B yes | no | yes | yes! @- d) z4 B; e \$ ] j9 K
Arguments :
& i. ^3 ~' D: u6 v0 `" ~, W <algorithm> 是负载均衡时选择服务器的算法,没有持续信息时可用,或连接重定向到另一个服务器。<algorithm> 可以是以下几种:% P- }! N' G, V5 N( A8 b: Y
roundrobin 每个服务器根据权重轮流使用,如果服务器的处理时间平均分布,这是最流畅和公平的算法。算法是动态的,对于实例启动慢的服务器的权重会在运行中调整。每个backend的活动服务器在设计上限制为4128个。在一些大的群里面, 当服务器很短的宕机后恢复回来,有时会有几百个请求被重新整合到群当中,并开始接收处理。尽管很少发生,但是很正常。这也说明了有机会监视它们,所以不必担心。
/ e) ~) R8 G/ b5 {7 s4 O8 n8 U2 u' r/ p
static-rr 每个服务器根据权重轮流使用,类似roundrobin,但它是静态的,意味着运行时修改权重是无效的。另一方面,它对服务器的数量没有设计上的限制,服务器启动后便会立即进到群中,整个分发方案会重新计算。这会略微降低CPU的运行(约1%)。
5 ?! @) u! h0 m
$ z c; U) Q8 ]* ~3 U3 V! C leastconn 连接数最低的服务器优先接收连接。Round-robin用于负载相同的服务器,使每台服务器都被使用。leastconn建议用于长会话服务,例如LDAP, SQL, TSE等,而不是很适合短会话协议,如HTTP。算法是动态的,对于实例启动慢的服务器的权重会在运行中调整。
$ |% m% M' w. }& t( e/ F
4 J( `6 K9 j- V3 l2 }; v source 对源IP地址进行哈希,用可用服务器的权重总数除以哈希值,根据结果进行分配。只要服务器正常,同一个客户端IP地址总是访问同一台服务器。如果哈希的结果随可用服务器数量而变化,那么有的客户端会定向到不同的服务器。该算法一般用于不能插入cookie的TCP模式。它还可以用于广域网上,为拒绝使用会话cookie的客户端提供最有效的粘连。该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是算法会根据"hash-type"的变化做调整。" t8 l" w6 t1 Q$ |9 v1 a
5 U6 k4 n% V( H( k5 r B
uri 对URI左端(问号之前)进行哈希,用可用服务器的权重总数除以哈希值,根据结果进行分配。只要服务器正常,同一个URI地址总是访问同一台服务器。一般用于代理缓存和反病毒代理,以最大限度的提高缓存的命中率。该算法只能用于HTTP后端。该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是算法会根据"hash-type"的变化做调整。
+ h, x/ C6 w/ Q- m5 \ 算法支持两个可选参数"len" 和 "depth", 都是后跟正整数。“len”参数指定算法只处理URI从头开始的字符数,据此计算哈希。因为大多URI以"/"开头,所以"len"最好不要设为1。"depth" 参数指定URI中最大的路径深度,据此计算哈希。请求中的每个斜线为一级。如果同时声明了这两个参数,则截取URI时必须同时满足。. C# y+ C( A% {1 a9 ^; s
9 H5 I! R) s4 t! y url_param 在HTTP GET请求的查询串中查找<param>中指定的URL参数。
7 ?& D4 h+ H" I" n# ] 若使用了修饰符"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被用了,则只能检查第一个块。如果参数值被块边界分隔开,则只能随机均衡负载了。! s4 ]' p: F* G7 X' h p
如果参数后面跟着 ('=') 和一个值,则可以根据这个值进行哈希,用可用服务器的权重总数除以哈希值,根据结果进行分配。
) C2 p) a/ ^1 w L0 J' ` 还可用于跟踪请求中的用户身份,只要服务器正常,同一个用户ID的请求总是发给同一台服务器。如果没有参数或参数没有值,则使用轮询算法。该算法只用于HTTP后端。该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是算法会根据"hash-type"的变化做调整。
* j+ z% f M; [9 m# g
6 Y7 A2 F$ r) R hdr(name) 在每个HTTP请求中查找HTTP头<name>。与ACL函数'hdr()'一样。括号括起来的头名字不区分大小写。如果缺少头或头没有任何值,则使用roundrobin算法代替。 2 ?7 N/ W1 C& j+ P5 U0 B
启用参数'use_domain_only',哈希算法将只用于一些类似'Host'的特定头的主域部分。例如主机值"haproxy.1wt.eu",则只考虑 "1wt"。该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是算法会根据"hash-type"的变化做调整。
7 l! ~0 P. b9 L+ F+ @& j* Q8 u/ T# k7 L& H% x0 P: s' w2 x" S
rdp-cookie
1 @6 g( ~! j R6 s3 { rdp-cookie(name)
) ~9 F5 \; G r. R 为每个进来的TCP请求查询并哈希RDP cookie <name> (或“mstshash”如果省略) 。与ACL函数 'req_rdp_cookie()'一样,name不区分大小写。该机制用于退化的持久模式,可以使同一个用户(或同一个会话ID)总是发送给同一台服务器。如果没有cookie, 则使用roundrobin算法代替。( f, F3 U- L" d B
必须注意该声明要生效,前端必须确保在请求缓冲中已经有RDP cookie,所以必须使用规则tcp-request content accept' 和ACL 'req_rdp_cookie_cnt'相结合。( U4 u: z7 a& Y$ u% B) A
该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是算法会根据"hash-type"的变化做调整。
4 c5 {' C, {: s& ]7 r6 @2 G! L! A
<arguments> 是用于一些算法的可选参数列表,目前只有"url_param" 和 "uri" 用到,例如:
( i' {1 r% e7 C! \$ F) P balance uri [len <len>] [depth <depth>]
8 y9 N% A0 k, D6 i balance url_param <param> [check_post [<max_wait>]]3 U! j7 s$ [# z5 ^/ Y
( Z$ L) ~$ x1 r; D 如果没有其他算法、模式或选项的设置,后端的负载均衡算法默认为roundrobin。每个后端只能设置一种。/ _4 Q2 H% G. b/ @$ w
Examples :
0 m& k: O( k* g# k balance roundrobin8 R7 \! K# e9 ?
balance url_param userid
9 f( f9 m/ R* {* [/ f: C& U6 G% Z balance url_param session_id check_post 64
/ E5 s& a. b% s' W: i+ i: Q; D* N balance hdr(User-Agent)9 L: h7 D4 V0 g7 ]
balance hdr(host)
$ u8 ^& s: D9 \) K$ u1 L% W% _0 r balance hdr(Host) use_domain_only
* ^( W* N% v8 {# g k
6 S) a+ U& C; P7 Z( T7 S 注意: 以下的警告和限制是使用“check_post“扩展和”url_param”所必须考虑 :
$ K/ L, {3 t' \, D - 所有POST请求都要考虑,因为在包含二进制数据的体或实体中,没有办法决定是否会找到参数。因此需要另一种方法,限制POST请求的体中不含有URL参数 (见 acl reqideny http_end) - 大于请求缓冲大小的 <max_wait> 值是没用的。在build时设置缓冲大小,默认16KB。 o' z8 n+ w% o6 g
- 不支持Content-Encoding, 参数搜索会失败;负载均衡会改用 Round Robin。
4 `: Y6 l5 G0 b! O" {/ w; m - 预计: 不支持100-continue,负载均衡会改用 Round Robin。6 c* m+ D6 N1 @, q/ o& g
- Transfer-Encoding (RFC2616 3.6.1) 只在第一个块中支持。如果在第一个块中的参数值不完整,选择的服务器就没有定义。(实际上取决于在第一个块中定义的有多小)
8 d/ r0 _6 {- k1 }) Q. q - 该特性不支持生成100, 411 或 501 响应。/ O) {3 }; z5 Y$ E0 B! l
- 有的情况下,需要"check_post"只是要查看整个消息体的内容。检查一般会停在任意数量的空格(LWS: linear# k5 k# ?0 G- Q7 p3 U n
white space)或控制符上,表示这可能是一个URL参数列表。这可能不是一个关于SGML的类型消息体。
$ }0 n/ {0 j* H- ?7 e, h4 o; k1 Y, r5 A5 f7 P! u* j9 P
See also : "dispatch", "cookie", "appsession", "transparent", "hash-type" and "http_proxy". 4 H \) d- [7 S8 w1 w- W3 D+ h6 j
hash-type <method>
. |2 |; }/ o$ R 将哈希映射到服务器的方法。Specify a method to use for mapping hashes to servers! y$ l% K0 j5 f" z2 e2 [8 i6 v
May be used in sections : defaults | frontend | listen | backend
' C. \1 K. J; r6 i yes | no | yes | yes7 \) W8 J" v B7 W$ e& Z; h
Arguments : K0 a0 P# n4 Y; P
map-based 哈希表是包含所有在线服务器的静态数组。哈希结果很平滑,并考虑了权重,但是会忽略服务器启动时的权重变化,也就是说不能慢启动。另外,服务器是根据数组中的位置所选择的,所以服务器数量变化时,大部分映射也会变化。当一台服务器启动或关闭,或服务器加入到群中,大部分连接会再分配给不同的服务器,这对有缓存的实例会比较麻烦。 consistent 哈希表是由每个服务器构成的树,会在树上查找哈希Key,并选择最近的服务器。这种哈希是动态的,支持服务器启动时修改权重,所以可以慢启动。它有一个好处是当服务器启动或关闭时,只有其本身的关系被移除,当服务器加入群时,只有一小部分的映射会被重新分配,所以是一个比较理想的支持缓存的算法。但是根据其原理,算法不会非常平滑,有时候必须调整服务器的权重或ID来获得更平衡的分布。要保持多次负载均衡时的相同分布,服务器ID是绝对不能变的。(roloand:haproxy根据服务器的ID初始化其哈希值)
, q# Q. n0 d& r! L) D I 默认值是"map-based",建议大部分情况下使用。3 X* r1 h" g4 t; I/ W5 j$ {
6 W2 F A7 s+ d" A' J* n* p
See also : "balance", "server"
) g$ u& g- e% E& T4 Y9 o' W8 Edispatch <address>:<port>$ @7 E8 [6 [- e: J+ N" z5 E* r! w
设置一个默认的服务器地址, a+ d" {4 K( L3 u) \* l! ]4 |
May be used in sections : defaults | frontend | listen | backend
% T/ \( W, B) |- [ e no | no | yes | yes
6 m# h. z" K( G3 v$ y3 ~ Arguments : none
?1 D* O2 j* }. x <address> 默认服务器的IPv4地址,也可以是主机名称,名称只在启动时解析为IP地址。
# B! Y7 M7 R( j( s <ports> 端口号,所有连接都会发送给这个端口,但是不允许像其他服务器一样使用端口偏移(port offsets)。
"dispatch"关键字指定了一个默认的服务器,用于无可用服务器时的连接的处理。过去常用于前传非持久连接给后备负载均衡器,由于定义简单,还用于简单的TCP中继(TCP relays)。 建议对于明确的连接处理,应使用"server"直接声明。 ==================== 一:Global parameters
h5 o& W9 N! |$ L- `8 s2 L. ~* Process management and security% r* g0 J* G& E- `/ Y; E
- chroot 改变当前工作目录
; C1 Q0 p+ `. B* x1 o j* v- daemon 运行方式为后台工作
/ M. i8 t- S9 `* W- user - group 工作用户和组2 L7 t% U m5 _8 J" u; H# r
-log <address> <facility>日志输出设备; t, e8 M9 d5 |1 M( X
- nbproc 创建工作的进程数目
, B; {# t D1 j8 G3 Q9 V-pidfile pid文件位置
9 N6 u3 ?( M q- ulimit-n 设置每个进程的可用的最大文件描述符
6 } @. z7 l. E6 k; V! C7 B- stats 创建监控所用的套接字目录
; ]3 `" @# a: V! V2 n7 z2 w4 S5 e- node 创建另外一个节点名字共用一个IP地址,用来识别哪个节点在处理流量
" V; W& Y, |7 g6 |- description 描述实例的名称/ k3 u' ^/ C4 N* Y2 `" W2 g1 J
maxconn <number> 每个进程可用的最大连接数
z- n6 ^: Z' t4 vmaxpipes <number> 每个进程可用的最大管道数3 m' X& W: |5 p+ h( } O
nokqueue nopoll nosepoll nosplice 禁用这些功能
: v+ v* L. h& Y. ]: `7 Hspread-checks <0..50, in percent> health check 的时间间隔
1 M- Y' T$ g" z! } Stune.bufsize <number>
* j9 |, Y* T {; ^tune.maxaccept <number>
* g `3 g2 C# ]% s9 G0 N9 `( {* Rtune.maxpollevents <number>
" Q2 E6 K5 Q5 e7 g! {tune.maxrewrite <number>
8 k% \0 E) I% S) t5 g' \- Gtune.rcvbuf.client <number> 3 M! _: E% N6 b7 E: o% L M
tune.rcvbuf.server <number> 5 {3 t' s( l/ u D% V3 m' d0 g4 |
tune.sndbuf.client <number> ' U8 O( y5 ?- a( ^& [5 _2 @1 S
tune.sndbuf.server <number>
- K- `, Z# N! }& N7 ~7 A以上凭字面理解吧2 n# u6 C! ^* _" f3 V1 M+ I
debug 调试模式,输出启动信息到标准输出
; e d& _: t- u' h3 K( t, Iquiet 安装模式,启动时无输出
* ^6 g7 B8 u ?6 u4 D& z3 @3 E) B, r# p2 Y
二:defaults 块6 u' [. h* N) j: s+ X
作用于其后紧跟的listen块,直至下一个defaults 块,下一个default 将替换上一个块作用于以后的listen3 R. H5 A3 X. l' \; S! n0 {, q% I1 W
frontend 块,接受请求的端口组
. |- X1 n- K: S( V6 `! _- Bbackend块,后端处理的server 组
- O7 e) h- |$ u w$ e: a& clisten块,frontend和backend 块的结合
C8 e% Q" V$ ^& [ h* t* i. X+ ~3 z& K6 _
三:常用配置命令
$ q( ]" }0 A8 m6 ~1 R" s: ~0 A
2 i' N# m9 t$ |, Y* v- l$ \; ]. u6 sbalance <algorithm> [ <arguments> ] & {7 v( t. G3 E1 w K! G) ]8 N1 |
balance url_param <param> [check_post [<max_wait>]] 负载均衡模块设置
! b' g U+ E' ^3 j$ @
' l4 D# G& }+ f- A1 C; @9 U, ?Examples :& j( W! r7 `5 J: |6 `
balance roundrobin
+ b: o# E: _( g5 y L* L1 b6 Abalance url_param userid ! Z2 P- B1 B) j6 H
balance url_param session_id check_post 64
5 r- [# V0 J2 P: l* ^6 hbalance hdr(User-Agent)
2 u) ^" Y( f% |. {2 k0 `! sbalance hdr(host)
2 P- p2 A: t( p6 dbalance hdr(Host) use_domain_only
; {. K6 S$ n* x
, s) N% S" h% O8 M- U oblock { if | unless } <condition> 在7层阻止访问
, x& X+ C1 x7 MExample: ~* w0 C; Z" k* d" O
acl invalid_src src 0.0.0.0/7 224.0.0.0/3 acl定义和squid 很像
& z$ E9 ]0 a0 {* S2 w& I- zacl invalid_src src_port 0:1023 $ _( M: E. O L. L; E
acl local_dst hdr(host) -i localhost
1 N( G. U0 [. x n' p C! }( vblock if invalid_src || local_dst
9 c% |" w4 |- S" V1 K8 O r4 t2 L7 @: \4 l, M) I
capture cookie <name> len <length> 在请求和回应包中捕捉记录指定长度的cookie,name 为cookie的开头几个字母
* d; E" l' W7 M- n" P% H+ c) w# A" I* N( C4 p
Example:+ n/ O; b7 r# P
capture cookie ASPSESSION len 32
3 S$ D3 R- M2 m1 j6 b2 ^
; V$ g) O3 K, Z$ Ucapture request header <name> len <length> # B2 D, N8 E- P n2 Y2 F! D7 I0 ^
capture response header <name> len <length> 同上+ }! M1 c0 [: m" h% @7 i
7 q) T) Y) V, j% U) C% gclitimeout <timeout> (deprecated)
6 R5 D! i7 G3 Q7 T' w( f1 e- ocontimeout <timeout> (deprecated) 客户端超时时间,不赞成设置
, b5 k; p: e# e$ i: E
+ x3 X) B$ o! M$ v5 n# ^+ H5 Mcookie <name> [ rewrite | insert | prefix ] [ indirect ] [ nocache ] [ postonly ] [ domain <domain> ]* 允许持续的基于cookie 的后端连接
0 Y4 d A) ^ z" Y3 t. c7 W- y" V$ C! r
default_backend <backend> 默认应用的后端
6 b, l+ }; r8 s9 A m
9 q4 S# t3 V' W+ |Example :
& b4 {( F+ s2 J6 `; Y4 ause_backend dynamic if url_dyn ( U5 ?/ V: _ h7 Q' f/ g' y: X
use_backend static if url_css url_img extension_img
7 q, Q) |- E- w6 f, p& adefault_backend dynamic 当没有匹配时就用dynamic; }# T5 Q0 Q" K8 d) W7 ^6 p
9 l M6 A' l' P5 q R" B
errorfile <code> <file> 定义出现错误的代码的返回页
' R) ?# N! t7 @) B2 d7 Y9 iExample : 7 x( r0 Y" v m* d$ |$ o
errorfile 400 /etc/haproxy/errorfiles/400badreq.http . r2 z+ u8 c4 f4 Y; \* `
errorfile 403 /etc/haproxy/errorfiles/403forbid.http 1 u6 s: t* Y; f$ a6 S& s2 ^
errorfile 503 /etc/haproxy/errorfiles/503sorry.http
0 n7 C! D5 u" d1 p- e" X5 F n% b1 ]- E1 k9 W- q5 F1 a( O
% G% ^& r% F* _6 y1 j4 zerrorloc <code> <url> errorloc302 <code> <url> 出错重定向到指定url( p: @% T% l- y0 C; o# g
force-persist { if | unless } <condition> 在特定条件下,强制继续连接down 掉的服务器后端
" V( K7 x- }6 B% J" O) ]fullconn <conns> 定义后端组的最大连接数; w6 y7 |. Z: ^3 ^' \
grace <time> haproxy停止后,再持续多长时间用于处理连接
6 c9 Y/ o8 H* g& w7 lhttp-check disable-on-404 如果后端检测返回404,将不再把后端计入负载均衡4 h% L" C; t) F3 D9 s7 ]
http-check send-state 允许haproxy 发送 X-Haproxy-Server-State8 d6 m; B) ^( b7 X4 e
http-request { allow | deny | http-auth [realm <realm>] } [ { if | unless } <condition> ] 七层访问控制. k7 ^' d: ]& _. U# @+ n2 c
Example:( F) e1 q, q" u H
acl nagios src 192.168.129.3& D( z7 E m. v: I: K
acl local_net src 192.168.0.0/167 J! u2 B* M" h5 z- m: T4 L
acl auth_ok http_auth(L1)
4 f1 J$ \$ A2 p1 T. S% w' b! ]
" @7 ?; P4 u/ t9 O# g5 F4 ]http-request allow if nagios
* v8 `5 O! E( \( O2 zhttp-request allow if local_net auth_ok4 ^7 x( h4 S( Z$ h! C
http-request auth realm Gimme if local_net auth_ok5 g4 M L4 M( ~5 J Z V+ t
http-request deny
' D& I) C( @3 c& l9 {- A* N1 Z1 C: P) o9 H/ L+ f
Example:/ X+ ~) m, ?+ e
acl auth_ok http_auth_group(L1) G10 Y9 K" b( c6 r t; N% g
/ b0 `$ n; j8 l7 c% f* C% Thttp-request auth unless auth_ok A3 X& k( @0 e" |9 W, B8 J, K" _
0 ~6 G' ~( e, N# |# K# c' Q% r& M
mode { tcp|http|health } 设定启动的实例的协议类型
4 X; m5 ?; P! B8 Q {: w1 amonitor fail { if | unless } <condition> 监控失败条件设置7 i; R6 ^4 M, h$ P6 x0 ~! {
. ]" N0 U" l7 A
option abortonclose 丢弃由于客户端等待时间过长而关闭连接但仍在haproxy等待队列中的请求& `2 V( V( W" H" K5 P w# g5 b
option accept-invalid-http-request 接受无效的http请求,建议关闭(开启可能有安全隐患)1 b7 a5 P: R2 P9 p" I' T( V9 K: K
option accept-invalid-http-response 接受无效的response ,建议关闭
' [, M4 O l5 a, G. W5 uoption allbackups 应该是后备服务器,如果正常的后端无法使用,就使用这些后备的设备,balance方式还是用原来的,没有优先的选择,常用来提供错误的页面/ D N3 S3 C& T! O7 `6 @' c
option checkcache 分析后端response,阻止可缓存的cookie,它对response 进行严格检查,包括"Cache-control", "Pragma" and "Set-cookie" ,查看在客户端代理那边保存是否有风险,如果这个允许的话,符全以下条件 的response 将被允许,其它的将被阻止。& h, M$ y1 D5 j8 c1 e
- all those without "Set-Cookie" header ;* }7 d3 d' C0 J$ H
- all those with a return code other than 200, 203, 206, 300, 301, 410,4 Y( Q; g! _& {' r6 q+ Z
provided that the server has not set a "Cache-control: public" header ;
4 V7 h D8 S. K0 _, E- all those that come from a POST request, provided that the server has not
! g6 U' S) q2 ~" v* l! Hset a 'Cache-Control: public' header ;
. g6 {" L) g- _+ b, y+ l4 y$ R- those with a 'Pragma: no-cache' header$ g% m/ o) n# u$ ]
- those with a 'Cache-control: private' header
: ^* I8 N& H O- those with a 'Cache-control: no-store' header
. @6 ]# {" g4 \- P- those with a 'Cache-control: max-age=0' header6 F8 m3 j8 v: s4 R( A) K3 ?
- those with a 'Cache-control: s-maxage=0' header( |% `( U8 |4 u; \& V
- those with a 'Cache-control: no-cache' header2 }+ G5 j8 `. G5 L/ A5 t% u
- those with a 'Cache-control: no-cache="set-cookie"' header
$ A5 p+ c. u- |# N2 h- those with a 'Cache-control: no-cache="set-cookie,' header8 R4 e% ^- w9 \$ a- N
(allowing other fields after set-cookie)' p2 ]: g, I# t+ R3 D$ P" k: p& t/ Y
1 A4 ^: y! H- l1 ?6 f' z' n
option clitcpka 是否允许客户端发送tcp keepalive 包,这个和http 的keepalive 没有关系
, i$ D8 g- b0 ioption contstats 允许连续的流量统计更新
L9 Y3 n0 Y' }( Y Y8 r# U, Z" Moption dontlog-normal 开启正常连接的日志
3 v& q; h3 W1 A4 J( Ooption dontlognull 记录空连接/ P2 f$ B6 [' t$ |* o6 R# ]
option forceclose 允许关闭session 在后端把response 发送后
1 |. Z8 i* Z- |option forwardfor [ except <network> ] [ header <name> ] 允许在request 中加入X-Forwarded-For header 发往server
9 u- O" L! y T( o; c v/ joption http-pretend-keepalive 定义是否haproxy要宣布同server keepalive$ v7 h& m9 i% u
option http-server-close 是否开启在server 端 connection closing% j L& K( e5 [! N+ D/ }) j
option http-use-proxy-header 用non-standard Proxy-Connection 替换 connection& O; S- C% o0 [* S
% n6 x; G) r9 L- b5 V3 O. B$ n* K) a P m* S8 n! \
option httpchk <method> <uri> <version> 允许用http协议检查server 的健康
6 }$ s) p! Y0 s0 n" WExamples :/ C; l: p, m. h( B
# Relay HTTPS traffic to Apache instance and check service availability
9 c' N2 P% y7 f/ P3 d# using HTTP request "OPTIONS * HTTP/1.1" on port 80.
0 U A6 @% ]# N; U4 f4 ?backend https_relay
4 S0 q @; s! S! H/ omode tcp' ^3 l3 C/ V. r6 ?$ K
option httpchk OPTIONS * HTTP/1.1\r\nHost:\ www
4 n" f5 t% _% s" I! E; jserver apache1 192.168.1.1:443 check port 807 D3 u" }6 f5 c: v: m' o
`9 z: v# h: R1 S
option httplog [ clf ] 定制日志格式
! ?7 p* k+ _/ u% N8 Noption http_proxy 开启http 代理模式,只有最基本的代理功能
. j J. F* ~5 E: Q7 boption ignore-persist { if | unless } <condition> 在某条件下拒绝持续连接,适用于对静态文件的负载均衡
2 i3 M6 e5 R( k, P& C4 o5 Toption independant-streams 启用双向超时处理,如socket 的read 和write & }6 H) Z4 X4 r# W& V
option log-health-checks 记录健康检查日志* e! f' j" M; U- Q; ]
option log-separate-errors 对非完全成功的连接改变日志记录等级
1 d" @3 A: E2 H3 Voption logasap 大传输大文件时可以提前记录日志
' j8 |- T# s: I _option mysql-check mysql 健康检查
# X: |+ h% P( I# G! K+ joption nolinger 清除肮脏连接后开成的tcp 状态及占用的资源,不过并不是强列要求你用这个选项,当然如果你有thousands of FIN_WAIT1 sessions on your system ,那肯定得用了* a: b9 K G/ t$ \
option originalto [ except <network> ] [ header <name> ] 允许在requests中加入X-Original-To header 发往server
( n/ `( Q; K: Yoption persist 强制将http请求发往已经down 掉的server1 V% _% J5 |7 @. E* w8 h
option redispatch 是否允许重新分配在session 失败后8 r; L; c+ t7 j4 Y) w6 @ N) }
option smtpchk smtp 检查0 c* L X0 n' H
option socket-stats 允许对单个socket进行统计. \* g4 x" Q9 w# a4 o
option srvtcpka 是否允许向server 发送keepalive
$ r& K! p1 }# e* Z; Roption tcpka 是否允许向server和client发送keepalive
* e4 Z6 u2 l+ r n3 @, M+ B. Boption tcplog 允许记录tcp 连接的状态和时间
J- X# ~; q, `3 {0 A! C- eoption transparent 允许客户端透明代理! b& ~$ v8 K! K. G, b H+ _; x" _
rate-limit sessions <rate> 设置frontend 每秒处理的连接的上限,如果到达上限就停止建立新的connection
5 M9 W. j ~% y. ~8 J) `. D
8 x+ x+ V/ L3 ~redirect location <to> [code <code>] <option> [{if | unless} <condition>]
/ `# |0 i, y: \- v1 H+ i8 [redirect prefix <to> [code <code>] <option> [{if | unless} <condition>] 重定向,相当于rewrite3 \9 |$ S J+ {2 |
! p- u- I0 r! d8 v }( { d' _: AExample: move the login URL only to HTTPS.
/ D5 ~) F. v" E: G) E- f/ Lacl clear dst_port 80; u- X, H, T, G/ `2 H7 m( D
acl secure dst_port 8080
4 u0 W3 d! }' h! |# }: ]acl login_page url_beg /login, }* N; L* v, {. h
acl logout url_beg /logout
' q6 q3 f7 ]$ T, A' Iacl uid_given url_reg /login?userid=[^&]+
! n `# d) w& l/ V9 J7 o) J4 {acl cookie_set hdr_sub(cookie) SEEN=1 q, K; `1 M; n8 O9 R9 ~- J
8 O8 d7 m. h2 S- Aredirect prefix https://mysite.com set-cookie SEEN=1 if !cookie_set
- G ]' q* B' `redirect prefix https://mysite.com if login_page !secure9 g; ]8 H0 V! h- H9 P
redirect prefix http://mysite.com drop-query if login_page !uid_given* Z& B; E6 T2 `* {
redirect location http://mysite.com/ if !login_page secure
6 j$ i$ K- b! m8 _/ m w: Y: g' y* j* Lredirect location / clear-cookie USERID= if logout& A$ t: z( @% `5 f( Z& f J8 f' d! e
5 G6 r$ K/ ?7 dExample: send redirects for request for articles without a '/'.! Y; ~/ ~. Z- j
acl missing_slash path_reg ^/article/[^/]*$( }1 P. s' @% s" E( D, d$ X
redirect code 301 prefix / drop-query append-slash if missing_slash
# N8 a+ L9 z M8 A2 oredisp (deprecated)# E6 L! w3 V5 u& [' o
redispatch (deprecated) 开启session 重新分配在connection连接失败后,不赞成启用, h% [* e8 ?5 l! ^) ^
reqadd <string> [{if | unless} <cond>] 在http请示的末尾加上string
7 X: T& G; a, f2 b2 P8 Z9 n9 t+ ?$ ~9 c
Example : add "X-Proto: SSL" to requests coming via port 814 a( Q9 ~. `4 n4 B
acl is-ssl dst_port 81
$ D3 z. Z: r+ E2 Yreqadd X-Proto:\ SSL if is-ssl
0 B/ d+ c7 E T
, Z* h8 N, r5 ]( v2 R! c( Z. treqallow <search> [{if | unless} <cond>] r" Q) D$ b2 ^: U. M5 d) a% n, L9 M
reqiallow <search> [{if | unless} <cond>] (ignore case) request 请求访问控制3 L/ F3 F4 E, z+ t# \" I7 T
1 y3 l# A' [, C# i' L+ {) WExample :
4 h, C; i5 |+ F9 c! b# allow www.* but refuse *.local; |& z3 `- ^" o; |! A
reqiallow ^Host:\ www\." I5 Q; T* c2 g0 F
reqideny ^Host:\ .*\.local5 \8 w+ e& |) {. L. a2 Y
7 P) U; ^' I6 |. {$ G; M- X& u0 }reqdel <search> [{if | unless} <cond>]0 N7 F7 F+ t) G. N- p. I
reqidel <search> [{if | unless} <cond>] (ignore case) 删除请求的head 中的内容
! X; q3 a% [' g$ @& U, k0 [- [. x* B# Z! O2 n
Example :& T! a* _/ p7 y f
# remove X-Forwarded-For header and SERVER cookie+ q2 W# J7 A6 S: E1 n
reqidel ^X-Forwarded-For:.*
1 b" C" m/ w3 G7 \! \3 U' g9 P, @reqidel ^Cookie:.*SERVER=
1 f* P- ?' j2 g9 W5 W- i
& ^1 V; M0 g7 A2 U5 r: w, I6 }% g# }$ |9 P8 ~! R5 T
reqdeny <search> [{if | unless} <cond>]
# N; d0 Q; i* Breqideny <search> [{if | unless} <cond>] (ignore case) 拒绝访问
5 F7 r- z+ i u; G( o# ^6 L3 h9 @8 B
reqrep <search> <string> [{if | unless} <cond>]
6 [# b: [+ L" l$ u. Z+ H8 X: ?6 Ereqirep <search> <string> [{if | unless} <cond>] (ignore case) request 请求替换+ ?. t! o3 w) i0 I; C
Example :
) a ^3 z$ O9 T# replace "/static/" with "/" at the beginning of any request path.' F7 N2 Y6 b5 l
reqrep ^([^\ ]*)\ /static/(.*) \1\ /\2
7 o2 [+ K( \( S6 t. k# replace "www.mydomain.com" with "www" in the host name./ r- l. Z' y' V) v8 z
reqirep ^Host:\ www.mydomain.com Host:\ www2 R7 k# R; E+ E3 \0 T J( Z1 ~" T
% @1 t! g2 \$ u7 P
reqtarpit <search> [{if | unless} <cond>]
- h: o& b; H3 L. s5 Treqitarpit <search> [{if | unless} <cond>] (ignore case) 阻止http请求中的某些信息
7 u& j4 b* u ~5 l g5 h$ w3 Q @5 _3 y2 o6 e+ H: R- D7 C) p: n# ^7 F& l
Examples :
7 E9 S- o) p4 v+ I2 n# ignore user-agents reporting any flavour of "Mozilla" or "MSIE", but* I$ {9 I5 U7 V0 M' Z2 N" p3 z
# block all others.4 p" x% \* m( E9 f9 r; H
reqipass ^User-Agent:\.*(Mozilla|MSIE)4 T% V; }- |) k$ s# G
reqitarpit ^User-Agent:
6 l3 y5 ]& \1 m, t8 {1 }! K6 F* c/ N- R1 u" Z$ C$ t5 A
# block bad guys
9 M9 C e/ w6 [acl badguys src 10.1.0.3 172.16.13.20/28
. S6 r9 ? j% e% [4 ureqitarpit . if badguys& B6 ^2 S5 R) ~2 b3 {* W
7 P/ X3 x# I3 \' G+ L: B
retries <value> 当对server的connection失败后,重试的次数# Y1 U( u7 o( g. ^' }* ]6 I
rspadd <string> [{if | unless} <cond>] response 增加信息1 E5 t3 ]* g$ S8 o3 v5 ?
rspdel <search> [{if | unless} <cond>]* R; @6 w% ?+ Z
rspidel <search> [{if | unless} <cond>] (ignore case)
6 u- ], x" _9 y6 s$ h: B3 Nrspdeny <search> [{if | unless} <cond>]0 Q. [2 W* o D; s. A- Z
rspideny <search> [{if | unless} <cond>] (ignore case)
$ O5 j( M6 M) `$ Lrsprep <search> <string> [{if | unless} <cond>]+ K7 ~9 [! A: N& J' h- }$ [9 j
rspirep <search> <string> [{if | unless} <cond>] (ignore case)$ K: x; @5 M+ N5 Y/ R& y2 Q
以上和request 的差不多# | C0 z( v1 z( {$ W
b: t6 t$ H% h7 j! T
source <addr>[:<port>] [usesrc { <addr2>[:<port2>] | client | clientip } ] 定义从代理出去的连接的对象,用于限定地址可以访问server
" N; |1 L: [5 d. K- a( K
; U7 T$ E9 R$ c" e) b一些timeout+ F% B* f) W5 u. p1 i+ v; V
9 [3 {2 P: @' C# W6 O
srvtimeout <timeout> server 处理超时,不赞成设置4 Q$ S: _7 n& W9 h' S1 s
timeout check X - X X
9 e# b& \- c$ X2 H8 Etimeout client X X X -
2 a* s" [5 n4 l# Y1 Ctimeout clitimeout (deprecated) X X X -% I) d3 ?, @/ k
timeout connect X - X X
* V: W7 x% q2 }- t0 F* [: Rtimeout contimeout (deprecated) X - X X
5 s8 p6 w* A) M7 `5 y, H; k$ z3 itimeout http-keep-alive X X X X* J' w$ m }! c1 I" A+ l1 g Y
timeout http-request X X X X2 @4 @8 b; S9 W
timeout queue X - X X
0 O9 |! D1 o: r& ctimeout server X - X X
4 n9 K9 W2 e T, j4 c H8 |timeout srvtimeout (deprecated) X - X X
4 B" N; Y; m! N" u9 E) ztimeout tarpit X X X X
* C4 @. Z. L# x8 P, K d
* i' k5 m1 ^+ a3 n3 L9 `
6 P, B! y" H) c+ O! ?, C* ~, Ystats auth <user>:<passwd> 监控统计的帐号和密码
- `7 V, ~' z. l+ q4 e5 qbackend public_www
, p9 O, z# D! X4 {! q% A6 l( Dserver srv1 192.168.0.1:80
/ z9 V! ^/ i. a, y) t8 R$ sstats enable
/ x3 w' ?4 I. Jstats hide-version
( \+ O7 l8 V6 w8 X Xstats scope .
( \, E* s( ^1 l) ?, X: \stats uri /admin?stats+ W) @7 a% l! p9 r" m
stats realm Haproxy\ Statistics
@6 U6 y3 H" o7 Ostats auth admin1:AdMiN123# N( b% l! E2 h1 @ m
stats auth admin2:AdMiN3213 y3 g' R7 r$ u5 x, U
5 S' I. Z% L* d
# internal monitoring access (unlimited)) _8 f) w {5 h2 v0 b( l
backend private_monitoring3 B' \) S4 p' T
stats enable
$ E5 S5 J; h, {stats uri /admin?stats
1 W I$ `; {. V2 z: C5 G* f9 Pstats refresh 5s( `$ u, g4 s, K) K( E
- N4 |* i/ V5 R; @ K
还有很多参数,以上能用到的也没有几个,只要满足当前需求就好,对于性能要求高的话,建议把不需要的功能 都关了吧. ==================== HAProxy的配置示例 HAProxy配置中分成五部分内容,当然这些组件不是必选的,可以根据需要选择部分作为配置。
' O ], n8 b4 Iglobal:参数是进程级的,通常和操作系统(OS)相关。这些参数一般只设置一次,如果配置无误,就不需要再次配置进行修改( B$ e0 c6 R9 n) r1 w
defaults:配置默认参数的,这些参数可以被利用配置到frontend,backend,listen组件$ }+ }) y6 ?, s+ ~ i
frontend:接收请求的前端虚拟节点,Frontend可以根据规则直接指定具体使用后端的 backend(可动态选择)。
% p$ w0 ^2 ^' ~( M! fbackend:后端服务集群的配置,是真实的服务器,一个Backend对应一个或者多个实体服务器。# s6 c9 v) I; a! ?0 `, l
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 |