找回密码
 注册
查看: 5098|回复: 1

haproxy配置文件讲解

[复制链接]

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
发表于 2017-9-8 10:03:56 | 显示全部楼层 |阅读模式
global                                                       # 全局参数的设置2 Q3 c/ |4 U2 {4 J, W
    log         127.0.0.1 local2                      # log语法:log <address_1>[max_level_1] # 全局的日志配置,使用log关键字,# L0 Q6 n1 o6 j( e; g1 C3 ^7 j3 E
                                                                     指定使用127.0.0.1. D* _, C5 x$ Z* S8 u
                                                                     上的syslog服务中的local0日志设备,记录日志等级为info的日志/ _8 N' i5 ]: K" a8 r$ p- n4 @
    chroot      /var/lib/haproxy                 #改变当前工作目录
8 z' H9 o! P) N1 Z% R    pidfile     /var/run/haproxy.pid          #当前进程id文件
- u3 w% ]# i, B4 b/ m    maxconn     4000                                #最大连接数' F. W2 x- ]1 D6 X" D; \, D% F
    user        haproxy                                #所属用户1 V0 ?8 Y' a) N' P% ~! I( P
    group     haproxy                                #所属组
" Y* ~- ~4 Q2 E! R3 x    daemon                                               #以守护进程方式运行haproxy
0 F' J# d( B. E4 U9 h    stats socket /var/lib/haproxy/stats8 v$ M. \' a0 v9 E1 x0 ]
defaults
/ ^3 l( Z$ G7 I# K    mode                    http                        #默认的模式mode { tcp|http|health },tcp是4层,http是7层,health只会返回OK; D* V% \9 U; i9 M1 c6 @
    log                        global                    #应用全局的日志配置
/ y0 y1 \. g- |/ C    option                  httplog                  # 启用日志记录HTTP请求,默认haproxy日志记录是不记录HTTP请求日志
/ a9 D9 Z# |! L! v1 x+ U- E0 l3 L. S; m/ x* Y
    option                  dontlognull          # 启用该项,日志中将不会记录空连接。所谓空连接就是在上游的负载均衡器0 j- w% Q+ I) s! y. i7 ~# c0 Y8 [1 F
                                                                   或者监控系统为了探测该 服务是否存活可用时,需要定期的连接或者获取某) \$ S7 p9 Y  i9 g) O; `
                                                                  一固定的组件或页面,或者探测扫描端口是否在监听或开放等动作被称为空连接;
' [5 x8 U' e" n: ~                                                                  官方文档中标注,如果该服务上游没有其他的负载均衡器的话,建议不要使用: {9 Q% R! s: o
                                                                   该参数,因为互联网上的恶意扫描或其他动作就不会被记录下来) Q& {6 U4 O0 P) i
    option http-server-close                   #每次请求完毕后主动关闭http通道
4 c2 _7 S" w. E3 c0 ?    option forwardfor       except 127.0.0.0/8   #如果服务器上的应用程序想记录发起请求的客户端的IP地址,需要在HAProxy
- s% d4 R! a( i! u: {. t( o                                                                            上 配置此选项, 这样 HAProxy会把客户端的IP信息发送给服务器,在HTTP
- @( u, j: Z4 @2 R                                                                            请求中添加"X-Forwarded-For"字段。 启用  X-Forwarded-For,在requests) l2 x% x" h( p; c
                                                                            头部插入客户端IP发送给后端的server,使后端server获取到客户端的真实IP。 1 O, ^  ~$ M$ U3 Y3 [0 K
    option                  redispatch                      # 当使用了cookie时,haproxy将会将其请求的后端服务器的serverID插入到
4 V. y& k' ~8 L, G9 ~- I" y9 R                                                                            cookie中,以保证会话的SESSION持久性;而此时,如果后端的服务器宕掉
3 d- Q0 W3 ~- l) P4 k% S                                                                            了, 但是客户端的cookie是不会刷新的,如果设置此参数,将会将客户的请5 x8 `) z5 Y9 ^/ S% O: v
                                                                            求强制定向到另外一个后端server上,以保证服务的正常。
" n; E: G& x6 F* x    retries                 3                             # 定义连接后端服务器的失败重连次数,连接失败次数超过此值后将会将对应后端
  m/ `4 e  j& _7 J( t3 J8 u8 e                                                                  服务器标记为不可用
5 ~* `1 ~3 V# r0 P( V/ y    timeout http-request    10s             #http请求超时时间0 c; @3 y4 g9 |' o8 B+ F8 l6 m
    timeout queue           1m                 #一个请求在队列里的超时时间0 V' a( c" K9 G: Y6 Z
    timeout connect         10s                #连接超时3 J  H+ _& J0 ?( i& w* b/ q1 k
    timeout client          1m                   #客户端超时
% R$ G* C0 Q$ |% e1 d+ @* J, b& H    timeout server          1m                   #服务器端超时
) Z2 B7 R% N% H% L! h    timeout http-keep-alive 10s           #设置http-keep-alive的超时时间4 m; Q+ v& J4 V) y5 {$ J
    timeout check           10s                 #检测超时) i& Q1 G4 U* f1 L1 O- |2 w) \
    maxconn                 3000                 #每个进程可用的最大连接数
, f5 Y  n" M+ h3 {frontend  main *:80                             #监听地址为80
5 B* S0 |$ ?+ Z% o    acl url_static       path_beg       -i /static /images /javascript /stylesheets
+ O- I, U8 C/ u: o, v# e8 V    acl url_static       path_end       -i .jpg .gif .png .css .js
3 f) ?. ]: c' `% b# g: Y! Q; T    use_backend static          if url_static
) }; R8 O- Z) J2 O% M: v* n    default_backend             my_webserver     #定义一个名为my_app前端部分。此处将对于的请求转发给后端" |' p, ^6 }0 D. u1 u* |
backend static                                                 #使用了静态动态分离(如果url_path匹配 .jpg .gif .png .css .js静态文件则+ \5 B% u. ]9 S5 e
                                                                            访问此后端)- n! o3 h% H. S* {9 O* H
    balance     roundrobin                               #负载均衡算法(#banlance roundrobin 轮询,balance source 保存session值,. a3 Y/ f9 Q/ h" s/ P
                                                                           支持static-rr,leastconn,first,uri等参数)1 D" p' X: q$ b% b6 @2 d; i
    server      static 127.0.0.1:80 check             #静态文件部署在本机(也可以部署在其他机器或者squid缓存服务器)
9 \2 v3 W, C" i3 }: O: q2 abackend my_webserver                                  #定义一个名为my_webserver后端部分。PS:此处my_webserver只是一个0 q) ~" Q# j* }9 ^2 h2 j* z  g! ]: h
                                                                            自定义名字而已,但是需要与frontend里面配置项default_backend 值相一致  P& h& N# c1 J6 \3 x# O* ^
    balance     roundrobin                               #负载均衡算法
" K" X4 K; |& r2 W% |    server  web01 172.31.2.33:80  check inter 2000 fall 3 weight 30              #定义的多个后端( R; k0 R" l' y" b2 e
    server  web02 172.31.2.34:80  check inter 2000 fall 3 weight 30              #定义的多个后端( \' O$ S; p  E& j  p( n
    server  web03 172.31.2.35:80  check inter 2000 fall 3 weight 30              #定义的多个后端) S9 \( I% X0 n# S

