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

haproxy配置文件详解

[复制链接]

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
发表于 2016-8-18 09:45:39 | 显示全部楼层 |阅读模式

haproxy配置文件详解

    写在前面的话,本文档部分信息来自网络,同时参考过官方的架构指南,在此非常感谢zero提供的文档,以及在学习haproxy过程中的帮助。

  • #/usr/local/sbin/haproxy -f /etc/haproxy/haproxy.cfg -st `cat /var/run/haproxy.pid`
  •        ####################全局配置信息########################
  •        #######参数是进程级的,通常和操作系统(OS)相关#########
  • global
  •        maxconn 20480                   #默认最大连接数
  •        log 127.0.0.1 local3            #[err warning info debug]
  •        chroot /var/haproxy             #chroot运行的路径
  •        uid 99                          #所属运行的用户uid
  •        gid 99                          #所属运行的用户组
  •        daemon                          #以后台形式运行haproxy
  •        nbproc 1                        #进程数量(可以设置多个进程提高性能)
  •        pidfile /var/run/haproxy.pid    #haproxy的pid存放路径,启动进程的用户必须有权限访问此文件
  •        ulimit-n 65535                  #ulimit的数量限制
  •        #####################默认的全局设置######################
  •        ##这些参数可以被利用配置到frontend,backend,listen组件##
  • defaults
  •        log global
  •        mode http                       #所处理的类别 (#7层 http;4层tcp  )
  •        maxconn 20480                   #最大连接数
  •        option httplog                  #日志类别http日志格式
  •        option httpclose                #每次请求完毕后主动关闭http通道
  •        option dontlognull              #不记录健康检查的日志信息
  •        option forwardfor               #如果后端服务器需要获得客户端真实ip需要配置的参数,可以从Http Header中获得客户端ip  
  •        option redispatch               #serverId对应的服务器挂掉后,强制定向到其他健康的服务器  
  •        option abortonclose             #当服务器负载很高的时候,自动结束掉当前队列处理比较久的连接
  •        stats refresh 30                #统计页面刷新间隔
  •        retries 3                       #3次连接失败就认为服务不可用,也可以通过后面设置
  •        balance roundrobin              #默认的负载均衡的方式,轮询方式
  •       #balance source                  #默认的负载均衡的方式,类似nginx的ip_hash
  •       #balance leastconn               #默认的负载均衡的方式,最小连接
  •        contimeout 5000                 #连接超时
  •        clitimeout 50000                #客户端超时
  •        srvtimeout 50000                #服务器超时
  •        timeout check 2000              #心跳检测超时
  •        ####################监控页面的设置#######################
  • listen admin_status                    #Frontend和Backend的组合体,监控组的名称,按需自定义名称
  •         bind 0.0.0.0:65532             #监听端口
  •         mode http                      #http的7层模式
  •         log 127.0.0.1 local3 err       #错误日志记录
  •         stats refresh 5s               #每隔5秒自动刷新监控页面
  •         stats uri /admin?stats         #监控页面的url
  •         stats realm itnihao\ itnihao   #监控页面的提示信息
  •         stats auth admin:admin         #监控页面的用户和密码admin,可以设置多个用户名
  •         stats auth admin1:admin1       #监控页面的用户和密码admin1
  •         stats hide-version             #隐藏统计页面上的HAproxy版本信息  
  •         stats admin if TRUE            #手工启用/禁用,后端服务器(haproxy-1.4.9以后版本)
  •        errorfile 403 /etc/haproxy/errorfiles/403.http
  •        errorfile 500 /etc/haproxy/errorfiles/500.http
  •        errorfile 502 /etc/haproxy/errorfiles/502.http
  •        errorfile 503 /etc/haproxy/errorfiles/503.http
  •        errorfile 504 /etc/haproxy/errorfiles/504.http
  •        #################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
  •      
  •        #######################网站监测listen配置#####################
  •        ###########此用法主要是监控haproxy后端服务器的监控状态############
  • listen site_status
  •        bind 0.0.0.0:1081                    #监听端口
  •        mode http                            #http的7层模式
  •        log 127.0.0.1 local3 err             #[err warning info debug]
  •        monitor-uri /site_status             #网站健康检测URL,用来检测HAProxy管理的网站是否可以用,正常返回200,不正常返回503
  •        acl site_dead nbsrv(server_web) lt 2 #定义网站down时的策略当挂在负载均衡上的指定backend的中有效机器数小于1台时返回true
  •        acl site_dead nbsrv(server_blog) lt 2
  •        acl site_dead nbsrv(server_bbs)  lt 2  
  •        monitor fail if site_dead            #当满足策略的时候返回503,网上文档说的是500,实际测试为503
  •        monitor-net 192.168.16.2/32          #来自192.168.16.2的日志信息不会被记录和转发
  •        monitor-net 192.168.16.3/32
  •        ########frontend配置############
  •        #####注意,frontend配置里面可以定义多个acl进行匹配操作########
  • frontend http_80_in
  •        bind 0.0.0.0:80      #监听端口,即haproxy提供web服务的端口,和lvs的vip端口类似
  •        mode http            #http的7层模式
  •        log global           #应用全局的日志配置
  •        option httplog       #启用http的log
  •        option httpclose     #每次请求完毕后主动关闭http通道,HA-Proxy不支持keep-alive模式
  •        option forwardfor    #如果后端服务器需要获得客户端的真实IP需要配置次参数,将可以从Http Header中获得客户端IP
  •        ########acl策略配置#############
  •        acl itnihao_web hdr_reg(host) -i ^(www.itnihao.cn|ww1.itnihao.cn)$   
  •        #如果请求的域名满足正则表达式中的2个域名返回true -i是忽略大小写
  •        acl itnihao_blog hdr_dom(host) -i blog.itnihao.cn
  •        #如果请求的域名满足www.itnihao.cn返回true -i是忽略大小写
  •        #acl itnihao    hdr(host) -i itnihao.cn
  •        #如果请求的域名满足itnihao.cn返回true -i是忽略大小写
  •        #acl file_req url_sub -i  killall=
  •        #在请求url中包含killall=,则此控制策略返回true,否则为false
  •        #acl dir_req url_dir -i allow
  •        #在请求url中存在allow作为部分地址路径,则此控制策略返回true,否则返回false
  •        #acl missing_cl hdr_cnt(Content-length) eq 0
  •        #当请求的header中Content-length等于0时返回true
  •        ########acl策略匹配相应#############
  •        #block if missing_cl
  •        #当请求中header中Content-length等于0阻止请求返回403
  •        #block if !file_req || dir_req
  •        #block表示阻止请求,返回403错误,当前表示如果不满足策略file_req,或者满足策略dir_req,则阻止请求
  •        use_backend  server_web  if itnihao_web
  •        #当满足itnihao_web的策略时使用server_web的backend
  •        use_backend  server_blog if itnihao_blog
  •        #当满足itnihao_blog的策略时使用server_blog的backend
  •        #redirect prefix http://blog.itniaho.cn code 301 if itnihao
  •        #当访问itnihao.cn的时候,用http的301挑转到http://192.168.16.3
  •        default_backend server_bbs
  •        #以上都不满足的时候使用默认server_bbs的backend
  •        ##########backend的设置##############
  •        #下面我将设置三组服务器 server_web,server_blog,server_bbs
  • ###########################backend server_web#############################
  • backend server_web
  •        mode http            #http的7层模式
  •        balance roundrobin   #负载均衡的方式,roundrobin平均方式
  •        cookie SERVERID      #允许插入serverid到cookie中,serverid后面可以定义
  •        option httpchk GET /index.html #心跳检测的文件
  •        server web1 192.168.16.2:80 cookie web1 check inter 1500 rise 3 fall 3 weight 1  
  •        #服务器定义,cookie 1表示serverid为web1,check inter 1500是检测心跳频率rise 3是3次正确认为服务器可用,
  •        #fall 3是3次失败认为服务器不可用,weight代表权重
  •        server web2 192.168.16.3:80 cookie web2 check inter 1500 rise 3 fall 3 weight 2
  •        #服务器定义,cookie 1表示serverid为web2,check inter 1500是检测心跳频率rise 3是3次正确认为服务器可用,
  •        #fall 3是3次失败认为服务器不可用,weight代表权重
  • ###################################backend server_blog###############################################
  • backend server_blog
  •        mode http            #http的7层模式
  •        balance roundrobin   #负载均衡的方式,roundrobin平均方式
  •        cookie SERVERID      #允许插入serverid到cookie中,serverid后面可以定义
  •        option httpchk GET /index.html #心跳检测的文件
  •        server blog1 192.168.16.2:80 cookie blog1 check inter 1500 rise 3 fall 3 weight 1  
  •        #服务器定义,cookie 1表示serverid为web1,check inter 1500是检测心跳频率rise 3是3次正确认为服务器可用,fall 3是3次失败认为服务器不可用,weight代表权重
  •        server blog2 192.168.16.3:80 cookie blog2 check inter 1500 rise 3 fall 3 weight 2
  •         #服务器定义,cookie 1表示serverid为web2,check inter 1500是检测心跳频率rise 3是3次正确认为服务器可用,fall 3是3次失败认为服务器不可用,weight代表权重
  • ###################################backend server_bbs###############################################
  • backend server_bbs
  •        mode http            #http的7层模式
  •        balance roundrobin   #负载均衡的方式,roundrobin平均方式
  •        cookie SERVERID      #允许插入serverid到cookie中,serverid后面可以定义
  •        option httpchk GET /index.html #心跳检测的文件
  •        server bbs1 192.168.16.2:80 cookie bbs1 check inter 1500 rise 3 fall 3 weight 1  
  •        #服务器定义,cookie 1表示serverid为web1,check inter 1500是检测心跳频率rise 3是3次正确认为服务器可用,fall 3是3次失败认为服务器不可用,weight代表权重
  •        server bbs2 192.168.16.3:80 cookie bbs2 check inter 1500 rise 3 fall 3 weight 2
  •         #服务器定义,cookie 1表示serverid为web2,check inter 1500是检测心跳频率rise 3是3次正确认为服务器可用,fall 3是3次失败认为服务器不可用,weight代表权重 4 E( {" R/ D  I