# @9 P1 t: K* Z$ ~0 G8 A  Z9 V, p- P6 x- @0 N3 E0 G

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2021-7-12 13:55:30 | 显示全部楼层
常用配置选项:
1 A, h3 `* j  t, K
- W% @1 x+ T, _# q) q# o
) d0 R  {" @( G* Z# v* U
# v+ M% Q* S% G7 k5 d1 h' ]OPTION 选项:
& v# P( T! u' ?9 c8 y! b  f; V1 ?  W8 H( R# F% Z" c; ]
option httpclose :HAProxy会针对客户端的第一条请求的返回添加cookie并返回给客户端,客户端发送后续请求时会发送
3 i9 F3 t' ^5 A
2 O- x* m0 l7 f/ U; O2 ]8 G                             此cookie到HAProxy,HAProxy会针对此cookie分发到上次处理此请求的服务器上,如果服务器不能忽略
" c4 B& k7 ]! p4 N$ D# E* n# p: x
                             此cookie值会影响处理结果。如果避免这种情况配置此选项,防止产生多余的cookie信息。
  Z: \, y6 o; R. ^1 t
8 x& Q9 o8 v. {option forwardfor :如果服务器上的应用程序想记录发起请求的客户端的IP地址,需要在HAProxy上配置此选项,这样
) `4 U! f+ K% S# \, L8 y/ P
# ?; A" G, U0 ~' \4 z                               HAProxy会把客户端的IP信息发送给服务器,在HTTP请求中添加"X-Forwarded-For"字段。
2 c0 F' q- s) [$ b0 ]# I8 n# r4 {) O2 }- r
option originalto :如果服务器上的应用程序想记录发起请求的原目的IP地址,需要在HAProxy上配置此选项,这样HAProxy) [- a+ P1 c( K- [8 {
2 C/ x) C$ B. Y: w- [
                              会添加"X-Original-To"字段。
& A& e9 J3 H2 P! ?9 \# \* \# {5 p. f" l3 o% y: g
option dontlognull :保证HAProxy不记录上级负载均衡发送过来的用于检测状态没有数据的心跳包。
6 e2 @0 [( K# [
. m( |  l( E4 _* J  [, ]- p
$ @, Z2 _1 D' O0 ]0 x  T1 A$ k, S  k2 T. l0 c9 _
BALANCE 选项:
' j) j, e  _, d0 k$ ~: m
/ }. ?- G2 W* R  D& cbalance source :如果想让HAProxy按照客户端的IP地址进行负载均衡策略,即同一IP地址的所有请求都发送到同一服务, J/ j/ N" c) g$ D
; \/ T. |0 q* T/ R: \$ b6 S
                             器时,需要配置此选项。
0 R1 ]% G# d* N7 V8 q% Y
- k5 U9 ~. f% l. mbalance roundrobin :HAProxy把请求轮流的转发到每一个服务器上,依据每台服务器的权重,此权重会动态调整。最常
. r5 l& N! k- q1 V2 t- _' P) V9 X  a+ U  G  ^, g
                                   见的默认配置。; Y& Q/ Z: m7 a
; Y4 y! K$ m" H

) B3 }  |2 Q8 I& s( Y9 I6 e( `2 X. I+ {, H/ d9 |0 h9 x
COOKIE 选项:. ~2 q$ w7 ^% Z1 l+ `9 }
5 y- }! b0 i; o4 e7 _. M; b8 C- b% d
cookie JSESSIONID prefix :如果客户端只支持一个cookie,并且服务器上的应用程序已经对返回设置了cookie,: m- j8 L7 q  U3 ]1 \& d, `. \

2 s; u& H! O4 D: D: W5 X                                               HAProxy设置此选项可以改写应用程序设置的cookie信息,把服务器的信息添加到原cookie中去。
& |  `7 L; K: j! l' N3 D2 l, M# ?8 D8 r: c# e+ h
cookie SERVERID indirect :HAProxy会删除添加的cookie信息,避免此cookie信息发送到服务器。
( `) }9 |  W+ ]1 f- {9 B
; [( G" c6 Q) `0 O  V" \! s5 @cookie SERVERID rewrite :
% W  ~- Z4 e2 d/ g% `
% `; I3 S/ N8 K& q; K) M, V  C2 B5 Jcookie SERVERID insert :- e5 G1 w. Q2 w+ M
  C' y6 a: g8 W" H* W/ }; H+ z6 N2 R
cookie SERVERID insert nocache :
: b1 b, a2 }+ s, ]; {( r# Y! C' e. L' D$ b" ^# r
cookie SERVERID insert postonly :, _9 _8 D+ x: [3 |% b
/ c8 P; a+ c/ E2 t6 v

7 J' d6 m, x5 c: H4 {
$ h% M* ?1 B) b# O. ~2 Yoption httpclose1 H- l$ B# K( F' ]3 r5 v# R0 P
no option httpclose
1 ~. i1 Q0 O, f$ u  Enable or disable passive HTTP connection closing   启用或禁止消极的HTTP连接关闭
. A# H. \1 W( Y% G  May be used in sections :   defaults | frontend | listen | backend
. I4 E: l. i8 A+ a; h$ H                                 yes   |    yes   |   yes  |   yes9 [: e* w3 a/ n, P
  Arguments : none6 R  d, z7 x% ?
  
8 {2 f6 E! d: [+ K* y  默认的,客户端与服务端的通讯,HAProxy只做分析、日志和分析每个连接的第一个request。如果设置了 "option/ g' n/ _# ^8 P* l- H/ B3 H- J
  httpclose" , 则会检查双向的http头是否有"Connection: close",如果没有则自动添加,使每个客户端或服务端在每次传输后,都会主动关闭TCP连接,使HTTP传输处于HTTP close模式下。任何 "Connection" 头如果不是"close",都会被移除。- v7 N- X9 q# q# v  {9 K
( G: d( b- M/ O; V& s; |6 n" [& [
  很少会有服务器不正确的忽略掉头,即使收到"Connection: close"也不关闭连接,否则就是不兼容HTTP 1.0浏览器标准。 如果发生这种情况,可以使用"option forceclose",在服务端响应后主动关闭请求连接。选项 "forceclose"还可以及早释放服务连接,而不必等到客户端的应答确认。
9 U# g8 L1 I6 Q% B, Z' k/ `" g/ w
  这个选项可以设置在frontend或backend上,只要其上可以建立连接。如果同时设置了"option forceclose",那么它比"httpclose"优先。如果同时设置了 "option http-server-close",则会实现"option forceclose"的效果。0 t- A0 M  {5 }
  G" H/ D5 x  N" e& \4 s
option forceclose" ~  G0 ^. W# ]# o3 M& N/ J/ Q
no option forceclose
7 r( U$ j) ]$ \2 ?3 K- C7 ]- w+ \( n/ G
  Enable or disable active connection closing after response is transferred.     启用或禁止response后的主动关闭连接* i# l) ?* D7 p: ]

& L; k+ S; f% S) `8 y- v0 e3 v  May be used in sections :   defaults | frontend | listen | backend& f1 n* U; R- u1 e0 o! p! A8 E
                                 yes   |    yes   |   yes  |   yes
) O; j8 W% ^! R& n5 H0 ]8 j4 X9 S- J
  Arguments : none
* A0 |6 B, f' h% |        有的HTTP服务器收到"option httpclose"设置的"Connection: close",也不会关闭连接,如果客户端也不关闭,连接会 一直打开,直到超时。这会造成服务器上同一时段内的大量连接,日志中也会显示较高的全局会话时间。
: Q3 F) {& V3 M( L$ @
3 l9 e* A) ]! u) x8 z$ T        此时,可以使用 "option forceclose",当完成响应时,立即关闭对外的服务通道。该选项隐式打开httpclose选项。需要注意,该选项允许解析完整的request 和 response,所以可以很快关闭至服务器的连接,比httpclose更早释放一些资源。/ o0 I6 ~9 g& F, ]% [
        如果同时启用了"option http-pretend-keepalive",虽然会禁止发送 "Connection: close"头,但是依然会在整个response被接收后,关闭连接。! A# B7 {. j1 n; w1 p* s- X8 r( g8 Z
  ]$ F" A3 E1 Q
option http-server-close9 q+ J, ^/ G% s: c
no option http-server-close
! ^+ U2 n: z* H$ h4 V  Enable or disable HTTP connection closing on the server side  启用或禁止关闭服务端的HTTP连接
( E' G& r* ~9 \) F* V  May be used in sections :   defaults | frontend | listen | backend! w, g7 L  D2 G3 ]
                                 yes   |    yes   |   yes  |   yes
" \  f! }3 W5 Y9 t& P1 q  Arguments : none" j# b* m% ~- x) t0 K" w
    默认的,客户端与服务端通讯,haproxy 只是分析、记日志,并处理每个连接的第一个请求。该选项设置server端为HTTP 连接关闭模式,并支持客户端为HTTP keep-alive的pipelining模式。提供了最低的客户端延迟和最快的服务端会话重用,以节省服务资源,类似"option forceclose"。还允许无keepalive能力的服务端在keep-alive模式下为客户端提供服务,但是需要符合 RFC2616。需要注意的是,有些服务器遇到"Connection: close" 时并不总是执行关闭,那么keep-alive 则无法使用,解决方法是启用 "option http-pretend-keepalive".
4 v7 }" u3 R/ W) I: v; b: Q$ Q7 C) @: I; Z$ q  k. D
     目前,日志无法指明请求是否来自同一会话;日志中的接收日期为前一个请求的结束;请求时间为新请求的等待时间;keep-alive request time 存活请求时间为超时时间,绑定 "timeout http-keep-alive" 或 "timeout http-request"的设置。
, e+ H- E& b4 M. }1 P  f     这个操作可以设置在frontend或backend上,只要其上可以建立连接。需要注意的是,这个选项可以与 "option httpclose"结合, 但 "option httpclose"优先级更高,结合后基本实现了forceclose的效果。% c( j. ^+ l+ V
- h' H4 G; N3 h) r
option http-pretend-keepalive (http-假装-长连接)9 ^# k9 N' ?: [, u
no option http-pretend-keepalive; [5 q& z, \: U4 B# R2 h9 E
  Define whether haproxy will announce keepalive to the server or not  定义 haproxy 与服务器是否是 keepalive 的。
9 g6 y4 Y7 g0 H" K  May be used in sections :   defaults | frontend | listen | backend$ T8 m/ D, D, L0 _7 w& ]
                                 yes   |    yes   |   yes  |   yes2 i% x: a: D* f6 {' N9 _
  Arguments : none, I8 u5 U+ Q7 c; F
    当声明了 "option http-server-close" 或 "option forceclose", haproxy会在给server的request头中添加 "Connection: close" 。然而有些服务器看到这个头,会返回未知长度的response,并自动避免chunked encoding,其实这是不对的。它会阻止haproxy保持客户端长连接,还会使客户端或缓存接收了未完成的响应,却认为响应结束了。
" y% T3 [7 s0 T% }: T+ s    设置 "option http-pretend-keepalive", haproxy会在服务器端保持长连接,服务端则不会出现前面的问题。当 haproxy 获取了完整的response, 才会以类似forceclose的方式关闭服务端。这样客户端得到一个普通的响应,连接也在服务端被正常关闭。
  k3 H1 A4 b3 E. i    建议不将其设为默认值,因为大部分服务器会在发送完最后一个包之后更高效的关闭连接,并释放缓存,而且网络上的数据包也会略微降低整体的峰值性能。但是启用该选项,haproxy会略微少做一些工作。所以如果haproxy在整个架构中是个瓶颈,可以启用该操作,以节省CPU。' ?' |) O1 m1 P& h  l" C

9 m7 Z6 J! ]! L4 Q     这个选项可以设置在frontend或backend上,只要其上可以建立连接。这个选项可以与 "option httpclose"结合, 使服务端keepalive,客户端close,但并不建议这样做。* y) G7 x1 }; Y- M: u

1 G" K: E" e& U) u4 J1 E: I" W& D, @# r7 D9 L# T1 F3 `& X

* g2 w8 M$ C2 |; ]balance <algorithm> [ <arguments> ]
! u2 {0 j; r5 B' _- _balance url_param <param> [check_post [<max_wait>]]7 v- e& C- ?  h8 L+ R3 w
  定义选择后端服务的负载均衡算法& e3 v" m# x( x2 o8 _
  May be used in sections :   defaults | frontend | listen | backend4 k$ v. U* \' c, _+ k" o, I
                                               yes   |    no    |   yes  |   yes3 l: s* D0 y0 k5 Z( _* F
  Arguments :
0 J( f+ Q; ?2 R% Y( w    <algorithm> 是负载均衡时选择服务器的算法,没有持续信息时可用,或连接重定向到另一个服务器。<algorithm> 可以是以下几种:
  f' p$ ?& i+ S. b2 `" Y4 t      roundrobin  每个服务器根据权重轮流使用,如果服务器的处理时间平均分布,这是最流畅和公平的算法。算法是动态的,对于实例启动慢的服务器的权重会在运行中调整。每个backend的活动服务器在设计上限制为4128个。在一些大的群里面, 当服务器很短的宕机后恢复回来,有时会有几百个请求被重新整合到群当中,并开始接收处理。尽管很少发生,但是很正常。这也说明了有机会监视它们,所以不必担心。" O( h/ }! S5 u& v" j7 X, a

  S3 W9 i1 A6 @& ?& c1 c      static-rr  每个服务器根据权重轮流使用,类似roundrobin,但它是静态的,意味着运行时修改权重是无效的。另一方面,它对服务器的数量没有设计上的限制,服务器启动后便会立即进到群中,整个分发方案会重新计算。这会略微降低CPU的运行(约1%)。) _5 g9 i2 T9 x6 E% e0 Y# U: y
0 T2 C, f5 ?8 U/ ^7 w! c1 n( A
      leastconn  连接数最低的服务器优先接收连接。Round-robin用于负载相同的服务器,使每台服务器都被使用。leastconn建议用于长会话服务,例如LDAP, SQL, TSE等,而不是很适合短会话协议,如HTTP。算法是动态的,对于实例启动慢的服务器的权重会在运行中调整。
" x5 H- K5 ^% R2 @, h
$ l9 {1 c% I3 f# ^! c. b0 T      source    对源IP地址进行哈希,用可用服务器的权重总数除以哈希值,根据结果进行分配。只要服务器正常,同一个客户端IP地址总是访问同一台服务器。如果哈希的结果随可用服务器数量而变化,那么有的客户端会定向到不同的服务器。该算法一般用于不能插入cookie的TCP模式。它还可以用于广域网上,为拒绝使用会话cookie的客户端提供最有效的粘连。该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是算法会根据"hash-type"的变化做调整。
+ O0 v+ |0 o/ A* {/ i: z# v, g& U+ \3 w
      uri        对URI左端(问号之前)进行哈希,用可用服务器的权重总数除以哈希值,根据结果进行分配。只要服务器正常,同一个URI地址总是访问同一台服务器。一般用于代理缓存和反病毒代理,以最大限度的提高缓存的命中率。该算法只能用于HTTP后端。该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是算法会根据"hash-type"的变化做调整。
( C) i& Y0 R( {8 v+ a                  算法支持两个可选参数"len" 和 "depth", 都是后跟正整数。“len”参数指定算法只处理URI从头开始的字符数,据此计算哈希。因为大多URI以"/"开头,所以"len"最好不要设为1。"depth" 参数指定URI中最大的路径深度,据此计算哈希。请求中的每个斜线为一级。如果同时声明了这两个参数,则截取URI时必须同时满足。
/ M0 d: m+ @; y
- c; l5 V# P& R) \# }2 i* `& }  x% d# A      url_param  在HTTP GET请求的查询串中查找<param>中指定的URL参数。
& k6 Q6 s# ?, H+ I                 若使用了修饰符"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被用了,则只能检查第一个块。如果参数值被块边界分隔开,则只能随机均衡负载了。
- q; x- X; {5 l- H                  如果参数后面跟着 ('=') 和一个值,则可以根据这个值进行哈希,用可用服务器的权重总数除以哈希值,根据结果进行分配。) n4 W' U8 v8 Q$ o
                  还可用于跟踪请求中的用户身份,只要服务器正常,同一个用户ID的请求总是发给同一台服务器。如果没有参数或参数没有值,则使用轮询算法。该算法只用于HTTP后端。该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是算法会根据"hash-type"的变化做调整。
; c/ Q5 O5 g. C% v: F% e" r7 U# F  u$ ^3 u* e7 v" [
      hdr(name)  在每个HTTP请求中查找HTTP头<name>。与ACL函数'hdr()'一样。括号括起来的头名字不区分大小写。如果缺少头或头没有任何值,则使用roundrobin算法代替。                  5 z, a5 K, A9 j3 s0 a0 H* z
                       启用参数'use_domain_only',哈希算法将只用于一些类似'Host'的特定头的主域部分。例如主机值"haproxy.1wt.eu",则只考虑 "1wt"。该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是算法会根据"hash-type"的变化做调整。
, d% _/ V1 p2 i0 v+ @, h1 X8 O/ \3 f3 {4 _  y: T& P3 t
      rdp-cookie1 b, Z! S$ `  u# L
      rdp-cookie(name)9 b9 f9 T" v3 O$ a5 K
                  为每个进来的TCP请求查询并哈希RDP cookie <name> (或“mstshash”如果省略) 。与ACL函数 'req_rdp_cookie()'一样,name不区分大小写。该机制用于退化的持久模式,可以使同一个用户(或同一个会话ID)总是发送给同一台服务器。如果没有cookie, 则使用roundrobin算法代替。3 w& g2 q4 l0 h1 |. `
                  必须注意该声明要生效,前端必须确保在请求缓冲中已经有RDP cookie,所以必须使用规则tcp-request content accept' 和ACL 'req_rdp_cookie_cnt'相结合。3 n& x) |5 m. |: I3 j
                  该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是算法会根据"hash-type"的变化做调整。# {, t& a6 I1 _4 c4 ^: r1 _. ^
3 h( F: q3 `* r7 a- k$ s
    <arguments> 是用于一些算法的可选参数列表,目前只有"url_param" 和 "uri" 用到,例如:
4 G0 }- G0 B' T  H4 m                balance uri [len <len>] [depth <depth>], z! L1 O+ p7 h$ N
                balance url_param <param> [check_post [<max_wait>]]
& G2 j- j3 C; ?8 Y, J& a4 U, ^8 k% [. Q
  如果没有其他算法、模式或选项的设置,后端的负载均衡算法默认为roundrobin。每个后端只能设置一种。7 D: M1 P3 E# g; k9 l+ E9 E) E
  Examples :: g0 m& A& o) F5 |5 X
        balance roundrobin. R6 }/ o0 S0 J  t- }4 T4 U
        balance url_param userid) t' \( j2 \( |" v
        balance url_param session_id check_post 64
# @, h9 O5 @7 B" f: U- M        balance hdr(User-Agent)- y8 K( H: E4 F( t
        balance hdr(host)0 g4 N4 A/ H1 j( E! H1 r
        balance hdr(Host) use_domain_only
- J  }# F8 @, P7 X
) n5 u7 t+ W. H; i  注意:  以下的警告和限制是使用“check_post“扩展和”url_param”所必须考虑 :1 L, d: D9 B; T; {1 n* e  j. |
    - 所有POST请求都要考虑,因为在包含二进制数据的体或实体中,没有办法决定是否会找到参数。因此需要另一种方法,限制POST请求的体中不含有URL参数 (见 acl reqideny http_end)
* d6 s6 E4 ]5 v% J0 N* Q4 f5 J$ x) C1 m$ S  j: i
    - 大于请求缓冲大小的 <max_wait> 值是没用的。在build时设置缓冲大小,默认16KB。
' u* y0 c% c3 a7 V    - 不支持Content-Encoding, 参数搜索会失败;负载均衡会改用 Round Robin。" f" \. U+ P8 }3 {+ Q8 C) n
    - 预计: 不支持100-continue,负载均衡会改用 Round Robin。
7 `- x8 i1 y+ f6 m5 b0 L; A# D1 k( s    - Transfer-Encoding (RFC2616 3.6.1) 只在第一个块中支持。如果在第一个块中的参数值不完整,选择的服务器就没有定义。(实际上取决于在第一个块中定义的有多小)3 ^/ f. k0 S8 K$ }
    - 该特性不支持生成100, 411 或 501 响应。. u; e6 K& x  w
    -  有的情况下,需要"check_post"只是要查看整个消息体的内容。检查一般会停在任意数量的空格(LWS: linear
$ n+ |1 k5 M  C6 N$ \1 ^      white space)或控制符上,表示这可能是一个URL参数列表。这可能不是一个关于SGML的类型消息体。0 k  h7 |; ^$ ?8 w; Q3 _( |

: Z8 G" `3 S, ?0 h8 x) d! S  See also : "dispatch", "cookie", "appsession", "transparent", "hash-type" and "http_proxy".
0 V: N" @% E7 C$ b6 _: U/ \$ L- Z3 S) @

# a! v5 s' @2 B. c  {+ [) F9 W( v% V0 G: n1 \1 s
hash-type <method>5 N' O2 S% H/ d5 k$ s
  将哈希映射到服务器的方法。Specify a method to use for mapping hashes to servers
/ j" p$ c& q' _" {  May be used in sections :   defaults | frontend | listen | backend
. X; i" n* z" H                                               yes   |    no    |   yes  |   yes& P2 D; X/ W6 S% `; O) E; d+ k& c
  Arguments :' d' f) A: I5 K- U5 @7 g
    map-based  哈希表是包含所有在线服务器的静态数组。哈希结果很平滑,并考虑了权重,但是会忽略服务器启动时的权重变化,也就是说不能慢启动。另外,服务器是根据数组中的位置所选择的,所以服务器数量变化时,大部分映射也会变化。当一台服务器启动或关闭,或服务器加入到群中,大部分连接会再分配给不同的服务器,这对有缓存的实例会比较麻烦。3 \3 @4 \7 f4 n& d! `7 G
8 j& g! ^9 e" {1 N9 c7 e) M
    consistent  哈希表是由每个服务器构成的树,会在树上查找哈希Key,并选择最近的服务器。这种哈希是动态的,支持服务器启动时修改权重,所以可以慢启动。它有一个好处是当服务器启动或关闭时,只有其本身的关系被移除,当服务器加入群时,只有一小部分的映射会被重新分配,所以是一个比较理想的支持缓存的算法。但是根据其原理,算法不会非常平滑,有时候必须调整服务器的权重或ID来获得更平衡的分布。要保持多次负载均衡时的相同分布,服务器ID是绝对不能变的。(roloand:haproxy根据服务器的ID初始化其哈希值)
8 q' \8 c# W* J% q% m- B- v   默认值是"map-based",建议大部分情况下使用。
! i- ?3 O' A9 I3 u! N/ a2 x' D
  e4 c9 e. j1 G  See also : "balance", "server"
+ v  ~5 g2 K; b  Z$ @# U9 B) U% O' c% w" _4 W: k
, W" F5 j9 Z8 [6 @! }0 `( a
dispatch <address>:<port>! T9 g7 s+ T# f+ s9 b
  设置一个默认的服务器地址, w  _- E9 l' h: T+ U
  May be used in sections :   defaults | frontend | listen | backend2 E  f0 R: z4 Y. ~- Z) [4 p
                                               no    |    no    |   yes  |   yes
# w5 ~+ u5 I- F0 T3 C: o  Arguments : none
' y; \4 _* h. N/ }" s9 H% t1 V/ @    <address> 默认服务器的IPv4地址,也可以是主机名称,名称只在启动时解析为IP地址。
: N& r  Z$ L; T  h% B    <ports>  端口号,所有连接都会发送给这个端口,但是不允许像其他服务器一样使用端口偏移(port offsets)。
2 i. I5 @; X: e2 h6 Y. i
" b5 n' ~! X9 l! Z4 y+ B   "dispatch"关键字指定了一个默认的服务器,用于无可用服务器时的连接的处理。过去常用于前传非持久连接给后备负载均衡器,由于定义简单,还用于简单的TCP中继(TCP relays)。 建议对于明确的连接处理,应使用"server"直接声明。9 ?1 R, j9 Z6 r7 w) t1 u! O
' q. l  Y4 `# x5 T1 a% S; o
====================) b7 K. l7 ]' J
* y+ p' `3 N& T' V- P* f
一:Global parameters
+ T, s, f5 a; l) c$ D9 |. y' m) o* Process management and security% Y$ X* ?* {9 }  x  q3 }
- chroot 改变当前工作目录
" ]) ?/ i3 }6 v1 h  b- daemon 运行方式为后台工作4 ^, L3 o( ^/ S% b" e# Y4 B% H( N
- user - group 工作用户和组
( `, W2 g7 Q# |: n( }, Z0 N-log <address> <facility>日志输出设备% G$ c4 Z3 E! X3 W3 ~" y! J. D
- nbproc 创建工作的进程数目
. D/ L" s% F0 k2 j9 J-pidfile pid文件位置& M% c! N1 P, O, Z4 F
- ulimit-n 设置每个进程的可用的最大文件描述符- Q" n2 p/ K* z. a
- stats 创建监控所用的套接字目录9 ^& ?' c2 Z  Z1 A
- node 创建另外一个节点名字共用一个IP地址,用来识别哪个节点在处理流量
- k2 \' F/ J! v% b! w- description 描述实例的名称
! F. y3 L1 M. N0 [* Ymaxconn <number> 每个进程可用的最大连接数  A- T) \% Q; z# E/ F9 Z/ ~
maxpipes <number>  每个进程可用的最大管道数
0 G, T% T' _8 r: \7 W9 }( {nokqueue  nopoll  nosepoll nosplice  禁用这些功能* M& M# Q6 r) I0 X$ D
spread-checks <0..50, in percent>  health check 的时间间隔$ D! b% @. f6 e
tune.bufsize <number>
, m' A3 x+ q* N. g; G, A% }tune.maxaccept <number> $ h8 ]3 R0 G0 b  i; M8 W1 v
tune.maxpollevents <number>
+ w$ S. C  }8 ?9 Ytune.maxrewrite <number>
7 y( L4 ]" k. Y' S6 I! j  W. q2 [tune.rcvbuf.client <number> 3 h# Y2 h4 S6 d7 H# [+ c
tune.rcvbuf.server <number>
7 E! T$ v) O+ U+ b3 Mtune.sndbuf.client <number> 7 n0 u( c  R& S4 N
tune.sndbuf.server <number>
) v& L, H* e* k  A7 I8 i2 e以上凭字面理解吧
" Y4 ~) ?/ @5 l$ r: f( Sdebug  调试模式,输出启动信息到标准输出
( Z" ~0 q1 x" @' p" _% ~6 _quiet   安装模式,启动时无输出2 W/ g; X9 x% j+ x* Z. x

, Q6 i! h# O3 z二:defaults 块' E; ^6 y: O6 g
作用于其后紧跟的listen块,直至下一个defaults 块,下一个default 将替换上一个块作用于以后的listen; Y; v9 h# p& Z  l9 g/ L
frontend 块,接受请求的端口组
2 Y8 g1 m0 a$ t* i, ^0 z1 j# Lbackend块,后端处理的server 组' p0 v5 b! a3 g$ ~
listen块,frontend和backend 块的结合
! X; c5 n" B: X5 Y- A. K
* k+ b5 P& O! K# ]* f三:常用配置命令6 j1 B. h7 Y+ @2 E* Q" M  L

# ~6 P4 B8 U; fbalance <algorithm> [ <arguments> ] ( t- F) ~1 e% U  K+ H
balance url_param <param> [check_post [<max_wait>]]   负载均衡模块设置+ }  A, o9 ], y

, h/ a$ l% t1 Y8 X8 mExamples :1 u5 _% {7 |, Q9 z
balance roundrobin
8 D0 T/ d) i" a* Jbalance url_param userid  
/ S6 h' m& h" c# I8 g, |! X$ v* Kbalance url_param session_id check_post 64 3 r; |' x: @& _  I9 N
balance hdr(User-Agent)
8 P5 c9 u5 N0 q1 t7 L3 ]balance hdr(host) ( e! S% n0 A1 K- Z! C; V$ P
balance hdr(Host) use_domain_only
6 ^  j( ~0 B( X; b/ [) x1 J; L  X& `
block { if | unless } <condition>  在7层阻止访问$ c9 i$ F1 ^- q  U6 k; o' q
Example:
7 P5 d6 O& W1 L# f) i) eacl invalid_src src 0.0.0.0/7 224.0.0.0/3  acl定义和squid 很像* n6 [3 g: n: c
acl invalid_src src_port 0:1023
# u$ ^) a& V. Vacl local_dst hdr(host) -i localhost
! ~) P2 y% A+ W7 `! Bblock if invalid_src || local_dst
# D. F  S7 E0 A* N9 E! O
( G4 D7 @" j; t8 l; h( I% scapture cookie <name> len <length>  在请求和回应包中捕捉记录指定长度的cookie,name 为cookie的开头几个字母" Q0 y( y3 `, d1 f9 y; K) T

- ~" R7 }% `& K0 B* K5 ~1 oExample:6 e1 A/ ~8 E; d: v* ^% Z
capture cookie ASPSESSION len 32 8 M( ]2 D8 m0 R. d, C# N

' {! f& p7 N9 y* `8 j1 ~, qcapture request header <name> len <length> ; W2 @% d9 }6 `$ C: w: k
capture response header <name> len <length> 同上
+ k$ t# i8 q! e+ r1 J8 U8 ]8 g. \( e, ^
clitimeout <timeout> (deprecated)
  c/ Y" D) s; r6 W: econtimeout <timeout> (deprecated)  客户端超时时间,不赞成设置- Y, Q; O/ \7 C- J7 f
  @$ C: D' W$ R4 p
cookie <name> [ rewrite | insert | prefix ] [ indirect ] [ nocache ] [ postonly ] [ domain <domain> ]*   允许持续的基于cookie 的后端连接6 \6 F9 @- c( A! J9 B: P$ H

2 H  c+ |2 m) `default_backend <backend> 默认应用的后端' k, k# U+ ?% [7 Y
% l% `+ i% L/ S) p: U' j
Example :
) v. V0 s  |& w$ g& s5 A0 Kuse_backend dynamic if url_dyn . f2 Z0 @/ v/ ^  ~
use_backend static if url_css url_img extension_img $ q( N. ]! l' v  v( z0 f
default_backend dynamic    当没有匹配时就用dynamic8 ]9 J- S  @" Q/ c4 b: V( s3 G

3 y+ C8 ?! R* B* B5 p" a$ Nerrorfile <code> <file> 定义出现错误的代码的返回页
% N9 D" `- B% P, PExample :
' `& \+ T8 s2 A$ O6 V  c+ |/ Jerrorfile 400 /etc/haproxy/errorfiles/400badreq.http ) ?5 z' R% r- F8 e2 e
errorfile 403 /etc/haproxy/errorfiles/403forbid.http ! |$ X6 l6 Y7 Z  b0 l' f
errorfile 503 /etc/haproxy/errorfiles/503sorry.http
( ^' O, B, q0 E2 A' S5 k
( u$ h! X3 Z; a1 J$ Y' W# l8 Z  @: u; U' k6 S) [( L, P9 g
errorloc <code> <url> errorloc302 <code> <url>   出错重定向到指定url
* ~) Q$ O5 J  o8 e  L. k1 @force-persist { if | unless } <condition>  在特定条件下,强制继续连接down 掉的服务器后端
5 Y3 O* G$ F) {0 W$ }6 {, |fullconn <conns>  定义后端组的最大连接数; v, L# \$ I1 m: _
grace <time>  haproxy停止后,再持续多长时间用于处理连接
, p/ F" E& e/ y, ?# uhttp-check disable-on-404  如果后端检测返回404,将不再把后端计入负载均衡( r1 n) D1 y6 O  [2 J
http-check send-state 允许haproxy 发送 X-Haproxy-Server-State
+ d; }( W2 J$ N- phttp-request { allow | deny | http-auth [realm <realm>] } [ { if | unless } <condition> ]   七层访问控制9 H3 |/ O4 l3 O
Example:% `  j9 C- P( H& R! G
acl nagios src 192.168.129.37 Q; c% x* {6 M, ?8 z
acl local_net src 192.168.0.0/16
2 y! o& g4 a; ]- L( ^- F! @5 c; G1 L) Oacl auth_ok http_auth(L1)# |/ \" c6 c) n- n% _6 o7 A

: d; E4 S( W7 v1 I' p& @, Bhttp-request allow if nagios
: V( B( o% W- W+ Ghttp-request allow if local_net auth_ok
! c/ o1 g% I0 b4 Ohttp-request auth realm Gimme if local_net auth_ok
0 K* G0 b! \  O: y9 ~" \3 Uhttp-request deny
& V& O- H* }* H3 L, e* P. M( Z( [2 e/ Q) Y8 Q
Example:8 D  m2 g) s, w$ s9 w. ^) J
acl auth_ok http_auth_group(L1) G1
# r7 ]( R3 J9 [) r
3 a( l( N( _! u3 @* phttp-request auth unless auth_ok
3 c0 G) R* A. h6 S3 [' `1 {: A0 U+ k' W. C0 r' m
mode { tcp|http|health }   设定启动的实例的协议类型
# L4 e9 u- y. ?1 g4 Nmonitor fail { if | unless } <condition>  监控失败条件设置. n+ v0 b7 ]  p9 u

) u" q$ H: [8 ]9 boption abortonclose 丢弃由于客户端等待时间过长而关闭连接但仍在haproxy等待队列中的请求
/ T& `8 o$ g  w* G  c  X' A' C+ y9 xoption accept-invalid-http-request  接受无效的http请求,建议关闭(开启可能有安全隐患)
2 U' J+ x+ x4 \+ j+ ^- W. roption accept-invalid-http-response 接受无效的response ,建议关闭% y0 t9 d6 O. j5 O2 p
option allbackups  应该是后备服务器,如果正常的后端无法使用,就使用这些后备的设备,balance方式还是用原来的,没有优先的选择,常用来提供错误的页面  B9 ~9 P4 c& Z* U% a4 ?. G
option checkcache    分析后端response,阻止可缓存的cookie,它对response 进行严格检查,包括"Cache-control", "Pragma" and "Set-cookie" ,查看在客户端代理那边保存是否有风险,如果这个允许的话,符全以下条件 的response 将被允许,其它的将被阻止。" P9 H% S, T/ T: T
- all those without "Set-Cookie" header ;4 O3 |' S# Y2 R. P. t
- all those with a return code other than 200, 203, 206, 300, 301, 410,
# y3 r+ q$ k" v9 ^: cprovided that the server has not set a "Cache-control: public" header ;
8 y0 E1 m/ [: C) o) h% u6 |1 ~2 f- all those that come from a POST request, provided that the server has not
( N+ D% o, I; `( Yset a 'Cache-Control: public' header ;! e: H9 n+ w$ A3 u4 z! F1 q  f
- those with a 'Pragma: no-cache' header+ o( ^2 N+ g! {
- those with a 'Cache-control: private' header
% x" r# O8 r  D, I; r( J0 x- those with a 'Cache-control: no-store' header
5 R: \% j! [7 v2 h$ O( I- those with a 'Cache-control: max-age=0' header
8 h/ J" v' ?9 R, ]2 ^' |9 `1 R- those with a 'Cache-control: s-maxage=0' header
- G& S- t+ z2 E3 }; }- those with a 'Cache-control: no-cache' header. y/ x% f* D/ t3 v  [* \
- those with a 'Cache-control: no-cache="set-cookie"' header
7 J2 |9 t& k- Y5 }% y$ D+ O  A- those with a 'Cache-control: no-cache="set-cookie,' header/ r) O! Z, E# G3 L* @
(allowing other fields after set-cookie)0 `$ [  S& E0 X6 {* C- D& j6 P3 N
; I" Z7 N3 c  q! n
option clitcpka   是否允许客户端发送tcp keepalive 包,这个和http 的keepalive 没有关系$ @0 l* K& A; P2 ~# z% g* x1 P9 n! C
option contstats   允许连续的流量统计更新
) E2 q' \2 o' Doption dontlog-normal   开启正常连接的日志8 q. c7 G4 \/ J0 w0 n
option dontlognull   记录空连接+ Y: W- |# A( p- h; M) {1 W3 d
option forceclose  允许关闭session 在后端把response 发送后" w$ @6 |8 `# p  M
option forwardfor [ except <network> ] [ header <name> ]        允许在request 中加入X-Forwarded-For header 发往server, N* J7 S* ]) O% B1 O) }
option http-pretend-keepalive    定义是否haproxy要宣布同server keepalive
: V5 T1 h* X' B- d% i: Moption http-server-close   是否开启在server 端 connection closing
; f# n( _$ a: r6 K9 Zoption http-use-proxy-header    用non-standard Proxy-Connection 替换 connection, F& E9 p% Y) B' L8 A0 X
1 v; l/ R8 a1 H3 I% _! t: D
+ R8 `2 ~6 E8 ]4 c
option httpchk <method> <uri> <version>  允许用http协议检查server 的健康% L6 ?) d& T& E0 Y
Examples :
% Q) ~* I$ d' l, s" H; {2 |: D* R# Relay HTTPS traffic to Apache instance and check service availability: M7 ?% Q, D4 |5 B# s% Y6 Z
# using HTTP request "OPTIONS * HTTP/1.1" on port 80.
- Y) _3 x. W( ?* u) Pbackend https_relay$ t. R1 Y, l3 w4 f+ P
mode tcp7 o" ?% y) ^5 e$ H2 B
option httpchk OPTIONS * HTTP/1.1\r\nHost:\ www, C: K7 W) f  X- @$ k6 w" J: B/ `
server apache1 192.168.1.1:443 check port 80
, N% G4 V/ I0 {, f) L5 d
) Z5 ~( q% |5 W2 P, G  V* a, yoption httplog [ clf ] 定制日志格式2 I$ J, e7 W4 T2 K( h
option http_proxy  开启http 代理模式,只有最基本的代理功能/ \; ?7 f! E4 _' r, s" f' F* H4 i
option ignore-persist { if | unless } <condition> 在某条件下拒绝持续连接,适用于对静态文件的负载均衡2 A! X! X$ e: I# k( \, d4 K( {  s$ m
option independant-streams  启用双向超时处理,如socket 的read 和write 4 \2 w$ B0 C" C" O6 l  R7 v
option log-health-checks   记录健康检查日志( d8 N( W: @+ p8 R/ O, D1 r
option log-separate-errors   对非完全成功的连接改变日志记录等级
" J' W; p- T8 N, o! a1 y; loption logasap   大传输大文件时可以提前记录日志; p+ a) t3 f% A% J
option mysql-check   mysql 健康检查
  M& }( H5 J0 u6 w; h% toption nolinger  清除肮脏连接后开成的tcp 状态及占用的资源,不过并不是强列要求你用这个选项,当然如果你有thousands of FIN_WAIT1 sessions on your system ,那肯定得用了
' T' ~$ h* n: t3 T, f0 E; Hoption originalto [ except <network> ] [ header <name> ]   允许在requests中加入X-Original-To header 发往server" |  W- C6 [! n3 l0 E& E- s& A4 ^
option persist     强制将http请求发往已经down 掉的server3 _/ {! g5 r0 `% ?
option redispatch   是否允许重新分配在session 失败后9 g! f) `( S8 ]" Z
option smtpchk   smtp 检查
, L) B4 x! [0 noption socket-stats  允许对单个socket进行统计
$ O) J- I1 K1 v& r. j: G4 Ooption srvtcpka  是否允许向server 发送keepalive, }) l5 K7 m0 m0 A
option tcpka 是否允许向server和client发送keepalive" o! e- x9 F- [+ P6 f3 P, k1 o
option tcplog  允许记录tcp 连接的状态和时间7 T) e# O. }% r
option transparent   允许客户端透明代理
2 l9 ], I7 X+ O" i7 grate-limit sessions <rate> 设置frontend 每秒处理的连接的上限,如果到达上限就停止建立新的connection. ]0 o6 \0 R' N5 X

0 h2 q$ Z. ^4 I& ~; c" Rredirect location <to> [code <code>] <option> [{if | unless} <condition>]) J% X5 U& ]+ t  ]5 I- X, [
redirect prefix   <to> [code <code>] <option> [{if | unless} <condition>] 重定向,相当于rewrite
/ l$ m3 Z2 m1 \3 k5 C: H" Q
8 x* }- u( n- s: `. i4 YExample: move the login URL only to HTTPS.
1 \5 {6 j% Q. d& Q0 dacl clear      dst_port  804 w/ i1 {' j  b! Z
acl secure     dst_port  8080) \6 i* V; Q( w: i: q; X
acl login_page url_beg   /login4 U- A2 \/ h% j2 p, ~
acl logout     url_beg   /logout: K5 B0 p# u5 r! [+ r2 o- j
acl uid_given  url_reg   /login?userid=[^&]+
# \1 U4 \. F& s# Oacl cookie_set hdr_sub(cookie) SEEN=1
+ Z; C5 _. V8 V- H) V/ i  T0 G; r3 x3 W! q/ U! t# q: E- L
redirect prefix   https://mysite.com set-cookie SEEN=1 if !cookie_set
6 E, s; l* z* j5 v" C; yredirect prefix   https://mysite.com           if login_page !secure! ?* t: U! y! O7 h/ w& v8 d
redirect prefix   http://mysite.com drop-query if login_page !uid_given
) J& h/ G7 l. i8 X0 \, g9 s6 Rredirect location http://mysite.com/           if !login_page secure. x- k, o0 A5 X" D/ l' N8 Y" \+ M: [$ i' w
redirect location / clear-cookie USERID=       if logout
+ s0 f) ?2 m4 V1 ?/ {+ U- `6 ^4 B7 B9 F) a% C: J. R8 _4 w
Example: send redirects for request for articles without a '/'.
# m! Q) w& l  n+ d2 H( ?acl missing_slash path_reg ^/article/[^/]*$
  t, B4 x+ Q$ ]9 m' r8 _2 aredirect code 301 prefix / drop-query append-slash if missing_slash, V/ Z/ ]- ?6 p* q* ]  v
redisp (deprecated)( ?$ ^- W7 e6 u) p$ }* ^, E, k
redispatch (deprecated) 开启session 重新分配在connection连接失败后,不赞成启用
2 U: C" A6 O1 i8 ?reqadd  <string> [{if | unless} <cond>] 在http请示的末尾加上string
  w& D8 i- N; f" m4 }
: K. ]: `& m4 d8 b5 e5 M/ }+ Y& T' ^$ xExample : add "X-Proto: SSL" to requests coming via port 81
$ p" S0 ^* Y* ?  X! t. K% nacl is-ssl  dst_port       81
9 G: z4 ?7 K; G6 j1 [( @7 _+ areqadd      X-Proto:\ SSL  if is-ssl
: s& D8 f* V1 z% Y' v+ o9 E! T/ J" \
reqallow  <search> [{if | unless} <cond>]1 Q! {/ r/ f$ m* w9 u1 G7 d/ }
reqiallow <search> [{if | unless} <cond>] (ignore case)    request 请求访问控制  ?5 T# K% e$ U( a: g' X  y* ~
* K/ y- R) q5 {
Example :5 L# q2 y; \& _
# allow www.* but refuse *.local
; [+ G" P6 L# K. V8 ?) Rreqiallow ^Host:\ www\.* M( O0 Y  g/ N  N4 `
reqideny  ^Host:\ .*\.local, {/ [) O8 p( Y) \8 Z

4 b( @" Q' B2 B1 {+ K( k, }reqdel  <search> [{if | unless} <cond>]
1 E0 d+ x' s( @9 G. s$ N" areqidel <search> [{if | unless} <cond>]  (ignore case) 删除请求的head 中的内容
; Y5 @) H. D( d: T: @1 t' P' U* m; q
Example :$ g; h/ m/ F$ s7 n4 ^
# remove X-Forwarded-For header and SERVER cookie0 |) l; T% O5 @5 m5 f! ]' E2 N
reqidel ^X-Forwarded-For:.*
* Z: p  R. L1 g* }  Oreqidel ^Cookie:.*SERVER=2 Q& y" K) L* p: G- L) N3 W
- N: g8 {& ]/ s1 ^
( F- j8 n$ E( A/ j; S4 l7 s
reqdeny  <search> [{if | unless} <cond>]
: }+ N7 H* c% d" b* x1 ]reqideny <search> [{if | unless} <cond>]  (ignore case) 拒绝访问
) {; Z4 u  r, `3 O
$ T6 C1 i- N* ]2 F5 jreqrep  <search> <string> [{if | unless} <cond>]- D, _. }) Y- E' D& v
reqirep <search> <string> [{if | unless} <cond>]   (ignore case)  request 请求替换$ t0 o+ {2 x3 N' x' X8 S( Y
Example :
3 P  V$ Q( _# d2 \) \/ V# replace "/static/" with "/" at the beginning of any request path.
/ ?( ]: O5 Q. Treqrep ^([^\ ]*)\ /static/(.*)     \1\ /\2
8 z+ O0 ~* H3 m" @/ p+ v, y6 J# y# replace "www.mydomain.com" with "www" in the host name.
$ D  v1 a- K/ f# t; S8 P' ureqirep ^Host:\ www.mydomain.com   Host:\ www
" z0 x$ j& O  }8 E! x3 b- D  S8 D: ~( w9 ^8 K3 J
reqtarpit  <search> [{if | unless} <cond>]
0 m$ S% u3 k' ^+ I0 a8 Hreqitarpit <search> [{if | unless} <cond>]  (ignore case) 阻止http请求中的某些信息4 |7 T. V# d& F; W- I! `1 L

; V% O- J. e+ s( N' R% r# qExamples :, f% t: h1 c6 ?9 X! v' Y
# ignore user-agents reporting any flavour of "Mozilla" or "MSIE", but
8 O+ Y4 f! P2 _9 |6 L) s# block all others.7 a! y# t! W% C8 C" |7 y) ~/ ?- m4 a
reqipass   ^User-Agent:\.*(Mozilla|MSIE)
. ~) b2 a4 U; p. Preqitarpit ^User-Agent:+ T; w' r8 f% Y2 O5 I! P
) R' D1 \% y; P3 h
# block bad guys- K) Z& G  u$ r) G1 c: {* M$ d
acl badguys src 10.1.0.3 172.16.13.20/28% D. X. a  w, I0 l  L
reqitarpit . if badguys
8 R: P- S+ Z% h" i4 G
1 S2 m0 d& |3 M4 W" D) O5 g9 d/ c* tretries <value> 当对server的connection失败后,重试的次数
6 `5 h( c2 n5 Arspadd <string> [{if | unless} <cond>] response 增加信息
+ [# o# r3 H) E( c4 L. b: E& hrspdel  <search> [{if | unless} <cond>]( i1 `5 w4 D5 W+ {" k; i
rspidel <search> [{if | unless} <cond>]  (ignore case)( y) y) P& M2 @6 b/ T
rspdeny  <search> [{if | unless} <cond>]( d0 s% D8 X) u
rspideny <search> [{if | unless} <cond>]  (ignore case)
& s( h7 l! @& k) s: Lrsprep  <search> <string> [{if | unless} <cond>]& z; ?. }: m# H. h+ q9 ^5 h
rspirep <search> <string> [{if | unless} <cond>]  (ignore case)3 d- A6 I6 v9 I
以上和request 的差不多  w4 s: H, T. d. Z

; @- p; T4 N1 _0 y2 {source <addr>[:<port>] [usesrc { <addr2>[:<port2>] | client | clientip } ] 定义从代理出去的连接的对象,用于限定地址可以访问server1 h8 j6 x; U, V+ z9 c
& N/ H7 _5 T8 _, ~
一些timeout8 e3 r1 U, l! p/ d. t

# e$ ]. Q) V& R, F6 esrvtimeout <timeout> server 处理超时,不赞成设置
5 P- D. X$ }& O4 r3 Mtimeout check                             X          -         X         X5 k1 g+ i; x6 p/ B
timeout client                            X          X         X         -
1 q3 x  K+ L+ L4 b6 z$ t  @timeout clitimeout          (deprecated)  X          X         X         -* Y# \* e: @3 k% F8 P& ?; j) A
timeout connect                           X          -         X         X
9 e- [# Y- _# X% m. ]timeout contimeout          (deprecated)  X          -         X         X! h- [0 X: U. X  ~7 g, t2 w0 c
timeout http-keep-alive                   X          X         X         X' k) Z. F" K  [7 h5 ~+ }
timeout http-request                      X          X         X         X
* r" r$ e- m5 R- C9 Z) gtimeout queue                             X          -         X         X/ s% W: b+ [% [1 b9 _
timeout server                            X          -         X         X7 V/ n" F4 J& `3 k3 a' x+ z
timeout srvtimeout          (deprecated)  X          -         X         X
) D$ @- E. A' f2 R) M/ s: Gtimeout tarpit                            X          X         X         X% T# N' p3 j6 H" d2 j. J8 C0 J

' H) i2 o" |. i- H+ _8 d# e$ `4 n! m( v  N
stats auth <user>:<passwd> 监控统计的帐号和密码. n- ?/ l1 X$ X) Y2 K
backend public_www
/ I! [& G1 v" V/ yserver srv1 192.168.0.1:80
& u6 s9 t8 U8 o9 G% r7 ?stats enable
' ]. `  U' ~7 \/ qstats hide-version/ p% s' l- N0 k5 T! U8 T5 Y# A
stats scope   .
4 O: E. Y/ m* Z' B, B  Fstats uri     /admin?stats
- E! W) ]+ {. qstats realm   Haproxy\ Statistics
  t  w2 [6 @* ]  O+ B) }2 Gstats auth    admin1:AdMiN123* \! B/ o# Z  F  b) R; k: @$ V
stats auth    admin2:AdMiN321
# x7 W  ?. J. z0 o; Z! d. z: i9 a6 ~) E4 W+ E; D0 J
# internal monitoring access (unlimited)8 d, `6 _6 q! H
backend private_monitoring" y& J2 u5 i' f- A- Y3 s. q
stats enable
0 k9 R3 ]/ x, x8 D7 L7 t4 {stats uri     /admin?stats
7 F' }8 t6 y" @( W( ]+ Fstats refresh 5s
4 v7 d' M! c6 T% Y; o: Q& ?2 g, v5 p! b  [( R5 E- k4 v
还有很多参数,以上能用到的也没有几个,只要满足当前需求就好,对于性能要求高的话,建议把不需要的功能 都关了吧.+ G( }6 \1 }* i3 s* \

. D9 Y( h8 C- g7 [" {====================
! a  d, R- P% K1 m' {4 V3 x" I/ w& |% A9 ~% ]3 r( R
HAProxy的配置示例
) I7 o* z. S- f- _8 v# u# ^! O; Y+ g/ I
HAProxy配置中分成五部分内容,当然这些组件不是必选的,可以根据需要选择部分作为配置。
* \0 w  Z4 m. B* t5 \8 @- {" iglobal:参数是进程级的,通常和操作系统(OS)相关。这些参数一般只设置一次,如果配置无误,就不需要再次配置进行修改! y& C4 q" O) R  I- Z" w! [
defaults:配置默认参数的,这些参数可以被利用配置到frontend,backend,listen组件
2 ^6 h) }& s! F; ufrontend:接收请求的前端虚拟节点,Frontend可以根据规则直接指定具体使用后端的 backend(可动态选择)。+ S% v; r  `& V; B% J' x' p
backend:后端服务集群的配置,是真实的服务器,一个Backend对应一个或者多个实体服务器。6 b3 W/ f' ^& }
listen:Frontend和Backend的组合体。8 b  h+ V/ z. {( {# K2 r5 b
. s5 Q" O7 \9 D4 s) W
下面是HAProxy的一些常用的配置,这个配置是用来说明HAProxy的一些常用功能的配置,具体详细配置请查看安装目录下的doc目录下的文档文件,或者到http://cn.haproxy.org/下载中文配置说明文档
; W* ]5 m+ Y4 v3 B, o  u' q1 u
" q& v" R- l: B( J' P配置具体实例,后附说明:
/ O3 {* s4 `6 d" a" J4 V
5 S( p% S. P- @, F5 l! h- Pglobal) \6 z% P6 V; k2 D0 a/ |

6 d' W& z- a+ Z5 D) w" L#全局的日志配置 其中日志级别是[err warning info debug]3 G0 O7 `" }" f( \4 d/ X" V
2 e8 P" n, K7 n1 R
#local0 是日志设备,必须为如下24种标准syslog设备的一种: ! a& o9 U8 A, c

3 a! }- I# s3 e1 A$ m5 C#kern user mail daemon auth syslog lpr news 9 s! J8 e! J) d7 Y5 G

! n* J# a0 U$ ]#uucp cron auth2 ftp ntp audit alert cron2 ) a1 Y$ u7 @9 o( @. `& E+ u
( I9 M; W- @/ s- A
#local0 local1 local2 local3 local4 local5 local6 local7 : V' o, ?9 g; w: ~
4 G7 q8 i" @; Q
#但是之前在/etc/syslog.conf文件中定义的是local0所以
: }' B. D5 o/ k* E+ v
6 S: R7 P: j$ i#这里也是用local0
" _& ]$ b& a* h4 l0 e/ u+ K. Y: C0 l/ n" P4 E0 A# _
log 127.0.0.1 local0 info #[err warning info debug]
0 z0 h7 f4 i4 G  N& U8 p) m
3 C; S- J% g$ {$ N& N9 G+ Y#最大连接数
# o! {) I) m0 n# ^3 t* ?7 l+ S) ~, C8 }/ p9 W
maxconn 4096
: l$ ]( L* h( r- ^! F4 T( B
& r0 l, i# s/ O; G/ n% V#用户
  l, N( ^5 w1 n" i. r8 Z
5 e; o6 e. L$ s6 s% s( H4 Auser admin! E9 K9 I0 r% S8 y; h. B

# k; }8 L& b  B: q8 e# q) K' C#组
0 K) |* Q/ v( z
1 Z2 [" F. t5 F. s2 Mgroup admin
. D  U# l# H1 [7 Z  {2 A8 n' X) X+ O2 `+ v' Y
#使HAProxy进程进入后台运行。这是推荐的运行模式
. U- k& s9 H7 |8 h
* d) V: ]# Q/ t# j9 |daemon4 K! Q0 \6 l$ o" m6 f6 a0 j/ w7 J$ L

1 s6 E) m( e# M3 D5 M5 k#创建4个进程进入deamon模式运行。此参数要求将运行模式设置为"daemon"/ W1 M9 R9 \! p1 P( O6 z- r
% W. N3 ]9 ?+ d, ]0 L
nbproc 4
7 w- q; m6 b1 N% k# [2 t9 z" G6 t4 z) ~  R) c
#将所有进程的pid写入文件 启动进程的用户必须有权限访问此文件。
( o$ t$ H% j! C8 d. O' k  e  z! {8 h% r4 X3 `
pidfile /home/admin/haproxy/logs/haproxy.pid- D( O! t/ q; f* C- C+ J4 ]3 Q' E

0 \$ ^/ _0 C1 l, d+ Cdefaults
9 O0 ^# @4 N  J% j7 d
( f+ k- ~) g3 r# t, D#默认的模式mode { tcp|http|health },tcp是4层,http是7层,health只会返回OK0 T& P" \& g2 }* @" @- J8 e

4 l0 s' W9 Z% L8 U1 Mmode http
  o  ?! w* l) x% z, z2 B
4 u5 l% @( {" g7 j" V* H" b#采用http日志格式4 N( _1 r( Q9 R: x$ q% O

3 C; O" O% e( Ooption httplog. U# Q2 r9 c" T8 N2 M3 g7 n
: {! ?7 V. t) M+ k& u+ j% k
#三次连接失败就认为是服务器不可用,也可以通过后面设置
9 ^$ ~5 g$ I' Y! A# v
% ^) I) f& D9 J. B& a* K( H, i, U: d* mretries 3
  F; f* X' r8 L6 s" C! o" _+ ?9 J' G2 g: D
如果cookie写入了serverId而客户端不会刷新cookie,
( x" H+ i7 ]/ K% W
. T9 Q0 L" Q2 _6 X4 r5 D#当serverId对应的服务器挂掉后,强制定向到其他健康的服务器9 x+ P. Q. T0 s( ^
) ?& u  y8 c4 p" W8 Z
option redispatch' |' ], L: M& y2 ?5 P, q4 H
8 ^  h. G, O- @! u* J3 f
#当服务器负载很高的时候,自动结束掉当前队列处理比较久的链接6 b$ C" i- E( \- U
* X9 I. [1 L! _1 c4 x* A; `
option abortonclose
7 z6 ^# v; T; R7 l! Q8 X
0 C+ ]$ z/ ?7 x0 T9 a#默认的最大连接数
4 f2 ]  R9 G1 ]+ F# [0 W: `# a  |- L3 f
maxconn 4096
* g4 |( a5 }  u# P: R3 N. g9 a/ U( o, C3 V3 S9 L3 n
#连接超时7 Z1 {4 J1 C) r8 x) _" b
) E* d8 F# n9 g( |5 S" a
contimeout 5000  A; b3 r; g1 `' W1 V0 |9 A8 t
( @$ g7 K, [$ ]% z& M# g8 H' b; R
#客户端超时
, _- t( a7 L- e( X3 g# J
  |, b8 H3 F6 R1 g, T9 Eclitimeout 30000
2 H( N3 W/ O) z2 l/ r3 i# H( q( I0 n  L5 ]! a/ R
#服务器超时; y! M, z; @2 l1 y& b  h+ h9 J# n8 S! Q

: r1 n0 ?+ q4 t1 ^$ xsrvtimeout 30000
" [7 f5 t' E: h& ^! C5 Y' r
- R! g) K4 ~5 K, A8 P& D. z: c#=心跳检测超时; g& i  E  U2 j

5 w/ w) n  j8 _- B' P. z3 W, Ttimeout check 2000& j, H4 R# ]6 C) h# P* _, ~7 f

% M7 K9 v8 p' f/ i#注:一些参数值为时间,比如说timeout。时间值通常单位为毫秒(ms),但是也可以通过加#后缀,来使用其他的单位。
9 i8 v8 y6 \5 r" ]( T* e) [1 y9 q  y* H/ u% ^5 ?. N
#- us : microseconds. 1 microsecond = 1/1000000 second7 w  O3 u! _1 x% J2 y

0 S  o" ]2 q+ {: s/ p#- ms : milliseconds. 1 millisecond = 1/1000 second. This is the default.
0 d: ~, e9 E4 u) p* p/ v4 e& P5 N( K. T- h" x" ~: C
#- s : seconds. 1s = 1000ms/ Q# `9 g$ p+ A
% l* N5 t2 Y; K3 {3 i/ c
#- m : minutes. 1m = 60s = 60000ms
6 s5 y* o1 R0 R4 g, j; p4 \2 k& l
8 L! C: _8 K) ^; a+ S: R#- h : hours. 1h = 60m = 3600s = 3600000ms
7 f4 Q" _$ p8 Z* h8 W. w/ B( p9 ]8 }( t
#- d : days. 1d = 24h = 1440m = 86400s = 86400000ms
- N0 P: Q( b% ]2 q: n8 ~/ W# c# P; P7 c6 \( M9 R6 G
########统计页面配置############
2 j9 ]# l4 L( k5 m; A# I/ `/ o9 i( p6 l  N7 D+ ]$ S! f% L
listen admin_stats- \# S9 ~+ Q& \7 _' m
( G( R  o* K) _  X8 u6 b) _& E  L( i
#监听端口7 W1 {' z3 T7 ?5 {( y

6 P3 I1 q9 j$ Z3 ^& N8 V+ vbind 0.0.0.0:1080# |- t. ^7 u6 b0 O1 Z$ n5 l

4 i" c" q' U0 J5 a8 D$ }+ R#http的7层模式* A3 _; T& b! s

3 @+ v" g  S! m$ e1 amode http
0 k' F2 d6 o* e7 S- l  q3 k8 j! h1 [, W
#日志设置" D9 l' ]8 Y3 z) q  G, s4 x1 A  ]

: J! h; \* G9 [log 127.0.0.1 local0 err #[err warning info debug]
% {  B/ |: O7 {$ l: U. D
6 `0 E6 X* z& L; z$ K# P) ?#统计页面自动刷新时间4 G: r" k/ n% r4 K3 e, m) k! r. i

. y* g! H" X' u. Dstats refresh 30s8 D! L& S# u# E3 ]0 N) I  P6 F+ [: p

4 S7 v5 H" T, S+ R6 G#统计页面url. P# _2 ^2 ~+ I# c. H

1 ^8 @* s- r& D( R3 a% Istats uri /admin?stats( Z- P" A1 K* R
- v4 p  E) T% r- @
#统计页面密码框上提示文本
! n% d# n. k  q# i& g- L4 \6 Z, R; n0 \2 r
stats realm Gemini\ Haproxy
: j* [; R3 [- g* F3 W. Q  n3 B( H! Q) f2 Y' F$ y# C! A
#统计页面用户名和密码设置
& c$ q3 r: K" {; y7 F/ o, i" c) P0 ^' u0 E5 z
stats auth admin:admin
( t' B  h4 v4 }/ a2 ?0 m/ D9 N, {  J0 m  O! Q! S, S+ O$ c
stats auth admin1:admin1
5 H$ d+ b7 f4 ^" s: I
2 r7 V2 G- L  D6 ]# `" m7 k#隐藏统计页面上HAProxy的版本信息
8 M( ]) b9 L: W* t# E
0 V) b7 g1 o: e  e# i8 estats hide-version
7 L! k2 x: V; R. K
8 \* x/ n; A  _+ G4 ]4 S#######网站检测listen定义############
8 i9 x* [: o4 |
9 V  {( @" ~5 R* j  Mlisten site_status
+ }( m- F9 [/ p' r! t
, R6 _! P- \/ `! U9 c, abind 0.0.0.0:1081
: q$ H" S3 K# t2 H0 e( o  Q1 W+ d
! Z+ b8 s( r; |6 \! _9 Qmode http
9 d. Z  X9 g2 @, r' z& Q( }
' |" ~3 _" [6 M: D# ?log 127.0.0.1 local0 err #[err warning info debug]9 W' [1 W, C7 |6 V( Q2 ?, b' l
8 d+ }! }/ k6 K1 C& q3 l4 s7 q
#网站健康检测URL,用来检测HAProxy管理的网站是否可以用,正常返回200,不正常返回500( {4 T: a3 K, V) p. _  s4 D
" M8 X$ l  v8 ~7 j
monitor-uri /site_status( Y2 ^8 M; ^; t$ W; F7 K. }/ U

, v" A  D8 U) n5 F! C* H5 M8 M#定义网站down时的策略4 A, {" N' e3 h- L8 r

  n% c! X' u# d6 L% G" |#当挂在负载均衡上的指定backend的中有效机器数小于1台时返回true+ {4 q8 I) s" G8 g

* P8 ?' S' H2 T9 {& W4 p  Dacl site_dead nbsrv(denali_server) lt 1. Q4 u+ T6 h( V" @* J
1 ^  q! P4 z" i* }7 L3 ^- R
acl site_dead nbsrv(tm_server) lt 1
  Z: Y6 M! a) y  \1 m8 U; W
& I# R& ]2 T; j7 P) n' _& q$ w( b7 _acl site_dead nbsrv(mms_server) lt 1; f0 p( R. M; C  g* R
$ B$ |4 O# J! L+ [* F
#当满足策略的时候返回500
0 G7 r5 y* R: k, [
8 Z% y+ Z- J7 O/ V8 s# lmonitor fail if site_dead
1 O: Q' I6 R) E; s
7 q. s7 w) O# @+ i% z% N#如果192.168.0.252或者192.168.0.31这两天机器挂了' \; q" Q& M8 [3 c

9 R' p9 ?, L% f5 h3 T/ i* G#认为网站挂了,这时候返回500,判断标准是如果mode是
2 `- @0 C  B5 p+ V! Z1 z  Z$ u1 K
% j. K% X, Q% z4 q0 l' p& B#http返回200认为是正常的,如果mode是tcp认为端口畅通是好的
4 q9 @2 D4 U7 @) h) [' i9 O( |* m( x6 Y: n, `" W6 M: i
monitor-net 192.168.0.252/311 ]6 L6 u) W- O& z; K* f: H
! u& \7 z. P& ]# D. \
########frontend配置############
9 ~" B( r' I! A# l- r; A4 V8 m& q$ i1 |! i
frontend http_80_in8 W0 X+ z& p/ l- g: i: r
, Q9 G1 |: _7 x7 w  h2 P0 s/ q
#监听端口4 P$ m! d: I' z6 K5 x

0 U/ l4 p2 J! R9 e1 ?bind 0.0.0.0:80$ W% k) n) M5 n. Z, s; ]