以上为基本的配置文件,下面会对这个配置一一说明和应用


5 {/ {9 |- B) {

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2021-7-12 13:55:47 | 显示全部楼层
常用配置选项:
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不记录上级负载均衡发送过来的用于检测状态没有数据的心跳包。
$ F, z4 a# F) @
BALANCE 选项:
balance source :如果想让HAProxy按照客户端的IP地址进行负载均衡策略,即同一IP地址的所有请求都发送到同一服务
                             器时,需要配置此选项。
balance roundrobin :HAProxy把请求轮流的转发到每一个服务器上,依据每台服务器的权重,此权重会动态调整。最常
                                   见的默认配置。

0 c) h& j& B. h4 Q% B+ ~/ j
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 :
# H, _. C) U; C1 C* W) `
option httpclose
7 L# ^2 [& b! ^9 {6 v5 A0 Z, v6 pno option httpclose
" g% N/ ~5 k% M( u4 y. A  Enable or disable passive HTTP connection closing   启用或禁止消极的HTTP连接关闭6 \/ v; |9 Z' k, k
  May be used in sections :   defaults | frontend | listen | backend8 s+ n5 |' d: H8 O1 e
                                 yes   |    yes   |   yes  |   yes% a; ^) m( V1 r% {3 ?& j$ P/ B3 I8 L( L
  Arguments : none7 O5 H. |9 O1 j) o- ?! U/ p1 q
  ( O  t# O9 V( Z2 v2 F
  默认的,客户端与服务端的通讯,HAProxy只做分析、日志和分析每个连接的第一个request。如果设置了 "option
; q5 x3 U" k, \4 I  httpclose" , 则会检查双向的http头是否有"Connection: close",如果没有则自动添加,使每个客户端或服务端在每次传输后,都会主动关闭TCP连接,使HTTP传输处于HTTP close模式下。任何 "Connection" 头如果不是"close",都会被移除。
. g( Q9 \9 g3 Y9 O
3 n8 r' n- q) j6 O# N3 O: `9 V  很少会有服务器不正确的忽略掉头,即使收到"Connection: close"也不关闭连接,否则就是不兼容HTTP 1.0浏览器标准。 如果发生这种情况,可以使用"option forceclose",在服务端响应后主动关闭请求连接。选项 "forceclose"还可以及早释放服务连接,而不必等到客户端的应答确认。
9 I6 T9 S5 C. v5 X: ?
- o7 p+ N9 ~1 B- A/ L! t; O  这个选项可以设置在frontend或backend上,只要其上可以建立连接。如果同时设置了"option forceclose",那么它比"httpclose"优先。如果同时设置了 "option http-server-close",则会实现"option forceclose"的效果。
option forceclose, r1 X# F. c$ u: j) o1 u, e
no option forceclose
  Enable or disable active connection closing after response is transferred.     启用或禁止response后的主动关闭连接
  May be used in sections :   defaults | frontend | listen | backend/ Y3 T* _0 o/ u; w# |
                                 yes   |    yes   |   yes  |   yes/ z% @/ A, E: w
  Arguments : none
9 I% Q3 }5 g0 N9 \- u0 ^. F  B7 ^        有的HTTP服务器收到"option httpclose"设置的"Connection: close",也不会关闭连接,如果客户端也不关闭,连接会 一直打开,直到超时。这会造成服务器上同一时段内的大量连接,日志中也会显示较高的全局会话时间。
        此时,可以使用 "option forceclose",当完成响应时,立即关闭对外的服务通道。该选项隐式打开httpclose选项。需要注意,该选项允许解析完整的request 和 response,所以可以很快关闭至服务器的连接,比httpclose更早释放一些资源。8 R2 o$ H+ f; ]: j( d( P8 A# p
        如果同时启用了"option http-pretend-keepalive",虽然会禁止发送 "Connection: close"头,但是依然会在整个response被接收后,关闭连接。
/ a/ m. \+ Y& f0 ?4 S" H
1 O% p% x. y7 eoption http-server-close
; Z$ A+ f: K. M! G( ^* E2 vno option http-server-close
4 E5 V# O2 J2 s+ ^+ y& J5 [" z  Enable or disable HTTP connection closing on the server side  启用或禁止关闭服务端的HTTP连接) W8 }1 ~1 J) B/ A0 X
  May be used in sections :   defaults | frontend | listen | backend) ^1 Q- Q3 a$ k- S* E; d, U
                                 yes   |    yes   |   yes  |   yes+ K7 D2 ?- b9 z3 p4 a# Y% X* }
  Arguments : none
/ y% T7 U. B& F/ }- t$ T    默认的,客户端与服务端通讯,haproxy 只是分析、记日志,并处理每个连接的第一个请求。该选项设置server端为HTTP 连接关闭模式,并支持客户端为HTTP keep-alive的pipelining模式。提供了最低的客户端延迟和最快的服务端会话重用,以节省服务资源,类似"option forceclose"。还允许无keepalive能力的服务端在keep-alive模式下为客户端提供服务,但是需要符合 RFC2616。需要注意的是,有些服务器遇到"Connection: close" 时并不总是执行关闭,那么keep-alive 则无法使用,解决方法是启用 "option http-pretend-keepalive".4 Y$ r+ c& G6 I0 I3 x6 S0 {

9 ]8 O& `* Q  N6 }( r     目前,日志无法指明请求是否来自同一会话;日志中的接收日期为前一个请求的结束;请求时间为新请求的等待时间;keep-alive request time 存活请求时间为超时时间,绑定 "timeout http-keep-alive" 或 "timeout http-request"的设置。0 g. r3 G& ?. U* u% |4 N$ d" h
     这个操作可以设置在frontend或backend上,只要其上可以建立连接。需要注意的是,这个选项可以与 "option httpclose"结合, 但 "option httpclose"优先级更高,结合后基本实现了forceclose的效果。% D& s( Y5 k3 b+ L1 M+ ~
/ G& F" n6 k+ ?5 h4 E
option http-pretend-keepalive (http-假装-长连接)6 r4 [0 g. z5 n. _6 t1 @+ @
no option http-pretend-keepalive  c+ {3 q. e% o- s: C  [5 K. q
  Define whether haproxy will announce keepalive to the server or not  定义 haproxy 与服务器是否是 keepalive 的。
+ |0 e3 X& H4 L& t3 n/ r7 D  May be used in sections :   defaults | frontend | listen | backend9 Z( m. e! A4 _( ~3 J
                                 yes   |    yes   |   yes  |   yes+ F! k1 @& k+ Q0 p# G
  Arguments : none
& s1 m& t; M' y$ G/ j# s1 h    当声明了 "option http-server-close" 或 "option forceclose", haproxy会在给server的request头中添加 "Connection: close" 。然而有些服务器看到这个头,会返回未知长度的response,并自动避免chunked encoding,其实这是不对的。它会阻止haproxy保持客户端长连接,还会使客户端或缓存接收了未完成的响应,却认为响应结束了。
; A2 {5 v0 b" g' Q7 j# I    设置 "option http-pretend-keepalive", haproxy会在服务器端保持长连接,服务端则不会出现前面的问题。当 haproxy 获取了完整的response, 才会以类似forceclose的方式关闭服务端。这样客户端得到一个普通的响应,连接也在服务端被正常关闭。' f0 m/ x) o$ Q! e$ e, O9 Z
    建议不将其设为默认值,因为大部分服务器会在发送完最后一个包之后更高效的关闭连接,并释放缓存,而且网络上的数据包也会略微降低整体的峰值性能。但是启用该选项,haproxy会略微少做一些工作。所以如果haproxy在整个架构中是个瓶颈,可以启用该操作,以节省CPU。' T- A9 K- z; J: \( ]- C3 n8 |

% n) `- l/ C7 i3 B( @+ T# Q     这个选项可以设置在frontend或backend上,只要其上可以建立连接。这个选项可以与 "option httpclose"结合, 使服务端keepalive,客户端close,但并不建议这样做。
- w  X9 Z0 C, n2 h  W
balance <algorithm> [ <arguments> ]
0 j7 u9 q! q+ Zbalance url_param <param> [check_post [<max_wait>]]
: l, [, c; g2 @* G  u  定义选择后端服务的负载均衡算法
5 Z( W% G7 J6 T3 X  May be used in sections :   defaults | frontend | listen | backend5 W' |) n) g4 m: ?: D0 ^/ l
                                               yes   |    no    |   yes  |   yes2 Y  G( q7 m2 J9 I$ |% {
  Arguments :
; X) h, L& G! d( A. B    <algorithm> 是负载均衡时选择服务器的算法,没有持续信息时可用,或连接重定向到另一个服务器。<algorithm> 可以是以下几种:  }% a' h" }* P4 A) B
      roundrobin  每个服务器根据权重轮流使用,如果服务器的处理时间平均分布,这是最流畅和公平的算法。算法是动态的,对于实例启动慢的服务器的权重会在运行中调整。每个backend的活动服务器在设计上限制为4128个。在一些大的群里面, 当服务器很短的宕机后恢复回来,有时会有几百个请求被重新整合到群当中,并开始接收处理。尽管很少发生,但是很正常。这也说明了有机会监视它们,所以不必担心。
) G4 W! P5 y; A/ `! a' O, q. j7 `' V1 P, M
      static-rr  每个服务器根据权重轮流使用,类似roundrobin,但它是静态的,意味着运行时修改权重是无效的。另一方面,它对服务器的数量没有设计上的限制,服务器启动后便会立即进到群中,整个分发方案会重新计算。这会略微降低CPU的运行(约1%)。
# B; p& A0 c3 P; f  O& H7 N5 @9 u- }- h, f" |& r- \. j
      leastconn  连接数最低的服务器优先接收连接。Round-robin用于负载相同的服务器,使每台服务器都被使用。leastconn建议用于长会话服务,例如LDAP, SQL, TSE等,而不是很适合短会话协议,如HTTP。算法是动态的,对于实例启动慢的服务器的权重会在运行中调整。' ]4 u4 e& N5 u/ B+ `. H' c

! B: W0 f- s- ]+ o% \5 z      source    对源IP地址进行哈希,用可用服务器的权重总数除以哈希值,根据结果进行分配。只要服务器正常,同一个客户端IP地址总是访问同一台服务器。如果哈希的结果随可用服务器数量而变化,那么有的客户端会定向到不同的服务器。该算法一般用于不能插入cookie的TCP模式。它还可以用于广域网上,为拒绝使用会话cookie的客户端提供最有效的粘连。该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是算法会根据"hash-type"的变化做调整。
5 s; a. @" y) d/ ]* D+ X  Y  Q  K2 L' i$ Z9 G
      uri        对URI左端(问号之前)进行哈希,用可用服务器的权重总数除以哈希值,根据结果进行分配。只要服务器正常,同一个URI地址总是访问同一台服务器。一般用于代理缓存和反病毒代理,以最大限度的提高缓存的命中率。该算法只能用于HTTP后端。该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是算法会根据"hash-type"的变化做调整。. h7 p0 H; M5 `& }- s. N; e8 b
                  算法支持两个可选参数"len" 和 "depth", 都是后跟正整数。“len”参数指定算法只处理URI从头开始的字符数,据此计算哈希。因为大多URI以"/"开头,所以"len"最好不要设为1。"depth" 参数指定URI中最大的路径深度,据此计算哈希。请求中的每个斜线为一级。如果同时声明了这两个参数,则截取URI时必须同时满足。
7 n! k& \  [- y4 v7 p( V: t( z/ d: }
      url_param  在HTTP GET请求的查询串中查找<param>中指定的URL参数。+ }, s/ z* t- Y( s' z
                 若使用了修饰符"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被用了,则只能检查第一个块。如果参数值被块边界分隔开,则只能随机均衡负载了。$ y  [, @" A2 W% R  S& F
                  如果参数后面跟着 ('=') 和一个值,则可以根据这个值进行哈希,用可用服务器的权重总数除以哈希值,根据结果进行分配。
$ i; @& w2 g. q: v6 G                  还可用于跟踪请求中的用户身份,只要服务器正常,同一个用户ID的请求总是发给同一台服务器。如果没有参数或参数没有值,则使用轮询算法。该算法只用于HTTP后端。该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是算法会根据"hash-type"的变化做调整。
$ p! x- q1 \: s5 ^+ Y$ N
5 q9 d; H0 e& v' ^/ ~3 m      hdr(name)  在每个HTTP请求中查找HTTP头<name>。与ACL函数'hdr()'一样。括号括起来的头名字不区分大小写。如果缺少头或头没有任何值,则使用roundrobin算法代替。                  
5 q' `( I. K0 n  H0 X. ]1 Z3 N8 c. \                       启用参数'use_domain_only',哈希算法将只用于一些类似'Host'的特定头的主域部分。例如主机值"haproxy.1wt.eu",则只考虑 "1wt"。该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是算法会根据"hash-type"的变化做调整。/ p& R# B, X0 u2 H! y. m5 \- t

" E" i# _, O0 t      rdp-cookie$ x3 ?: Q# z+ M& h
      rdp-cookie(name)
, S. u# [; r) b. o5 o1 S                  为每个进来的TCP请求查询并哈希RDP cookie <name> (或“mstshash”如果省略) 。与ACL函数 'req_rdp_cookie()'一样,name不区分大小写。该机制用于退化的持久模式,可以使同一个用户(或同一个会话ID)总是发送给同一台服务器。如果没有cookie, 则使用roundrobin算法代替。( ?% c. I7 ]9 Q' T0 C8 a7 ?
                  必须注意该声明要生效,前端必须确保在请求缓冲中已经有RDP cookie,所以必须使用规则tcp-request content accept' 和ACL 'req_rdp_cookie_cnt'相结合。
3 l# R/ ?6 i% ]5 R: i- p8 G1 M                  该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是算法会根据"hash-type"的变化做调整。
) t& N8 S$ W- q: r- w0 J( C- ]/ f9 x) v8 m+ b6 g5 O
    <arguments> 是用于一些算法的可选参数列表,目前只有"url_param" 和 "uri" 用到,例如:8 z  y8 G- Y& I  D/ k8 _0 Y
                balance uri [len <len>] [depth <depth>]( @1 d9 E- {' o* ], e4 h7 m
                balance url_param <param> [check_post [<max_wait>]]" |' P5 K  i+ g7 S; q

7 p; u0 Y! \9 n7 I+ A5 r- H  如果没有其他算法、模式或选项的设置,后端的负载均衡算法默认为roundrobin。每个后端只能设置一种。
$ Y) N5 c/ Y; B4 F" I  Examples :" {# R' e* x4 {3 f/ ~
        balance roundrobin
; S  I. G2 q, _7 k        balance url_param userid
7 m) K  z( t" p8 W$ i. ^        balance url_param session_id check_post 64# a, i: ?! K  v/ E& W5 G
        balance hdr(User-Agent)
$ j! O! D% {  q: V) m( I8 @        balance hdr(host)/ T3 @, b7 k0 s  q# G6 ?6 E6 I
        balance hdr(Host) use_domain_only8 t* N# u5 W, y; a4 b5 N8 L

+ l9 B- u% O# d) F0 n' x  注意:  以下的警告和限制是使用“check_post“扩展和”url_param”所必须考虑 :
+ \4 v3 }5 h, V' l8 @    - 所有POST请求都要考虑,因为在包含二进制数据的体或实体中,没有办法决定是否会找到参数。因此需要另一种方法,限制POST请求的体中不含有URL参数 (见 acl reqideny http_end)
    - 大于请求缓冲大小的 <max_wait> 值是没用的。在build时设置缓冲大小,默认16KB。
# y# a7 L) I% G8 s8 f4 ]1 R    - 不支持Content-Encoding, 参数搜索会失败;负载均衡会改用 Round Robin。
, z; |6 K, S' k, r    - 预计: 不支持100-continue,负载均衡会改用 Round Robin。  `% S% R$ m& |2 B) T
    - Transfer-Encoding (RFC2616 3.6.1) 只在第一个块中支持。如果在第一个块中的参数值不完整,选择的服务器就没有定义。(实际上取决于在第一个块中定义的有多小)
( K( m' \' Z0 Z/ x' y, C$ T    - 该特性不支持生成100, 411 或 501 响应。
' @' Y. T$ z- T) {' r4 F9 f    -  有的情况下,需要"check_post"只是要查看整个消息体的内容。检查一般会停在任意数量的空格(LWS: linear% Q3 O4 h1 s6 k0 `4 u
      white space)或控制符上,表示这可能是一个URL参数列表。这可能不是一个关于SGML的类型消息体。5 g# n! D: e3 n, ?+ q7 _* v: n
$ q( y8 |$ P7 M  m' {) s. I9 E! }
  See also : "dispatch", "cookie", "appsession", "transparent", "hash-type" and "http_proxy".

2 |' H; j: n' q3 f/ T' a# }
hash-type <method>! q9 q& ?' o4 ]
  将哈希映射到服务器的方法。Specify a method to use for mapping hashes to servers9 ]! R: o. F3 n) `
  May be used in sections :   defaults | frontend | listen | backend5 r2 o$ Z* W4 L
                                               yes   |    no    |   yes  |   yes
* o; R# }  `5 S8 c" k3 Y, t  Arguments :
3 g& ]% \. t. D7 u    map-based  哈希表是包含所有在线服务器的静态数组。哈希结果很平滑,并考虑了权重,但是会忽略服务器启动时的权重变化,也就是说不能慢启动。另外,服务器是根据数组中的位置所选择的,所以服务器数量变化时,大部分映射也会变化。当一台服务器启动或关闭,或服务器加入到群中,大部分连接会再分配给不同的服务器,这对有缓存的实例会比较麻烦。
    consistent  哈希表是由每个服务器构成的树,会在树上查找哈希Key,并选择最近的服务器。这种哈希是动态的,支持服务器启动时修改权重,所以可以慢启动。它有一个好处是当服务器启动或关闭时,只有其本身的关系被移除,当服务器加入群时,只有一小部分的映射会被重新分配,所以是一个比较理想的支持缓存的算法。但是根据其原理,算法不会非常平滑,有时候必须调整服务器的权重或ID来获得更平衡的分布。要保持多次负载均衡时的相同分布,服务器ID是绝对不能变的。(roloand:haproxy根据服务器的ID初始化其哈希值); W+ y, \6 ]& m. R( T! r
   默认值是"map-based",建议大部分情况下使用。
# y; X- C0 l1 J# E, ]1 W8 q3 F/ ?
  e2 \* h& ~1 C2 C  |  See also : "balance", "server"
0 O" Y# {2 K; B8 ?
dispatch <address>:<port>3 _: g( q8 ^0 r
  设置一个默认的服务器地址: j7 h- N8 _  X; i- Q) j3 @5 h: Q
  May be used in sections :   defaults | frontend | listen | backend5 o2 v4 E  p6 N9 U
                                               no    |    no    |   yes  |   yes: w- h- Q/ ?$ M+ Y
  Arguments : none5 |' r) n' h( z2 ^
    <address> 默认服务器的IPv4地址,也可以是主机名称,名称只在启动时解析为IP地址。
* a  M. k4 x) R6 j/ ~; [+ R1 c    <ports>  端口号,所有连接都会发送给这个端口,但是不允许像其他服务器一样使用端口偏移(port offsets)。
   "dispatch"关键字指定了一个默认的服务器,用于无可用服务器时的连接的处理。过去常用于前传非持久连接给后备负载均衡器,由于定义简单,还用于简单的TCP中继(TCP relays)。 建议对于明确的连接处理,应使用"server"直接声明。
====================
一:Global parameters
. c0 w# L  k% G7 x4 O7 D; |* Process management and security: K7 y6 A; u! o3 `4 e* r
- chroot 改变当前工作目录
' X% ?) V) u/ W0 `1 h( y; ?1 {+ f- daemon 运行方式为后台工作  J6 S$ m8 s- K& t/ s
- user - group 工作用户和组" C2 m2 Z) S6 `! |6 v2 f5 h/ s
-log <address> <facility>日志输出设备" r; p9 E" L  ~  W+ X& ]3 m+ c4 n
- nbproc 创建工作的进程数目
% b4 w9 u4 S; u: d-pidfile pid文件位置# g& o5 N5 q/ |, }6 p" t) T3 q
- ulimit-n 设置每个进程的可用的最大文件描述符0 v- o; c- x6 _- D8 H" F" J  ?
- stats 创建监控所用的套接字目录
2 p" _2 _0 ~: J- {8 p0 ?7 W- node 创建另外一个节点名字共用一个IP地址,用来识别哪个节点在处理流量7 [( J3 S  ?* e4 }. F8 _7 Q. p
- description 描述实例的名称9 m  O& f6 j( C; ^4 |5 t
maxconn <number> 每个进程可用的最大连接数* R) i: t" l9 Z0 p
maxpipes <number>  每个进程可用的最大管道数) h+ F! c; L# J+ F, M) k8 G
nokqueue  nopoll  nosepoll nosplice  禁用这些功能7 D2 `4 i* j7 l; p0 _
spread-checks <0..50, in percent>  health check 的时间间隔5 s5 J( f: k( W
tune.bufsize <number> . G  N! N5 R+ O
tune.maxaccept <number> 0 j! H8 l' w" K2 }# L" ?
tune.maxpollevents <number>
4 \) `" U  _" O2 M1 {* I% Ktune.maxrewrite <number>
8 k6 k6 Z* i/ ?; ?( I# H/ A- `tune.rcvbuf.client <number>
9 l+ z1 [3 m0 ?8 E0 y* p4 Ttune.rcvbuf.server <number> 0 @4 s) q8 J# N+ i  Q
tune.sndbuf.client <number> 6 [# \$ ]) |0 @) m
tune.sndbuf.server <number> ' t- \$ R7 b: S1 y1 c3 c- P
以上凭字面理解吧
) o/ C. }- ?) [debug  调试模式,输出启动信息到标准输出# R6 h: J; L- ?5 Q
quiet   安装模式,启动时无输出- E" X- a5 X' X4 b; S  ]6 Z* |
' E: `8 u9 P$ ^* o
二:defaults 块
4 ]7 e) J) E1 @3 V# _作用于其后紧跟的listen块,直至下一个defaults 块,下一个default 将替换上一个块作用于以后的listen
# R8 e+ ]7 n$ @frontend 块,接受请求的端口组+ U. p/ e% V, g1 W1 J$ ^
backend块,后端处理的server 组, w$ S9 X4 E! k7 r! z
listen块,frontend和backend 块的结合7 U4 ^- ~3 z9 `$ }4 {3 n
: G" l' z, U4 z/ D+ B7 v' ^
三:常用配置命令3 j, L) ?) I# P- x
% Z" e9 a5 ~' {
balance <algorithm> [ <arguments> ]
  X6 v$ g6 o# c! gbalance url_param <param> [check_post [<max_wait>]]   负载均衡模块设置
$ n6 J% c. {. I5 [+ W7 p0 z& G, D4 T
Examples :: p3 c( }: W; X6 C. S9 _
balance roundrobin
4 ?; u' x" I  z/ k, }1 [" A2 Kbalance url_param userid  ; K  f2 Q/ I( O4 }
balance url_param session_id check_post 64
' D  v& ]! G  J1 G- Cbalance hdr(User-Agent)
- c6 t, T. A3 u' z: ybalance hdr(host) % S" Y- g/ L8 x1 K2 N9 P
balance hdr(Host) use_domain_only 3 R2 k8 c" B. i, l9 x( `) u

  x/ f4 D+ a. J5 a$ ublock { if | unless } <condition>  在7层阻止访问