: W1 A! c7 R/ c, w$ z( X#http的7层模式" Q$ ]! o: r- Y$ E
3 F% S5 N6 z  \& S! ]4 c
mode http! U' F- o& T- V5 R
7 D9 b& f& D3 d0 N0 e- G
#应用全局的日志配置
$ \4 v% X) R0 E7 [- p6 }8 T# `8 V0 _
log global
! c2 `& t3 b' z& y! J
" u8 t" b# ]; ^4 r3 |1 [#启用http的log
7 ]% Q, G+ X* S. w% ]9 ]" Y( n2 {3 i( a
option httplog
' Z/ g1 U. V' t8 e: P8 n" X, O* ?% B  `3 z- p( t6 ~/ N
#每次请求完毕后主动关闭http通道,HA-Proxy不支持keep-alive模式
9 L# n' x6 J8 `3 G; }) d2 W1 j1 R9 g7 K
option httpclose
8 K/ ]6 c* d1 }) ]
- u) v$ f- ^0 L9 S( |3 t#如果后端服务器需要获得客户端的真实IP需要配置次参数,将可以从Http Header中
4 t2 {' R1 M) N( ]% Q+ T1 G- {% S! F$ k0 ?. }: k
#获得客户端IP8 ?, Q/ i+ ]; [' D/ m/ W

4 L; U$ v3 H9 [8 }% doption forwardfor/ @  n. z4 G8 {% B( z# x
( A1 y1 @8 ~; Q+ A$ R8 a/ y; a7 v: M
###########HAProxy的日志记录内容配置##########
5 p* d, I+ j% G9 W, T  Z: X& O7 v4 B7 r0 p; q: O! U& X
capture request header Host len 40+ v% K: ?( e5 L0 R1 d# G) b% `8 t

+ {& U* H' b! k2 P6 w! G' _capture request header Content-Length len 109 V& r/ N( S9 }

4 a$ M+ T" `  b0 o. z8 ]) `; Ocapture request header Referer len 200- M, ]4 t+ }) T: ~
/ G$ ?  o. j% q0 ^, F7 Q# K9 D/ R
capture response header Server len 40
& t9 D- d, @- P% E) O3 K
' @$ x( W$ b3 j2 P1 j; @/ A+ gcapture response header Content-Length len 10- }7 K: w1 K' K. L" O& Z/ l

$ |$ f# w5 k5 {/ ecapture response header Cache-Control len 8
4 t$ w7 ~5 B5 p/ C3 m! Y# i$ C3 q) n" k
####################acl策略定义#########################
0 W2 V1 z  l+ d& I9 R! F( i$ K$ \) q% a* `6 H
#如果请求的域名满足正则表达式返回true -i是忽略大小写
1 l4 ?5 M* y) }7 c# y' N+ W. D
& k, G- Q: {* F  {acl denali_policy hdr_reg(host) -i ^(www.gemini.taobao.net|my.gemini.taobao.net|auction1.gemini.taobao.net)$
" W) ~" A( y& ]# C' h, h' m: Y
3 s7 k" ]4 C: f, \. w. X; H#如果请求域名满足trade.gemini.taobao.net 返回 true -i是忽略大小写
( Z6 @3 [. W) W: ~- R
6 f' e! O; B7 h7 Kacl tm_policy hdr_dom(host) -i trade.gemini.taobao.net
2 y1 s! A' A+ L0 |# U5 }! o. q; K7 V# V
##在请求url中包含sip_apiname=,则此控制策略返回true,否则为false7 N* X# ]' [* V" z+ }$ I- Z
7 }2 S( r) B/ \- R2 p
acl invalid_req url_sub -i sip_apiname=: \% W% B" ~% s; N, \

0 B9 s1 ]6 @8 i; u, A, B$ v##在请求url中存在timetask作为部分地址路径,则此控制策略返回true,否则返回false
" h  S& y1 G& {1 a
: G1 I) Q0 I  `  _$ Racl timetask_req url_dir -i timetask
9 L9 V( n5 p$ K  `) d) V6 M* S, v8 K
#当请求的header中Content-length等于0时返回 true3 U, a4 ?- t9 T7 L8 j% L  P
- B$ H) D$ t" Q. n8 l
acl missing_cl hdr_cnt(Content-length) eq 0
" d6 i& m' o$ }' u7 }0 a& f5 A5 c5 D2 n: d4 }" G$ G
######################acl策略匹配相应###################- c" |2 l3 V0 a4 m5 o2 e4 ]
8 ]5 M+ ]( m8 H
##当请求中header中Content-length等于0 阻止请求返回403
# r8 ^- Q+ R* I7 J8 l7 p/ p, }5 h3 h# d. o
block if missing_cl
5 S6 b: q6 c4 _  L( c: X- ]$ W, F" l" ]. U( I$ c8 c1 g4 a& _
##block表示阻止请求,返回403错误,当前表示如果不满足策略invalid_req,或者满足策略timetask_req,则阻止请求。 % ^9 y# x6 j; N9 s3 p/ v5 ~; [
# l% i7 o- @2 h) g* F" |+ r
block if !invalid_req || timetask_req
# F$ |8 w: j" d1 K# M
9 C/ u* W1 A5 x: d8 X0 t# H, j#当满足denali_policy的策略时使用denali_server的backend3 Z0 |' X: i3 U* L
+ G/ @- N/ ]1 K5 Q- W. [  w
use_backend denali_server if denali_policy
7 ?' p6 ]6 f0 Z% L+ Q5 ~) C4 }9 P/ \
( _) d5 s2 m7 Z. J  G6 P- g#当满足tm_policy的策略时使用tm_server的backend
  ?& O; f# E1 Z7 p7 w9 g# b7 D5 \) r1 y  w% x' E+ l" ?
use_backend tm_server if tm_policy
+ u- d" W# D, v6 m
' E' j& [! Z  Z# O#reqisetbe关键字定义,根据定义的关键字选择backend
% q/ c. E; b! O; g" B: l! Q) ]6 Q6 P% J: u( I6 K0 W) y. _3 A
reqisetbe ^Host:\ img dynamic0 ?6 A9 N: W; X7 p% u) f
5 B9 @& O" A2 B! m
reqisetbe ^[^\ ]*\ /(img|css)/ dynamic$ m6 _) d* k9 [1 G7 @

; a$ J$ L% f8 [! Rreqisetbe ^[^\ ]*\ /admin/stats stats
6 S' A5 x6 N; I& |7 J. N3 k. J1 a1 Y# ?
#以上都不满足的时候使用默认mms_server的backend( r% d8 ^) Y" d. `
8 f1 O/ m. n; m  d* U
default_backend mms_server
* u' O; _( h7 K4 g
2 E, a8 f# l- @5 C#HAProxy错误页面设置
- I1 l, \" Y! w/ e# o  [" K: w. c; @. |0 ]8 T0 s5 |! g/ T$ g
errorfile 400 /home/admin/haproxy/errorfiles/400.http
' g. s2 A; v* I% ~: o( c
1 e& A4 H' j9 Uerrorfile 403 /home/admin/haproxy/errorfiles/403.http" b% _- S+ ?& j  ]8 }' G0 P7 B2 R9 D

$ i1 J/ z8 w- q1 l$ zerrorfile 408 /home/admin/haproxy/errorfiles/408.http
& Q- S7 l8 r) {
  h% M; ]5 a- `7 yerrorfile 500 /home/admin/haproxy/errorfiles/500.http
; J1 Y( N5 e/ u4 @8 p: d
% R; G; u7 _( v1 D$ o# ]  V' R1 C! Werrorfile 502 /home/admin/haproxy/errorfiles/502.http/ m% ~, V6 m; M6 c* A( l
0 d) A; c6 z% p4 ^; f$ g
errorfile 503 /home/admin/haproxy/errorfiles/503.http1 ^" V. m0 K5 {' `
+ L5 S# |( l" S% Z
errorfile 504 /home/admin/haproxy/errorfiles/504.http
( s' n" q/ u! E
3 K: o9 f4 n& `" S" O##########backend的设置##############
4 X6 s* n( `- Y3 W( ~* V8 j
# t  o  [. Z- W6 H8 tbackend mms_server
( k6 y! P) y0 k  b* q, K
" k+ c# S5 W5 Z$ }9 i- F#http的7层模式. ]7 A+ y; _8 N' `' @% Q* Z6 }$ N& j

( K6 G& K3 O4 J+ ^mode http
/ L' F' l7 }( s
5 v* N0 E/ R7 I3 g! \" k0 m#负载均衡的方式,roundrobin平均方式
* L$ @" O& c% _  o, m2 W. `2 ~9 p
balance roundrobin# V4 X3 X$ }( F- {3 y" k" ]) [
4 }5 B- B' T. v- N7 U  A
#允许插入serverid到cookie中,serverid后面可以定义
, B( u( s( `5 ^3 y( \8 x1 M  }; Q
" t* U  ^$ e3 ?& _1 t: q- Q9 vcookie SERVERID3 G- q8 W1 s1 R5 L5 x1 K

: F1 k9 c" Y( n2 G/ a$ W# |#心跳检测的URL,HTTP/1.1¥r¥nHost:XXXX,指定了心跳检测HTTP的版本,XXX为检测时请求  ?7 n2 i+ U7 u1 u6 F
4 ^2 o& [  y7 X) k
#服务器的request中的域名是什么,这个在应用的检测URL对应的功能有对域名依赖的话需要设置: d" `6 i' d# u/ w* |7 \& m- E
' Q/ t/ O! _: n1 o# E' ~
option httpchk GET /member/login.jhtml HTTP/1.1\r\nHost:member1.gemini.taobao.net
" {1 {7 A2 {8 h7 J
$ d4 g& E' r9 U#服务器定义,cookie 1表示serverid为1,check inter 1500 是检测心跳频率
8 m. Z1 c9 o3 _6 j+ ?
1 f. Z/ I! G4 s1 _#rise 3是3次正确认为服务器可用,fall 3是3次失败认为服务器不可用,weight代表权重
- w: H( t9 f& p3 c4 Q9 i0 n( i
3 Y' R7 }+ Z5 b% A6 I/ a/ c0 cserver mms1 10.1.5.134:80 cookie 1 check inter 1500 rise 3 fall 3 weight 1
" m1 Y9 `8 y1 z% D* u4 E; |
; v% _9 x+ m, _1 V* R; hserver mms2 10.1.6.118:80 cookie 2 check inter 1500 rise 3 fall 3 weight 2* }6 Y. l1 C# N0 g8 i7 X3 Y: T3 ^

/ V; F2 U" M$ D0 ebackend denali_server
0 h# ~$ m7 \( B- H4 ~6 P8 s9 z* K; J0 l8 c1 A: S5 B
mode http: b8 |: J+ S6 E/ h; T" X, m
% I3 a7 A  C3 J2 ]( t+ h
#负载均衡的方式,source根据客户端IP进行哈希的方式
' T1 \, z4 S- ~5 {: j. w0 ]; d6 Y: G. R/ W
balance source
: G# T% B& Z2 ]+ M) h  Q6 ]5 w! A; o
+ U7 ~8 e# N, q) s#但设置了backup的时候,默认第一个backup会优先,设置option allbackups后
* h& K* |. j6 \  ~/ m6 ]6 `; |3 J; n* k0 ?
#所有备份服务器权重一样
5 G  \. b. Z! d1 p. f4 m- X$ F" b! _$ }: I2 `9 G3 I6 F) p
option allbackups7 ]& F/ Y6 s5 h3 H% R% `+ Q  |$ n' \
' B3 T3 b" m8 B, `
#心跳检测URL设置
; C* V+ p% L! w1 G/ R
3 E1 F* F" c4 f, Roption httpchk GET /mytaobao/home/my_taobao.jhtml HTTP/1.1\r\nHost:my.gemini.taobao.net  E; |4 t/ c5 K! l8 T
- e; V7 t0 I9 \- d% ^! j
#可以根据机器的性能不同,不使用默认的连接数配置而使用自己的特殊的连接数配置" z2 f6 R; R4 \! p4 h

: D" v. {/ y5 B) q% O#如minconn 10 maxconn 207 d" }9 W# ?7 W/ ~$ c$ z

( C9 h$ c' ^7 I) jserver denlai1 10.1.5.114:80 minconn 4 maxconn 12 check inter 1500 rise 3 fall 32 i0 P8 j/ E" \& ~) i9 P
$ c& a6 L  N$ Q. f, X' z& V
server denlai2 10.1.6.104:80 minconn 10 maxconn 20 check inter 1500 rise 3 fall 3
6 a* o# H9 G! Q( Q
' _+ K! J+ E* z( Q' x2 l#备份机器配置,正常情况下备机不会使用,当主机的全部服务器都down的时候备备机会启用
6 D% e5 A, x* I4 h5 Z6 O" R7 J" v5 G0 X1 ~; h9 w
server dnali-back1 10.1.7.114:80 check backup inter 1500 rise 3 fall 3
- k9 w- I/ s$ R/ e' {1 E. a) f4 |" E3 f: q
server dnali-back2 10.1.7.114:80 check backup inter 1500 rise 3 fall 36 Q3 w& b' m# Q1 d6 l
4 I& ]6 \* J, }9 D$ Z0 ~4 y# O
backend tm_server
7 Z, ]: n9 U! |; c; F- Z2 b8 F, \/ v
mode http5 \1 g9 y: F# B2 C5 V$ y0 U8 c7 t

6 p/ e# }( V/ r% ?#负载均衡的方式,leastconn根据服务器当前的请求数,取当前请求数最少的服务器
5 x; u% x$ g* s6 G) Q3 S0 J5 j
. Z9 F6 S9 A0 `7 Y" ~1 ?balance leastconn' B* Z6 g. Y# ]

  O- t; j7 p, g& noption httpchk GET /trade/itemlist/prepayCard.htm HTTP/1.1\r\nHost:trade.gemini.taobao.ne
6 ?6 c( T' Q. {' Y1 y& Y. o( W; P- ~( t( a" d3 T2 E
server tm1 10.1.5.115:80 check inter 1500 rise 3 fall 3+ p. [2 h# C& j4 Y. _
# G# T% @7 P4 r
server tm2 10.1.6.105:80 check inter 1500 rise 3 fall 30 h# T( q& B) S% \
) x2 u5 ^9 A; [0 k4 r
######reqisetbe自定义关键字匹配backend部分#######################
5 j/ H$ F% I, R! F0 j- j; t8 @6 B5 Q# P5 ]* F0 Y( k) z1 U
backend dynamic# {% W( f4 @7 f3 {7 Q
+ t) d5 N' ~  t2 v. r, [; y2 ]
mode http9 n) o8 G$ t3 N
' @- {% `2 f( [' J
balance source
2 B2 i9 I. j8 d: e6 ~, h1 f5 ~! l0 M+ Y; G3 u0 }
option httpchk GET /welcome.html HTTP/1.1\r\nHost:www.taobao.net+ ~4 o# j4 T4 I" i% u' R" Y! w

! |8 b* p, y) s4 s% Bserver denlai1 10.3.5.114:80 check inter 1500 rise 3 fall 36 K) g7 D3 d, j* F! b" p0 ^& E" A
0 G; j) P5 a/ s* W" e& n
server denlai2 10.4.6.104:80 check inter 1500 rise 3 fall 3
& h" N0 z  M8 V- Q1 Y+ e( m) W& m: y( N6 |9 ?( {
backend stats% b" F  F. M7 R. K# J3 V0 h8 I
3 C4 K3 |% Z' P, w6 W
mode http4 Y- K( e/ i* r; J5 \

8 \+ o' N7 E% l  S0 cbalance source# @" L5 e, Q0 a5 ?) U% H

6 i& A  s8 p2 b' q! ~; R- Soption httpchk GET /welcome.html HTTP/1.1\r\n Host:www.163.com
' u2 w7 s* o2 ^9 A  o4 `2 q" O" p
8 B& ]% P' o( O9 j# jserver denlai1 10.5.5.114:80 check inter 1500 rise 3 fall 38 F. q- @  O6 s) q$ R

7 o% B: w& z0 `7 i& sserver denlai2 10.6.6.104:80 check inter 1500 rise 3 fall 3
您需要登录后才可以回帖 登录 | 注册

本版积分规则

返回首页|Archiver|手机版|小黑屋|易陆发现技术论坛 ( 蜀ICP备2026014127号-1 )

GMT+8, 2026-6-12 04:30 , Processed in 0.018066 second(s), 22 queries .

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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