' Q  g" s6 c* m* v! c0 X! w, TExample: . Z3 b1 L' C% Z
acl invalid_src src 0.0.0.0/7 224.0.0.0/3  acl定义和squid 很像3 S4 [6 w$ o! Z2 P: w  F' I
acl invalid_src src_port 0:1023 - M4 v; X, y6 h7 n
acl local_dst hdr(host) -i localhost + w( z- x6 }! |) ]& R, d1 b
block if invalid_src || local_dst 3 A) Q8 i$ O# v/ U
- T9 r9 `" ?3 B0 E8 Y. P; ]' }  r
capture cookie <name> len <length>  在请求和回应包中捕捉记录指定长度的cookie,name 为cookie的开头几个字母
' O5 H* o2 d1 o3 N# m9 ?" X* {! O
0 q3 E8 `. k  Y8 c& ]1 a% YExample:
1 B2 v) G; q! _8 Vcapture cookie ASPSESSION len 32 3 U+ D) u! Q& o, i2 {! h6 o0 T" V
0 R, e, [! d1 S( @
capture request header <name> len <length> 1 m! ?+ R$ n0 F3 K
capture response header <name> len <length> 同上: G7 H$ t3 n1 _: V* `# V* O
  F' i. a' c  P
clitimeout <timeout> (deprecated)   q7 W, P7 v- v1 @3 i9 m1 w
contimeout <timeout> (deprecated)  客户端超时时间,不赞成设置
  ~: V# H( s; X0 y
0 z$ V. ]- I0 `  ^# rcookie <name> [ rewrite | insert | prefix ] [ indirect ] [ nocache ] [ postonly ] [ domain <domain> ]*   允许持续的基于cookie 的后端连接
- r9 Q, m$ f# R" Y2 v0 R1 ]) B( |5 e8 P/ K( c, C* w
default_backend <backend> 默认应用的后端
. G/ |0 a* b+ ^& \& V# G8 V# z" X; S  M; i
Example : ; i8 p3 P& O; ~
use_backend dynamic if url_dyn . E( n0 v* E6 S0 A
use_backend static if url_css url_img extension_img 1 v* e$ B; x/ T, X+ c5 E
default_backend dynamic    当没有匹配时就用dynamic, D2 G0 o6 b" W- w" h; k5 r
* L' E9 ?# U7 m+ D2 E( u6 d: ]
errorfile <code> <file> 定义出现错误的代码的返回页) m! }' J  p9 r8 a9 d' l, k
Example :
5 E% k: D5 b% x, B1 N2 |8 Uerrorfile 400 /etc/haproxy/errorfiles/400badreq.http ! d1 o2 |5 a. E5 f
errorfile 403 /etc/haproxy/errorfiles/403forbid.http 7 ]/ F' I) Q; l2 E. F  O
errorfile 503 /etc/haproxy/errorfiles/503sorry.http
: W* g, ]5 T$ l' y$ F
# l# T3 s. ]3 J5 K
6 v, `( u6 ^2 J- w& Qerrorloc <code> <url> errorloc302 <code> <url>   出错重定向到指定url
1 ?8 B& O* P+ L9 X- kforce-persist { if | unless } <condition>  在特定条件下,强制继续连接down 掉的服务器后端* O( j- C  ^6 ^) k5 f. P0 T) n9 o
fullconn <conns>  定义后端组的最大连接数# A1 |7 d) Y4 k  O5 _4 m! T6 V
grace <time>  haproxy停止后,再持续多长时间用于处理连接
7 ]: V' t9 d4 f8 e2 S0 chttp-check disable-on-404  如果后端检测返回404,将不再把后端计入负载均衡
1 S  \/ R& ^& W/ c! F3 H! |http-check send-state 允许haproxy 发送 X-Haproxy-Server-State
7 o2 V+ {- ~8 i/ q5 e4 Ghttp-request { allow | deny | http-auth [realm <realm>] } [ { if | unless } <condition> ]   七层访问控制
; E7 d4 q+ Q+ j- p/ YExample:
  \2 y1 f8 s9 m+ ?+ i& Cacl nagios src 192.168.129.3
1 z5 z4 z* @3 y" n) o  B8 C  kacl local_net src 192.168.0.0/168 V) i& A9 n7 {
acl auth_ok http_auth(L1)
* D: V9 l3 s6 h( l4 m$ W2 S
! `8 u) N8 R. |http-request allow if nagios2 E! p. s5 {& l  f$ o7 [' c- E% g
http-request allow if local_net auth_ok# N& A9 p8 \7 D
http-request auth realm Gimme if local_net auth_ok
) v% z. X* ^4 ^! a! hhttp-request deny& d5 r. Z( W. [( G* Y
) l8 p% h6 i6 i; b3 K0 w
Example:: @: {; U6 V+ d5 U; C. A' }4 _/ q* o
acl auth_ok http_auth_group(L1) G1
) n2 L# Q* l) q) {! N! e; i* C4 _7 k) @( r
http-request auth unless auth_ok
1 {! {, v" D2 y' k% P; E& g9 w
& B6 ^2 h; s+ M3 X& B% omode { tcp|http|health }   设定启动的实例的协议类型
% I9 S( A4 `( d+ r. @) i- Lmonitor fail { if | unless } <condition>  监控失败条件设置# Z4 D* i& j- |) k# X6 V( N

0 L( U4 S; ~# T4 i0 d# Goption abortonclose 丢弃由于客户端等待时间过长而关闭连接但仍在haproxy等待队列中的请求
7 u: V7 K" j# A  `option accept-invalid-http-request  接受无效的http请求,建议关闭(开启可能有安全隐患)7 x+ U5 g3 ~: T! ^: q2 L
option accept-invalid-http-response 接受无效的response ,建议关闭
+ D) c  U9 s8 e& N* C, S: Noption allbackups  应该是后备服务器,如果正常的后端无法使用,就使用这些后备的设备,balance方式还是用原来的,没有优先的选择,常用来提供错误的页面
' M( Q5 u8 C5 q6 xoption checkcache    分析后端response,阻止可缓存的cookie,它对response 进行严格检查,包括"Cache-control", "Pragma" and "Set-cookie" ,查看在客户端代理那边保存是否有风险,如果这个允许的话,符全以下条件 的response 将被允许,其它的将被阻止。( K: q' _! [# v6 [& l
- all those without "Set-Cookie" header ;1 Q( P; C# E/ J0 h8 b2 O
- all those with a return code other than 200, 203, 206, 300, 301, 410,
; t) }' V1 O* I3 Kprovided that the server has not set a "Cache-control: public" header ;
% S4 @# p9 d8 i- e# U8 \! u- all those that come from a POST request, provided that the server has not6 H! y5 o+ P  ?6 j5 D6 l
set a 'Cache-Control: public' header ;
. D/ d( U. D2 F- those with a 'Pragma: no-cache' header
8 C+ p' z2 S5 j/ |! I4 h- those with a 'Cache-control: private' header
9 r7 Y$ A" B5 s5 ]  {7 ?- those with a 'Cache-control: no-store' header* I/ f+ g5 I( b# u1 D& Z# @7 g: U
- those with a 'Cache-control: max-age=0' header+ s$ _8 q2 U, v! X9 |+ k" W; g" E
- those with a 'Cache-control: s-maxage=0' header4 }0 E# V$ a1 q/ e% a8 t3 R
- those with a 'Cache-control: no-cache' header
+ ^: m4 [% o' G8 ?0 \0 Q9 B7 G3 T0 D6 g- those with a 'Cache-control: no-cache="set-cookie"' header* N& _( m% l( [6 p
- those with a 'Cache-control: no-cache="set-cookie,' header
1 S4 H1 n& V% a(allowing other fields after set-cookie)+ d& `3 R/ |9 `' g5 v3 o
- A# A% e/ F' L& b0 t
option clitcpka   是否允许客户端发送tcp keepalive 包,这个和http 的keepalive 没有关系
  l6 w4 p, d% _/ x. poption contstats   允许连续的流量统计更新- W1 [+ v8 X3 `7 ^
option dontlog-normal   开启正常连接的日志
( M! }& _" `) W. T" Uoption dontlognull   记录空连接* y' e4 _, M$ b  v: d  a7 S
option forceclose  允许关闭session 在后端把response 发送后/ Q; A7 D+ }( G( k1 @, C# O
option forwardfor [ except <network> ] [ header <name> ]        允许在request 中加入X-Forwarded-For header 发往server) t7 t8 h: `$ f& H$ E  T$ M+ o
option http-pretend-keepalive    定义是否haproxy要宣布同server keepalive
3 F2 P9 z! Q/ w3 ?( r, [option http-server-close   是否开启在server 端 connection closing5 B9 k: n) r; j7 H1 e" T
option http-use-proxy-header    用non-standard Proxy-Connection 替换 connection
4 t, x7 c# O! n9 \" u+ w; t2 N  j; r1 I: i
/ J/ X0 K% ], b
option httpchk <method> <uri> <version>  允许用http协议检查server 的健康3 x/ L4 M: Y# H
Examples :
5 Y: J2 _! }1 x% t# Relay HTTPS traffic to Apache instance and check service availability
- G1 u$ ^, G7 `) {' i2 O+ \  k- ~# using HTTP request "OPTIONS * HTTP/1.1" on port 80.
! b2 f/ J; Z  H$ [5 f7 h0 ~backend https_relay- k$ q" |  U- z: z7 N$ }
mode tcp
3 u  J: a0 n3 X6 h* {" |" }option httpchk OPTIONS * HTTP/1.1\r\nHost:\ www
0 n$ [1 q3 l" X+ w, Y2 kserver apache1 192.168.1.1:443 check port 80
( A$ ?) ?. x- U& w. ^4 n. E; i# ]/ d: u
option httplog [ clf ] 定制日志格式0 @+ P! f& n1 ~( r8 j! Q
option http_proxy  开启http 代理模式,只有最基本的代理功能* j5 Q. r8 V/ O- B
option ignore-persist { if | unless } <condition> 在某条件下拒绝持续连接,适用于对静态文件的负载均衡. A+ G  I! Z1 x# G' M
option independant-streams  启用双向超时处理,如socket 的read 和write - M: I+ j  L' @6 K! ^2 R; g
option log-health-checks   记录健康检查日志' _( R9 H6 M) t: U* A% `
option log-separate-errors   对非完全成功的连接改变日志记录等级
7 `. v5 I% C! Loption logasap   大传输大文件时可以提前记录日志
. @7 X' v/ J, l  loption mysql-check   mysql 健康检查
& l- J' s! c' w6 poption nolinger  清除肮脏连接后开成的tcp 状态及占用的资源,不过并不是强列要求你用这个选项,当然如果你有thousands of FIN_WAIT1 sessions on your system ,那肯定得用了
, v4 I& k; y& S6 g3 Z5 ?option originalto [ except <network> ] [ header <name> ]   允许在requests中加入X-Original-To header 发往server0 q  q! \5 g6 m+ Z1 d$ X" }. B1 ~
option persist     强制将http请求发往已经down 掉的server
% S- Y, x* V% H- f  [" r) G' hoption redispatch   是否允许重新分配在session 失败后' k! H. k+ [1 H/ m: u5 M
option smtpchk   smtp 检查
- {  |+ }$ j! X  m# N' Koption socket-stats  允许对单个socket进行统计( x" X6 n1 A% V) m; w' H0 t8 t* W, P
option srvtcpka  是否允许向server 发送keepalive) V( g% p5 a7 O7 @1 c  M/ H
option tcpka 是否允许向server和client发送keepalive
. _5 R' Q1 K; n1 D: Doption tcplog  允许记录tcp 连接的状态和时间
4 {+ e& D* r1 k* T, Y( O  _8 Ioption transparent   允许客户端透明代理
9 Q- h0 O1 X2 A) s4 j1 e0 ]rate-limit sessions <rate> 设置frontend 每秒处理的连接的上限,如果到达上限就停止建立新的connection
* U; R; Z' `1 |! S8 o7 W! d
5 _. h6 b8 ^( |6 W: `9 Z" b! [& sredirect location <to> [code <code>] <option> [{if | unless} <condition>]3 A- p$ p* h2 y* \3 Y! Y) I
redirect prefix   <to> [code <code>] <option> [{if | unless} <condition>] 重定向,相当于rewrite
, `4 T2 K/ A# J0 Z, U4 Y' S7 @' {
, E: l1 P/ w# [/ z( v- ?6 MExample: move the login URL only to HTTPS.
/ a% T! i4 Z( A  w6 A1 nacl clear      dst_port  80
7 i: I; Y4 b% m2 S5 ]4 y1 cacl secure     dst_port  8080& B# f& I. f, P, K
acl login_page url_beg   /login4 g( Z  Y/ r- ?  |7 }: Z
acl logout     url_beg   /logout3 D* K9 R# H* U( ]6 N
acl uid_given  url_reg   /login?userid=[^&]+; N: Z- y, Z$ N# e
acl cookie_set hdr_sub(cookie) SEEN=1
: Y3 M) ^* {& `* x' }: Z7 x5 c, p1 A% t% M  y; j( e5 j
redirect prefix   https://mysite.com set-cookie SEEN=1 if !cookie_set7 U0 E. Y( [6 y
redirect prefix   https://mysite.com           if login_page !secure+ U( v  j" N- U  `( E
redirect prefix   http://mysite.com drop-query if login_page !uid_given
+ W& Y, y8 `) ^* R) }redirect location http://mysite.com/           if !login_page secure$ [4 [$ ~9 k' s$ l  u1 L
redirect location / clear-cookie USERID=       if logout
' h' d6 R+ x7 g& _1 @# ?8 J# Q; j1 k9 c0 H  x! O
Example: send redirects for request for articles without a '/'.0 K* C7 Y6 p5 ]. V5 a
acl missing_slash path_reg ^/article/[^/]*$
( J8 q! v0 B! ^/ i8 A9 Yredirect code 301 prefix / drop-query append-slash if missing_slash8 G* ^' {4 ?, s& F$ A
redisp (deprecated)0 G5 y5 S! O! N" i! X3 }% e: T5 M
redispatch (deprecated) 开启session 重新分配在connection连接失败后,不赞成启用4 w0 H5 E1 l( N  N! c# b9 c) `  W8 t
reqadd  <string> [{if | unless} <cond>] 在http请示的末尾加上string* _% j: {9 p8 K/ e

$ A( O% x* B: F3 g" t$ N5 JExample : add "X-Proto: SSL" to requests coming via port 81
! G. W2 W. e( b8 s% l, T+ k- @acl is-ssl  dst_port       813 H/ T1 B$ Z# _6 c6 u
reqadd      X-Proto:\ SSL  if is-ssl
6 g- K, n" x: m5 h+ r& C  D3 w4 Q1 R- f: k0 \
reqallow  <search> [{if | unless} <cond>]
2 H7 y6 b% r  F  q: yreqiallow <search> [{if | unless} <cond>] (ignore case)    request 请求访问控制- ^8 r: r3 D$ N
$ @: D/ c" `( ?) D. e9 f
Example :
. z  [$ C  C8 G/ @  }# allow www.* but refuse *.local
; i4 U% s3 p7 N/ Ireqiallow ^Host:\ www\.
- N; R; ~8 L$ A* \. s+ A! b8 p7 treqideny  ^Host:\ .*\.local8 F: \& [  ~* L/ N% W' a, z/ L
8 f% K: V* {1 |
reqdel  <search> [{if | unless} <cond>]
$ b4 m% k2 y3 Rreqidel <search> [{if | unless} <cond>]  (ignore case) 删除请求的head 中的内容
& g+ J, y4 b+ O. N9 K4 E' G
4 T3 U3 A# J! S& n; Q, @Example :! Y6 G2 ~. T$ d' G6 b
# remove X-Forwarded-For header and SERVER cookie) T( e4 K' Y* V: e9 X
reqidel ^X-Forwarded-For:.*/ P, a$ [$ M+ Q1 g
reqidel ^Cookie:.*SERVER=
9 s& t, \8 ~5 `& D7 |$ z/ @3 @! h! Z% a% V2 V8 W) L' p

4 r, e  |9 k8 Q' r! creqdeny  <search> [{if | unless} <cond>]
2 O" m) L+ b9 `' y0 }3 oreqideny <search> [{if | unless} <cond>]  (ignore case) 拒绝访问
$ S( {1 }( s$ u* ~0 a
# e/ H8 ^: k* v2 ireqrep  <search> <string> [{if | unless} <cond>]$ \4 K5 }  J) X& F
reqirep <search> <string> [{if | unless} <cond>]   (ignore case)  request 请求替换) f& W7 }( S: |
Example :
" }& p. x9 @$ R2 o% `% ~& J3 M5 c% G, |8 _# replace "/static/" with "/" at the beginning of any request path.
% D! D" f: u& i( |& ^( Creqrep ^([^\ ]*)\ /static/(.*)     \1\ /\2# H' M$ K- I4 a7 M  }$ \
# replace "www.mydomain.com" with "www" in the host name.
* l  i  H3 |$ m& x& A; g5 v% {reqirep ^Host:\ www.mydomain.com   Host:\ www
. a" j6 y% j: Z; O
- A6 \6 ~# U. W$ X+ G2 }reqtarpit  <search> [{if | unless} <cond>]+ E! ?2 _0 i  Q+ Y
reqitarpit <search> [{if | unless} <cond>]  (ignore case) 阻止http请求中的某些信息
3 ?" ~3 }( ]& a6 A: y8 J
$ S9 y* z2 w9 vExamples :
' h. J# Z/ r! w! U# ignore user-agents reporting any flavour of "Mozilla" or "MSIE", but
! s; P+ @, Y6 ]# block all others.
7 o. [+ K5 D3 |) E6 q; W8 Z; y1 O- dreqipass   ^User-Agent:\.*(Mozilla|MSIE)
- }4 Y! g, s8 ~* V6 ereqitarpit ^User-Agent:( c$ \' A4 X2 m
3 Y1 H3 c( w8 f; N6 H/ i
# block bad guys/ t+ u6 F1 `4 u1 a, Q, ^
acl badguys src 10.1.0.3 172.16.13.20/289 u6 [' z1 S! ]
reqitarpit . if badguys
& E; {/ _4 k1 ]* l, U0 C
2 H2 S  h& c: E: F+ Y' J1 v8 o& Kretries <value> 当对server的connection失败后,重试的次数- l; E& ~" K% }
rspadd <string> [{if | unless} <cond>] response 增加信息4 i* F/ `) y; l0 l
rspdel  <search> [{if | unless} <cond>]
& J  J' Q5 N& ?( Mrspidel <search> [{if | unless} <cond>]  (ignore case)# p1 }* r' \) b& ?) O) ^7 v) h
rspdeny  <search> [{if | unless} <cond>]2 q+ w+ H) f: C, N( d
rspideny <search> [{if | unless} <cond>]  (ignore case)
8 |7 H/ c0 q/ J; q% s# ]rsprep  <search> <string> [{if | unless} <cond>]5 S4 V+ o  V! C, A/ ?' Q3 ^! M
rspirep <search> <string> [{if | unless} <cond>]  (ignore case)( x% x. Z: |. Y( B5 |
以上和request 的差不多
  Q' [$ ]( D+ ~4 X+ ?. r0 X7 ]8 S& w0 \0 i& e/ k
source <addr>[:<port>] [usesrc { <addr2>[:<port2>] | client | clientip } ] 定义从代理出去的连接的对象,用于限定地址可以访问server- o3 E* p2 ~  _2 ~
4 ~) U% F- N2 L9 b7 i- `
一些timeout
# p+ V" K- e: K: f: `
, \4 v/ t# D7 l/ K9 Isrvtimeout <timeout> server 处理超时,不赞成设置
" C# g/ u1 a! xtimeout check                             X          -         X         X
; u" x5 Z) R% O% [- c& `  Ctimeout client                            X          X         X         -- {8 a1 |3 Q" A7 H7 q9 ]
timeout clitimeout          (deprecated)  X          X         X         -
% P) n3 b+ @6 g  j9 htimeout connect                           X          -         X         X9 p/ T! N; Q1 L5 Z3 b" s( {
timeout contimeout          (deprecated)  X          -         X         X) {% [2 a# _$ X8 J8 k7 z' I
timeout http-keep-alive                   X          X         X         X* q* k& K5 Q: Q1 @6 M; G
timeout http-request                      X          X         X         X
% a/ {4 W3 C, w/ ~timeout queue                             X          -         X         X" Y7 b( L& U2 g5 p( e
timeout server                            X          -         X         X7 P% T! k) l0 G+ X" F1 {
timeout srvtimeout          (deprecated)  X          -         X         X  g) m4 g* M9 n* ?: t- B3 K
timeout tarpit                            X          X         X         X1 m6 ~- c$ m% a4 I0 {5 G% Y: x
' d" s2 j& x% @  d' P5 j
( p3 P; G2 e0 _
stats auth <user>:<passwd> 监控统计的帐号和密码
# V8 |+ y; Y1 U* |$ |5 ubackend public_www
3 ?* Y! _+ f) X$ z+ Yserver srv1 192.168.0.1:80+ m. a% k* j% h" S, l
stats enable0 E5 v: h, L% n2 Q& ]9 M3 w: r6 G
stats hide-version2 u! [; l+ g3 i) E0 x
stats scope   .
  b5 Y- S3 S9 g+ jstats uri     /admin?stats
) ?. B  X' R/ K3 F" P* Q; kstats realm   Haproxy\ Statistics: a/ k# u* ^: ^4 }8 x& e
stats auth    admin1:AdMiN123
9 j' U& K* U$ V! I, B: B; @stats auth    admin2:AdMiN321, t( f3 d/ [/ B6 t5 h
9 k+ D7 s! i& ^* O
# internal monitoring access (unlimited)
3 P& s; Q/ i; _% U2 h2 j; d1 x7 nbackend private_monitoring9 M$ \6 U2 u" _1 @" Q6 V. J+ e
stats enable( P6 R6 p+ ^1 s' h: W3 D/ e* K. ~
stats uri     /admin?stats7 H5 ]/ T! ^7 P
stats refresh 5s
# I7 v. \: d7 o" `/ [# P# T" M1 m+ H3 B
还有很多参数,以上能用到的也没有几个,只要满足当前需求就好,对于性能要求高的话,建议把不需要的功能 都关了吧.
====================
HAProxy的配置示例
HAProxy配置中分成五部分内容,当然这些组件不是必选的,可以根据需要选择部分作为配置。3 E/ d) P7 c) L% L# m9 {
global:参数是进程级的,通常和操作系统(OS)相关。这些参数一般只设置一次,如果配置无误,就不需要再次配置进行修改
$ o( V# p! V! Edefaults:配置默认参数的,这些参数可以被利用配置到frontend,backend,listen组件; q7 f: f: Q! q' C! R; l( L
frontend:接收请求的前端虚拟节点,Frontend可以根据规则直接指定具体使用后端的 backend(可动态选择)。
6 z) Z6 A7 P4 x$ Obackend:后端服务集群的配置,是真实的服务器,一个Backend对应一个或者多个实体服务器。1 Y0 ~; J- N3 w# w( z3 ~5 Z
listen:Frontend和Backend的组合体。
下面是HAProxy的一些常用的配置,这个配置是用来说明HAProxy的一些常用功能的配置,具体详细配置请查看安装目录下的doc目录下的文档文件,或者到http://cn.haproxy.org/下载中文配置说明文档
配置具体实例,后附说明:
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
option httpchk GET /welcome.html HTTP/1.1\r\nHost:www.taobao.net
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
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-6-12 03:23 , Processed in 0.039584 second(s), 26 queries .

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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