易陆发现互联网技术论坛

 找回密码
 开始注册
查看: 5850|回复: 1
收起左侧

haproxy配置文件详解

[复制链接]
发表于 2016-8-18 09:45:39 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?开始注册

x

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代表权重 ! \- q7 g- y) {: i

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


8 C" z9 [. L% s6 e% @# v$ h  j! U6 _2 Q  q
 楼主| 发表于 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不记录上级负载均衡发送过来的用于检测状态没有数据的心跳包。

( W: i- p! I7 y5 |! U% }# o* q
BALANCE 选项:
balance source :如果想让HAProxy按照客户端的IP地址进行负载均衡策略,即同一IP地址的所有请求都发送到同一服务
                             器时,需要配置此选项。
balance roundrobin :HAProxy把请求轮流的转发到每一个服务器上,依据每台服务器的权重,此权重会动态调整。最常
                                   见的默认配置。

" B& f" j/ E( {4 M: z- k" _4 [
COOKIE 选项:
cookie JSESSIONID prefix :如果客户端只支持一个cookie,并且服务器上的应用程序已经对返回设置了cookie,
                                               HAProxy设置此选项可以改写应用程序设置的cookie信息,把服务器的信息添加到原cookie中去。
cookie SERVERID indirect :HAProxy会删除添加的cookie信息,避免此cookie信息发送到服务器。
cookie SERVERID rewrite :
cookie SERVERID insert :
cookie SERVERID insert nocache :
cookie SERVERID insert postonly :
/ N3 w9 e9 @2 a. k( X
option httpclose
' Z* ^. s/ Z9 I/ g( tno option httpclose
/ P0 [+ Z: Y. X! p2 q# m- s* s  Enable or disable passive HTTP connection closing   启用或禁止消极的HTTP连接关闭9 K# @* }6 U3 a7 C' Q3 a1 J
  May be used in sections :   defaults | frontend | listen | backend5 e. ?) T* K8 d
                                 yes   |    yes   |   yes  |   yes4 |" s& P5 L0 j$ d
  Arguments : none
! t$ X0 ~; G6 W- H$ \$ t1 J  
. b" O1 m: e, ?  默认的,客户端与服务端的通讯,HAProxy只做分析、日志和分析每个连接的第一个request。如果设置了 "option* `" f, f8 @( s7 N
  httpclose" , 则会检查双向的http头是否有"Connection: close",如果没有则自动添加,使每个客户端或服务端在每次传输后,都会主动关闭TCP连接,使HTTP传输处于HTTP close模式下。任何 "Connection" 头如果不是"close",都会被移除。+ z; Z( N  e! b) a* h& @
% R1 g8 p' v2 i+ e. H  t- x. J! D
  很少会有服务器不正确的忽略掉头,即使收到"Connection: close"也不关闭连接,否则就是不兼容HTTP 1.0浏览器标准。 如果发生这种情况,可以使用"option forceclose",在服务端响应后主动关闭请求连接。选项 "forceclose"还可以及早释放服务连接,而不必等到客户端的应答确认。( G4 O. x  t7 F( E- K

+ R6 q/ ?1 m4 W  这个选项可以设置在frontend或backend上,只要其上可以建立连接。如果同时设置了"option forceclose",那么它比"httpclose"优先。如果同时设置了 "option http-server-close",则会实现"option forceclose"的效果。
option forceclose; X0 t- p7 I  ~; R7 \
no option forceclose
  Enable or disable active connection closing after response is transferred.     启用或禁止response后的主动关闭连接
  May be used in sections :   defaults | frontend | listen | backend
2 f, ^6 Q/ h  I4 z0 t, w* K2 e                                 yes   |    yes   |   yes  |   yes6 R  S: {4 J' h; U3 U
  Arguments : none5 r* j$ C* w( u! X6 ^$ j* N
        有的HTTP服务器收到"option httpclose"设置的"Connection: close",也不会关闭连接,如果客户端也不关闭,连接会 一直打开,直到超时。这会造成服务器上同一时段内的大量连接,日志中也会显示较高的全局会话时间。
        此时,可以使用 "option forceclose",当完成响应时,立即关闭对外的服务通道。该选项隐式打开httpclose选项。需要注意,该选项允许解析完整的request 和 response,所以可以很快关闭至服务器的连接,比httpclose更早释放一些资源。
$ t8 q0 A- e, l& b3 I- J7 c        如果同时启用了"option http-pretend-keepalive",虽然会禁止发送 "Connection: close"头,但是依然会在整个response被接收后,关闭连接。
0 ~" n! `( Q( t, ]9 S/ T) W! M% L# H0 t0 g* r& Y0 ^: C1 I
option http-server-close4 ^) C  k+ V  {. M1 ?" ^& R) z
no option http-server-close8 R# J6 g' E0 E
  Enable or disable HTTP connection closing on the server side  启用或禁止关闭服务端的HTTP连接
" M1 y+ ~& z7 z9 [$ G( T7 @  May be used in sections :   defaults | frontend | listen | backend
6 Y9 ^; r5 L( {: _7 w5 f6 ]                                 yes   |    yes   |   yes  |   yes
" u( ^; r. ^* ]5 Q' K  Arguments : none
- _  V6 Q# Y" `9 K* k! _7 S8 X7 }. D6 b    默认的,客户端与服务端通讯,haproxy 只是分析、记日志,并处理每个连接的第一个请求。该选项设置server端为HTTP 连接关闭模式,并支持客户端为HTTP keep-alive的pipelining模式。提供了最低的客户端延迟和最快的服务端会话重用,以节省服务资源,类似"option forceclose"。还允许无keepalive能力的服务端在keep-alive模式下为客户端提供服务,但是需要符合 RFC2616。需要注意的是,有些服务器遇到"Connection: close" 时并不总是执行关闭,那么keep-alive 则无法使用,解决方法是启用 "option http-pretend-keepalive".
% C3 {; a& b1 o3 x& f# e
9 V; a- W8 D8 T! h; O6 r7 J     目前,日志无法指明请求是否来自同一会话;日志中的接收日期为前一个请求的结束;请求时间为新请求的等待时间;keep-alive request time 存活请求时间为超时时间,绑定 "timeout http-keep-alive" 或 "timeout http-request"的设置。! N. j5 ]: ~6 t" k0 C
     这个操作可以设置在frontend或backend上,只要其上可以建立连接。需要注意的是,这个选项可以与 "option httpclose"结合, 但 "option httpclose"优先级更高,结合后基本实现了forceclose的效果。
% r4 P" V+ k; F; e9 Q$ @9 x6 z! Q' q6 H; z' y' Z
option http-pretend-keepalive (http-假装-长连接)# J7 L% J4 q: |% \
no option http-pretend-keepalive
3 n. |" I1 @9 z3 N  Define whether haproxy will announce keepalive to the server or not  定义 haproxy 与服务器是否是 keepalive 的。! g0 |0 M3 v) @
  May be used in sections :   defaults | frontend | listen | backend7 _- o& w1 F6 w4 S& ?
                                 yes   |    yes   |   yes  |   yes) ?4 N5 ?0 g0 ~, }. E' |
  Arguments : none
6 s+ ~/ J& e7 D    当声明了 "option http-server-close" 或 "option forceclose", haproxy会在给server的request头中添加 "Connection: close" 。然而有些服务器看到这个头,会返回未知长度的response,并自动避免chunked encoding,其实这是不对的。它会阻止haproxy保持客户端长连接,还会使客户端或缓存接收了未完成的响应,却认为响应结束了。
. A, @2 u  w( e) a3 U) |1 r  X    设置 "option http-pretend-keepalive", haproxy会在服务器端保持长连接,服务端则不会出现前面的问题。当 haproxy 获取了完整的response, 才会以类似forceclose的方式关闭服务端。这样客户端得到一个普通的响应,连接也在服务端被正常关闭。& i: ^' `# j6 f% ~
    建议不将其设为默认值,因为大部分服务器会在发送完最后一个包之后更高效的关闭连接,并释放缓存,而且网络上的数据包也会略微降低整体的峰值性能。但是启用该选项,haproxy会略微少做一些工作。所以如果haproxy在整个架构中是个瓶颈,可以启用该操作,以节省CPU。% b! A6 o7 B3 O/ F) c0 F# u2 u1 J( S

7 @. ]& V8 B  V5 v6 Z  \     这个选项可以设置在frontend或backend上,只要其上可以建立连接。这个选项可以与 "option httpclose"结合, 使服务端keepalive,客户端close,但并不建议这样做。
" ]' }+ f: P$ r/ Q! l
balance <algorithm> [ <arguments> ]2 A# K2 u1 P) ^+ c
balance url_param <param> [check_post [<max_wait>]]7 `$ P6 s: ?) q, n9 S- m# k; D
  定义选择后端服务的负载均衡算法
- r, F* n. Z# s7 P; j4 M  May be used in sections :   defaults | frontend | listen | backend
/ s) e4 P/ `2 g" H, b8 b# Y) ~                                               yes   |    no    |   yes  |   yes) f8 s# f2 l" M' h% q5 d
  Arguments :
7 q" j& i" o9 I    <algorithm> 是负载均衡时选择服务器的算法,没有持续信息时可用,或连接重定向到另一个服务器。<algorithm> 可以是以下几种:9 Y5 S" b0 z9 \* C' Y
      roundrobin  每个服务器根据权重轮流使用,如果服务器的处理时间平均分布,这是最流畅和公平的算法。算法是动态的,对于实例启动慢的服务器的权重会在运行中调整。每个backend的活动服务器在设计上限制为4128个。在一些大的群里面, 当服务器很短的宕机后恢复回来,有时会有几百个请求被重新整合到群当中,并开始接收处理。尽管很少发生,但是很正常。这也说明了有机会监视它们,所以不必担心。
) w) C2 d9 ~) M1 u' M4 ]
2 r( q5 v, m$ m$ f/ u! t      static-rr  每个服务器根据权重轮流使用,类似roundrobin,但它是静态的,意味着运行时修改权重是无效的。另一方面,它对服务器的数量没有设计上的限制,服务器启动后便会立即进到群中,整个分发方案会重新计算。这会略微降低CPU的运行(约1%)。6 k# j" K3 }- A3 m1 u9 ]
5 O( b: R! G% q$ C1 [
      leastconn  连接数最低的服务器优先接收连接。Round-robin用于负载相同的服务器,使每台服务器都被使用。leastconn建议用于长会话服务,例如LDAP, SQL, TSE等,而不是很适合短会话协议,如HTTP。算法是动态的,对于实例启动慢的服务器的权重会在运行中调整。
4 J/ [5 s2 E. F, N2 X$ A' g6 M- Z2 C( X  B7 T
      source    对源IP地址进行哈希,用可用服务器的权重总数除以哈希值,根据结果进行分配。只要服务器正常,同一个客户端IP地址总是访问同一台服务器。如果哈希的结果随可用服务器数量而变化,那么有的客户端会定向到不同的服务器。该算法一般用于不能插入cookie的TCP模式。它还可以用于广域网上,为拒绝使用会话cookie的客户端提供最有效的粘连。该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是算法会根据"hash-type"的变化做调整。
  M- O- i4 M2 o; T
$ G1 ?' Z/ n4 f5 r8 o" D      uri        对URI左端(问号之前)进行哈希,用可用服务器的权重总数除以哈希值,根据结果进行分配。只要服务器正常,同一个URI地址总是访问同一台服务器。一般用于代理缓存和反病毒代理,以最大限度的提高缓存的命中率。该算法只能用于HTTP后端。该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是算法会根据"hash-type"的变化做调整。2 {5 r& g# K- u, Q3 m% \. u4 W
                  算法支持两个可选参数"len" 和 "depth", 都是后跟正整数。“len”参数指定算法只处理URI从头开始的字符数,据此计算哈希。因为大多URI以"/"开头,所以"len"最好不要设为1。"depth" 参数指定URI中最大的路径深度,据此计算哈希。请求中的每个斜线为一级。如果同时声明了这两个参数,则截取URI时必须同时满足。
# y% a8 f& `9 Q7 I# k" K6 R% ?" T. b% n) k7 v* ~& I2 v* a8 G" w
      url_param  在HTTP GET请求的查询串中查找<param>中指定的URL参数。
+ S( @3 Y% Z9 ?' U                 若使用了修饰符"check_post",如果在URL问号('?')后面的查询串中找不到参数,就会搜索HTTP POST 请求实体。或者在指定的一些字节后面尝试搜索消息体。如果搜索不到实体, 则使用round robin算法。例如,假设客户端总是在前128个字节发送LB参数,就可以指定它。默认为48。如果到达网关的字节数量不够,实体数据是检索不到的,至少有:(default/max_wait, Content-Length or first chunk length)。如果Content-Length没有或为0,就不需要等待客户端发送更多的数据。当Content-Length有值且大于<max_wait>,则等待仅限于<max_wait>,并假设有足够的数据用于搜索参数的存在。万一Transfer-Encoding被用了,则只能检查第一个块。如果参数值被块边界分隔开,则只能随机均衡负载了。, I/ B, z# B3 \3 f
                  如果参数后面跟着 ('=') 和一个值,则可以根据这个值进行哈希,用可用服务器的权重总数除以哈希值,根据结果进行分配。
! S! }; {9 Q$ o. h! O                  还可用于跟踪请求中的用户身份,只要服务器正常,同一个用户ID的请求总是发给同一台服务器。如果没有参数或参数没有值,则使用轮询算法。该算法只用于HTTP后端。该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是算法会根据"hash-type"的变化做调整。
0 k$ V" Y) T+ I) c
1 i( q, ~  n5 Q% q      hdr(name)  在每个HTTP请求中查找HTTP头<name>。与ACL函数'hdr()'一样。括号括起来的头名字不区分大小写。如果缺少头或头没有任何值,则使用roundrobin算法代替。                  
) C0 O8 s3 H  Y' U2 d' W# b                       启用参数'use_domain_only',哈希算法将只用于一些类似'Host'的特定头的主域部分。例如主机值"haproxy.1wt.eu",则只考虑 "1wt"。该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是算法会根据"hash-type"的变化做调整。* d5 j( F* ]. u2 i+ m# G

' A& M7 U1 `& }3 c/ h      rdp-cookie
4 K2 ?7 R' ]& Y5 N8 p# c      rdp-cookie(name)* c6 I; H9 ]/ B3 R" W: O6 v) q
                  为每个进来的TCP请求查询并哈希RDP cookie <name> (或“mstshash”如果省略) 。与ACL函数 'req_rdp_cookie()'一样,name不区分大小写。该机制用于退化的持久模式,可以使同一个用户(或同一个会话ID)总是发送给同一台服务器。如果没有cookie, 则使用roundrobin算法代替。
5 v6 [5 n0 H& V: `# A, J                  必须注意该声明要生效,前端必须确保在请求缓冲中已经有RDP cookie,所以必须使用规则tcp-request content accept' 和ACL 'req_rdp_cookie_cnt'相结合。
- |. L7 f  F, S% Z% Z                  该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是算法会根据"hash-type"的变化做调整。  s& K( @9 v4 H6 z
& p% @0 l& q5 o3 s
    <arguments> 是用于一些算法的可选参数列表,目前只有"url_param" 和 "uri" 用到,例如:8 T! I( g5 R" n9 y; Z  @: f1 v+ l
                balance uri [len <len>] [depth <depth>]
" H( E3 U, c% F! p# D1 p) s                balance url_param <param> [check_post [<max_wait>]]
' s2 n% t  F' n! o& {5 _5 ~. z( h" F% r4 K. K7 i- N1 [- ~. n4 _! K
  如果没有其他算法、模式或选项的设置,后端的负载均衡算法默认为roundrobin。每个后端只能设置一种。% x3 t3 J, j) H8 b, M8 a. L# x0 c: n
  Examples :
1 J% D; s& r3 W) x        balance roundrobin1 N* E- R/ J6 z8 c
        balance url_param userid
' i$ A4 Y" ~; R# c7 M8 d  r' |        balance url_param session_id check_post 64
" B5 i/ V/ _) }' J6 _' X5 J1 O        balance hdr(User-Agent)' U- k  P) o. _' j
        balance hdr(host)0 G/ y& G! e$ L; {* d& A6 m- U
        balance hdr(Host) use_domain_only
. ~$ `6 Z5 f3 B' s7 w+ U8 ^6 B8 S/ E3 V" o
  注意:  以下的警告和限制是使用“check_post“扩展和”url_param”所必须考虑 :
5 P7 j: T, A3 V( I    - 所有POST请求都要考虑,因为在包含二进制数据的体或实体中,没有办法决定是否会找到参数。因此需要另一种方法,限制POST请求的体中不含有URL参数 (见 acl reqideny http_end)
    - 大于请求缓冲大小的 <max_wait> 值是没用的。在build时设置缓冲大小,默认16KB。
3 U# R( L$ A) z9 B' {    - 不支持Content-Encoding, 参数搜索会失败;负载均衡会改用 Round Robin。6 g+ D6 G3 ]+ S) P) R
    - 预计: 不支持100-continue,负载均衡会改用 Round Robin。. o( Z- {, z3 J
    - Transfer-Encoding (RFC2616 3.6.1) 只在第一个块中支持。如果在第一个块中的参数值不完整,选择的服务器就没有定义。(实际上取决于在第一个块中定义的有多小)
- G6 F, [: L* V  R& h+ J2 F" `    - 该特性不支持生成100, 411 或 501 响应。" m6 k. k8 K) U- p  }6 o
    -  有的情况下,需要"check_post"只是要查看整个消息体的内容。检查一般会停在任意数量的空格(LWS: linear
0 b1 E9 W+ {3 x      white space)或控制符上,表示这可能是一个URL参数列表。这可能不是一个关于SGML的类型消息体。
* C/ Q) d& a  h% P; L. ?2 R0 I' Q( V
  See also : "dispatch", "cookie", "appsession", "transparent", "hash-type" and "http_proxy".

: ]( R2 D" @6 f  Y, `) q
hash-type <method>
4 s5 f; q" }/ m% D) U/ q  将哈希映射到服务器的方法。Specify a method to use for mapping hashes to servers
. G0 D0 p2 f7 ?- F& X  May be used in sections :   defaults | frontend | listen | backend0 r2 _/ b$ k- |$ C& ^+ O* d0 A
                                               yes   |    no    |   yes  |   yes
8 U/ c' K# w$ j+ F% |  Arguments :3 I3 z2 L  e- R
    map-based  哈希表是包含所有在线服务器的静态数组。哈希结果很平滑,并考虑了权重,但是会忽略服务器启动时的权重变化,也就是说不能慢启动。另外,服务器是根据数组中的位置所选择的,所以服务器数量变化时,大部分映射也会变化。当一台服务器启动或关闭,或服务器加入到群中,大部分连接会再分配给不同的服务器,这对有缓存的实例会比较麻烦。
    consistent  哈希表是由每个服务器构成的树,会在树上查找哈希Key,并选择最近的服务器。这种哈希是动态的,支持服务器启动时修改权重,所以可以慢启动。它有一个好处是当服务器启动或关闭时,只有其本身的关系被移除,当服务器加入群时,只有一小部分的映射会被重新分配,所以是一个比较理想的支持缓存的算法。但是根据其原理,算法不会非常平滑,有时候必须调整服务器的权重或ID来获得更平衡的分布。要保持多次负载均衡时的相同分布,服务器ID是绝对不能变的。(roloand:haproxy根据服务器的ID初始化其哈希值)
! C- D! M2 {  X6 y+ `6 e   默认值是"map-based",建议大部分情况下使用。2 v, D$ }& n, I4 S6 A$ C' U* W
7 T/ c4 s# Y& n$ ?# l
  See also : "balance", "server"

9 V2 |( g/ S& `2 K* h' ?0 Ldispatch <address>:<port>  ^$ v$ k7 s; d& {9 n
  设置一个默认的服务器地址
& V" F1 e1 A+ h2 t1 _  May be used in sections :   defaults | frontend | listen | backend
6 G# a9 z# M" l& v# k                                               no    |    no    |   yes  |   yes
) o  l/ ~0 A0 B0 M+ F$ Q! I  Arguments : none
& p' F+ j& J6 X( O' C    <address> 默认服务器的IPv4地址,也可以是主机名称,名称只在启动时解析为IP地址。
" Y4 N+ ]) x! f$ Q) Q    <ports>  端口号,所有连接都会发送给这个端口,但是不允许像其他服务器一样使用端口偏移(port offsets)。
   "dispatch"关键字指定了一个默认的服务器,用于无可用服务器时的连接的处理。过去常用于前传非持久连接给后备负载均衡器,由于定义简单,还用于简单的TCP中继(TCP relays)。 建议对于明确的连接处理,应使用"server"直接声明。
====================
一:Global parameters
8 ?( _9 q3 P9 }, n. q% e* Process management and security
5 P& z! u* }5 \7 L1 w3 M( c- chroot 改变当前工作目录+ Q( J! y  Y" ^2 M! f9 y
- daemon 运行方式为后台工作
  n# w+ @$ T9 \  u) ~  M- user - group 工作用户和组. m* u) U" ^9 y3 M
-log <address> <facility>日志输出设备
. Y5 L/ W" x: `3 i8 x- nbproc 创建工作的进程数目
# H  @- B6 y- Q-pidfile pid文件位置1 U- g$ ]9 w% Y2 W* V" u- t% S
- ulimit-n 设置每个进程的可用的最大文件描述符- W% V: L$ s% v4 ]
- stats 创建监控所用的套接字目录
9 o$ Y6 y8 P% E0 t- node 创建另外一个节点名字共用一个IP地址,用来识别哪个节点在处理流量/ A0 R5 G& Q4 f! E( F: m
- description 描述实例的名称& z* W- G# ?+ e; u$ {4 \- [) L
maxconn <number> 每个进程可用的最大连接数
3 {6 R2 w8 `  Y+ dmaxpipes <number>  每个进程可用的最大管道数- |3 C2 \$ w' d0 M$ z4 H* b1 V
nokqueue  nopoll  nosepoll nosplice  禁用这些功能
( C8 f- s( n7 ]: T  w: Tspread-checks <0..50, in percent>  health check 的时间间隔
/ |7 X; L, T0 i2 m3 Ltune.bufsize <number>
  H' `! g( W; v8 \tune.maxaccept <number> ! y4 W& W1 u+ E% u+ v* l, C
tune.maxpollevents <number>
9 c+ l$ w- V0 ?tune.maxrewrite <number>
7 F, `6 V* t5 Itune.rcvbuf.client <number> ! Y8 q* F* z! I9 o/ o  k
tune.rcvbuf.server <number>
4 Z, O0 o, g3 V" F; Z) ctune.sndbuf.client <number>
/ |5 u" S& _/ f: o; Ytune.sndbuf.server <number> 5 P5 G+ y0 S1 d$ s, ]! Z; m( r
以上凭字面理解吧- y. P' o7 ~5 A& u! }) g5 Z" Y
debug  调试模式,输出启动信息到标准输出
8 p* H) u, m4 ?* f- S+ Nquiet   安装模式,启动时无输出
7 P6 b4 m  n" o+ S/ j0 L
$ _9 P/ V5 Q5 t0 j8 L* Z二:defaults 块
, w$ u9 `/ n* v9 U/ p; n3 \作用于其后紧跟的listen块,直至下一个defaults 块,下一个default 将替换上一个块作用于以后的listen
6 L1 T0 z+ l6 g' t$ |9 G3 xfrontend 块,接受请求的端口组
# ^) K  j% |" L, d8 y" N5 Sbackend块,后端处理的server 组
2 T8 W/ U7 n5 A4 i9 g# dlisten块,frontend和backend 块的结合
* N( d9 j4 \) f, _6 q4 t4 v: G$ S7 C( k( z5 W; X0 g1 J! J& p
三:常用配置命令
. F/ q+ P! u' W0 h5 B6 m5 F# t% N# \& ^' d/ P4 G  u4 N) Q
balance <algorithm> [ <arguments> ] ( H0 P: a9 q/ A* m/ l' s( x
balance url_param <param> [check_post [<max_wait>]]   负载均衡模块设置: T3 q( z" g7 ^8 |& Y

( K3 ^3 C& s$ w; \. y; _. i: k. J, K5 lExamples :: P# Y! `( N( D8 ]) v
balance roundrobin
; l8 L/ S" X2 s  P0 o. Hbalance url_param userid  9 x2 O! T4 k* x
balance url_param session_id check_post 64 7 F' }7 W6 c/ _. ~
balance hdr(User-Agent)   M, `8 p) `5 m5 T3 R: _
balance hdr(host) ( p! r5 E/ Q0 k! M  [
balance hdr(Host) use_domain_only
$ H4 B2 c( s" q( n% ^
% K  R' V+ s( dblock { if | unless } <condition>  在7层阻止访问. p4 |7 R# {: F& L3 e9 f: l
Example:
  k4 J! Q* @* Z: Q6 r4 Iacl invalid_src src 0.0.0.0/7 224.0.0.0/3  acl定义和squid 很像
# g  y8 A4 j7 o% z% [) n0 racl invalid_src src_port 0:1023 " v5 n: G. l& L+ ]/ \5 W
acl local_dst hdr(host) -i localhost 7 N' H) W; e& x% `  s$ [- n& n
block if invalid_src || local_dst
- J9 ]" O, ]% I1 B3 S+ }/ z; P5 }+ Q  S& E& Z/ M4 S  \/ p
capture cookie <name> len <length>  在请求和回应包中捕捉记录指定长度的cookie,name 为cookie的开头几个字母
; v$ G' B+ `( T$ j
& b6 g* Z8 h1 Q# |: X+ PExample:
5 y* ], O6 P/ k6 b3 k+ Lcapture cookie ASPSESSION len 32
8 o* {' V& [3 G0 m# l/ ~% M! l" a& }1 W
capture request header <name> len <length> - q$ @, n# r# n. D/ C
capture response header <name> len <length> 同上
* h7 p1 W; e7 g+ L- w
, N2 i2 m0 u. d8 X+ |7 \6 A6 Gclitimeout <timeout> (deprecated)
& \, ^& n  i3 G% l- v# Lcontimeout <timeout> (deprecated)  客户端超时时间,不赞成设置: I/ k  f, f1 Q2 k8 Z9 \8 f

7 ?. ]. W+ @3 ?cookie <name> [ rewrite | insert | prefix ] [ indirect ] [ nocache ] [ postonly ] [ domain <domain> ]*   允许持续的基于cookie 的后端连接, u0 I: j: q, Q  V( Z: _
/ I6 r+ x. ~: k# y$ {
default_backend <backend> 默认应用的后端8 c  [: Y7 N. F& C8 Q- ]

- s, U! l& b% l) z2 W# LExample : - |: P! O, w9 c4 j' y
use_backend dynamic if url_dyn
' v- t! B2 ~) w& h# X3 muse_backend static if url_css url_img extension_img
3 s( Y0 a" e+ |  Xdefault_backend dynamic    当没有匹配时就用dynamic
  P) h" S( i7 O; U9 }: a& j: {. M1 X
errorfile <code> <file> 定义出现错误的代码的返回页0 K1 z$ W6 C) E# F: g
Example :
8 D$ L/ @# r; c* n5 @; eerrorfile 400 /etc/haproxy/errorfiles/400badreq.http
+ G8 o( n8 b' y& Y( p% s' O5 Rerrorfile 403 /etc/haproxy/errorfiles/403forbid.http 8 j/ w3 _. F$ Z
errorfile 503 /etc/haproxy/errorfiles/503sorry.http
" o6 z& U' G# v7 K8 Q. V1 v5 c" c  G( D0 g4 s# G+ t

( {$ S) |* k  I- a0 Y9 Gerrorloc <code> <url> errorloc302 <code> <url>   出错重定向到指定url
* g5 U& S( z) X. N6 Z/ ~, C+ R2 I4 Sforce-persist { if | unless } <condition>  在特定条件下,强制继续连接down 掉的服务器后端5 R" i5 Z! H. R- L# `
fullconn <conns>  定义后端组的最大连接数1 r/ n6 ~! C0 l* I
grace <time>  haproxy停止后,再持续多长时间用于处理连接+ ]" U/ v, p$ b5 E4 M) @
http-check disable-on-404  如果后端检测返回404,将不再把后端计入负载均衡. k. N/ G  ~$ h0 V- `7 \' N4 s
http-check send-state 允许haproxy 发送 X-Haproxy-Server-State
! G1 D" I/ l5 J3 {- z% ]http-request { allow | deny | http-auth [realm <realm>] } [ { if | unless } <condition> ]   七层访问控制; M, s6 C; c4 q! d6 z" {
Example:
. h- q8 c7 q$ u) pacl nagios src 192.168.129.3: z4 F4 _; C( p9 W
acl local_net src 192.168.0.0/16/ i. B& ^$ |6 U+ k$ M" Q
acl auth_ok http_auth(L1)
0 S8 |9 C4 g! n4 L) y6 @6 l) w
/ }" S0 w$ s4 J; ^' Khttp-request allow if nagios
3 w' w3 b2 Y. ?0 q( e1 fhttp-request allow if local_net auth_ok
3 B3 ]0 m9 d( x1 n' l, M9 ~http-request auth realm Gimme if local_net auth_ok
6 N& L4 }7 o* M3 \% k2 c& t8 bhttp-request deny
2 @% \5 G9 [% r& N+ \: j$ r5 b6 {: b
Example:
" W6 N. W$ w6 f5 n0 e8 M: s# |5 N& l7 cacl auth_ok http_auth_group(L1) G1
$ q% P4 p( h! Z2 S6 z9 R$ c& I3 I9 W, q) g% G
http-request auth unless auth_ok
# Y( N. L+ M4 p/ a& F" e+ A: S, S/ Q3 n' K
mode { tcp|http|health }   设定启动的实例的协议类型
( y+ Z* @6 Y3 z6 ]" e$ omonitor fail { if | unless } <condition>  监控失败条件设置
4 u' h8 {' F8 z1 t+ a- c+ c- @8 z5 H6 A" P8 V- J* w- }5 F2 C% N
option abortonclose 丢弃由于客户端等待时间过长而关闭连接但仍在haproxy等待队列中的请求  N- M% v3 t) x
option accept-invalid-http-request  接受无效的http请求,建议关闭(开启可能有安全隐患). B9 P. M8 k# V, |; i; d4 b
option accept-invalid-http-response 接受无效的response ,建议关闭9 J. f  o' o8 `1 r
option allbackups  应该是后备服务器,如果正常的后端无法使用,就使用这些后备的设备,balance方式还是用原来的,没有优先的选择,常用来提供错误的页面8 Z) T7 l& ~* |! }- t
option checkcache    分析后端response,阻止可缓存的cookie,它对response 进行严格检查,包括"Cache-control", "Pragma" and "Set-cookie" ,查看在客户端代理那边保存是否有风险,如果这个允许的话,符全以下条件 的response 将被允许,其它的将被阻止。
5 H0 v* [& M5 G  m: U, h4 i6 P- all those without "Set-Cookie" header ;
% W9 @& Q0 @3 V9 d- all those with a return code other than 200, 203, 206, 300, 301, 410,) c* M& a# E6 f$ D5 p# b/ U" \
provided that the server has not set a "Cache-control: public" header ;; p- U. x2 f5 f1 Z
- all those that come from a POST request, provided that the server has not
3 U  ^- G9 }1 m. @set a 'Cache-Control: public' header ;
+ I9 |4 H- ]) D+ z( V" u" i- those with a 'Pragma: no-cache' header0 f9 r3 ~5 y' y: v! [9 G
- those with a 'Cache-control: private' header
' W: D  {) m+ @8 M% N! S& Q5 o; T- those with a 'Cache-control: no-store' header
& Y) n6 p- |& F8 v- those with a 'Cache-control: max-age=0' header
5 j) i& p/ T7 i0 T, J* K- those with a 'Cache-control: s-maxage=0' header
( \, d' P8 c* f" |0 w8 a, r4 t- those with a 'Cache-control: no-cache' header
" h7 @; ?. W' K2 {! L- those with a 'Cache-control: no-cache="set-cookie"' header
  _, d8 N/ r- F$ M4 ~) j- `- those with a 'Cache-control: no-cache="set-cookie,' header
! ^( t) T9 i1 j* j9 M2 K* {* ](allowing other fields after set-cookie)
8 }/ ^' M( s  Z8 f; e# c' ^3 q
option clitcpka   是否允许客户端发送tcp keepalive 包,这个和http 的keepalive 没有关系
! y4 B% e9 P$ E: ~" f0 [0 moption contstats   允许连续的流量统计更新( F- U4 g, V, T# K
option dontlog-normal   开启正常连接的日志  f2 u4 W6 @& m% W
option dontlognull   记录空连接
) C5 f! _0 u% j& Woption forceclose  允许关闭session 在后端把response 发送后& r- K" n, T+ P& i
option forwardfor [ except <network> ] [ header <name> ]        允许在request 中加入X-Forwarded-For header 发往server. ?1 O9 u7 n1 J
option http-pretend-keepalive    定义是否haproxy要宣布同server keepalive
: m' j& V% L% F; J0 f- L6 E  _! C/ yoption http-server-close   是否开启在server 端 connection closing6 o4 F4 D9 F5 t; p( A/ t4 \
option http-use-proxy-header    用non-standard Proxy-Connection 替换 connection
9 \3 n+ _/ U9 L: l3 ^9 ^! Q) A% t& U  q3 A1 {
  v$ J4 K5 O& t8 U  _. `
option httpchk <method> <uri> <version>  允许用http协议检查server 的健康2 j! W$ w" v# q5 H
Examples :
- ~% O0 y6 ]0 F# Relay HTTPS traffic to Apache instance and check service availability
. d- b4 _% S3 d* f5 c# using HTTP request "OPTIONS * HTTP/1.1" on port 80.8 Q1 T; D* q; w; W
backend https_relay
; f+ S+ y' h3 R; Q' O0 smode tcp
1 ]9 @  F7 C+ B% }$ Woption httpchk OPTIONS * HTTP/1.1\r\nHost:\ www
9 q8 s7 {; V5 M# X/ U( A5 B+ |server apache1 192.168.1.1:443 check port 807 r0 k8 `* V* A

' X, J3 G8 v7 N, G) doption httplog [ clf ] 定制日志格式
  G$ Y" T- e+ ^( \9 x, ?; Foption http_proxy  开启http 代理模式,只有最基本的代理功能
& m" p, q7 g! h/ d2 toption ignore-persist { if | unless } <condition> 在某条件下拒绝持续连接,适用于对静态文件的负载均衡. q5 u- L) L  j/ q2 n
option independant-streams  启用双向超时处理,如socket 的read 和write
1 U9 |) U$ Y# Q# O1 Boption log-health-checks   记录健康检查日志3 A# ]6 _4 D+ ]
option log-separate-errors   对非完全成功的连接改变日志记录等级6 E; O& d& z. V8 b2 F" f
option logasap   大传输大文件时可以提前记录日志' X4 t3 N. U/ T& r! H/ U5 ^
option mysql-check   mysql 健康检查
! P6 ], d& s0 V8 G8 `0 poption nolinger  清除肮脏连接后开成的tcp 状态及占用的资源,不过并不是强列要求你用这个选项,当然如果你有thousands of FIN_WAIT1 sessions on your system ,那肯定得用了
! N' D- f  ?5 J! b$ m3 W4 ?option originalto [ except <network> ] [ header <name> ]   允许在requests中加入X-Original-To header 发往server
. F+ _9 a+ J) p  P( p. @4 P2 h. u# aoption persist     强制将http请求发往已经down 掉的server8 _9 z: C( T& g1 g; c+ K. Z- ]/ k
option redispatch   是否允许重新分配在session 失败后# W# P/ D3 k- V$ ?9 X+ Y
option smtpchk   smtp 检查: X, W1 l3 x, M; s7 \" s# K! v" H
option socket-stats  允许对单个socket进行统计
+ Y; ~  l: Q7 j. W- T# H% H' Yoption srvtcpka  是否允许向server 发送keepalive
$ G$ G# V/ R0 |/ i2 aoption tcpka 是否允许向server和client发送keepalive6 Q  a$ ?3 L3 A* L, }5 g
option tcplog  允许记录tcp 连接的状态和时间  G; X% O1 I4 V& ]/ Y
option transparent   允许客户端透明代理/ ~  X& F1 z, [& X3 h! i; H
rate-limit sessions <rate> 设置frontend 每秒处理的连接的上限,如果到达上限就停止建立新的connection  J- P- d( ?$ D0 S! k

) N/ \& W: H: ]! ]2 V( o2 ^redirect location <to> [code <code>] <option> [{if | unless} <condition>]
6 I% p7 Y- E3 i1 ?redirect prefix   <to> [code <code>] <option> [{if | unless} <condition>] 重定向,相当于rewrite5 q! z- B$ a5 h, X- q
& m  R5 c5 @" z5 C" N3 T0 T
Example: move the login URL only to HTTPS.
' g* D8 Q, `- f. Yacl clear      dst_port  800 c' O5 p# @! M  D
acl secure     dst_port  8080
$ X, |7 ?9 b2 Wacl login_page url_beg   /login
# v  J: t: x5 k9 L7 K0 ^8 V! racl logout     url_beg   /logout
7 j% q: Z1 ^& v, A; {4 l) [  T' [acl uid_given  url_reg   /login?userid=[^&]+/ \( v( F5 \, B/ E- ^7 l
acl cookie_set hdr_sub(cookie) SEEN=1( U& s: `* q" A

" s- K" V: q+ m: b/ i2 Nredirect prefix   https://mysite.com set-cookie SEEN=1 if !cookie_set
: v( Q% l) M& @redirect prefix   https://mysite.com           if login_page !secure- l; i" x7 x5 U$ m7 u/ K* {) {
redirect prefix   http://mysite.com drop-query if login_page !uid_given
- ^' _5 w/ J; D4 T& Predirect location http://mysite.com/           if !login_page secure1 M7 w0 K8 A* L0 n: t- e$ k
redirect location / clear-cookie USERID=       if logout! N& _/ h. V0 C( i; X9 I

+ S+ O5 i* `' J4 U. PExample: send redirects for request for articles without a '/'.
1 m. d7 V& A8 P) \0 |' Aacl missing_slash path_reg ^/article/[^/]*$% g. s2 v: _$ Y3 i& v8 ?7 l8 G* {
redirect code 301 prefix / drop-query append-slash if missing_slash
4 k0 X% R1 J. o6 r. Uredisp (deprecated)
/ K! z- d( ~2 z3 predispatch (deprecated) 开启session 重新分配在connection连接失败后,不赞成启用/ \* F. x3 J# M5 |
reqadd  <string> [{if | unless} <cond>] 在http请示的末尾加上string" R& T( B5 X2 n' ?4 R$ f
; ~( @: F! l4 G/ \4 k
Example : add "X-Proto: SSL" to requests coming via port 81% S7 A! |5 C" e0 n6 S
acl is-ssl  dst_port       81
% C' H% z; w7 d$ f4 x; yreqadd      X-Proto:\ SSL  if is-ssl
4 C! G% k# L3 W+ d
) N8 p2 y5 X$ K. Dreqallow  <search> [{if | unless} <cond>]9 R0 c2 T% W8 C8 Y! s
reqiallow <search> [{if | unless} <cond>] (ignore case)    request 请求访问控制, v8 o' p) U1 `) T$ Q- C# y

; C% x3 z9 a4 O4 Z% h: @  t8 KExample :
1 u+ z) \" V# z. A; j7 Y, m# allow www.* but refuse *.local4 f6 f7 o. x4 H; s( P
reqiallow ^Host:\ www\.
" y& I' D' i% ?% {( b& z2 e2 wreqideny  ^Host:\ .*\.local
1 ]' P# W" F# {* {' Z! T7 Q/ U5 L' X& r0 B/ U. z3 F% g
reqdel  <search> [{if | unless} <cond>]
5 K2 m3 _  I7 lreqidel <search> [{if | unless} <cond>]  (ignore case) 删除请求的head 中的内容
) o) I0 K- K9 ~# W& A! O
  A( F, N9 L0 o/ C- o$ HExample :
8 y4 m* H5 p/ y( h* C# remove X-Forwarded-For header and SERVER cookie7 O3 t6 N% I8 V  T& b$ w4 b
reqidel ^X-Forwarded-For:.*
* g& z, @( \$ w9 E* L( Q% m8 wreqidel ^Cookie:.*SERVER=, t* O/ U" \3 i$ [) f9 l
8 K6 p$ P: X5 Y0 ~6 p& W

$ i' d4 x0 W$ H5 J2 ]reqdeny  <search> [{if | unless} <cond>]& I; {2 p/ Z2 N$ _) u$ m, i
reqideny <search> [{if | unless} <cond>]  (ignore case) 拒绝访问
2 q& \2 Z6 m9 \4 ?9 m2 B
7 d( H5 N" A9 @6 v# V9 w* F" dreqrep  <search> <string> [{if | unless} <cond>]
8 L& w& @8 a* w7 @, hreqirep <search> <string> [{if | unless} <cond>]   (ignore case)  request 请求替换
* w! ?. u' j0 ?Example :3 e2 `5 [' L: H
# replace "/static/" with "/" at the beginning of any request path., Z; S: p' o" k# x  C
reqrep ^([^\ ]*)\ /static/(.*)     \1\ /\2
% ^1 C. V% |9 u  Z6 r* B# replace "www.mydomain.com" with "www" in the host name.
2 E" H' C9 O3 V2 p$ \reqirep ^Host:\ www.mydomain.com   Host:\ www
+ H. k. @8 F+ v$ {7 l- O8 ]8 _% a5 ~) B
reqtarpit  <search> [{if | unless} <cond>]
9 n  O$ A( {5 N$ m7 Treqitarpit <search> [{if | unless} <cond>]  (ignore case) 阻止http请求中的某些信息
. L  W+ L3 I7 E1 U
" c& N7 F) G+ F# V6 n: NExamples :2 a  _* B/ z9 ^: B: C4 F" {
# ignore user-agents reporting any flavour of "Mozilla" or "MSIE", but9 Z( F& P3 a5 u# t  j% |1 y
# block all others.
$ [& G1 p% ^6 v8 r8 L: Nreqipass   ^User-Agent:\.*(Mozilla|MSIE)- v& w9 l6 [7 S! n! {8 g) ~  T
reqitarpit ^User-Agent:
8 d. V% u- ~  e; Q/ ]% J% k
7 O8 j+ B9 }; Y( q5 f. b5 F# block bad guys% q  ~9 o& y+ g
acl badguys src 10.1.0.3 172.16.13.20/28- T( a7 F+ }) F
reqitarpit . if badguys& h) @; j) ~" S: y1 r5 {

3 E6 y8 |4 t" j1 D6 X6 a; e2 h( yretries <value> 当对server的connection失败后,重试的次数
7 w, u& b/ ]! hrspadd <string> [{if | unless} <cond>] response 增加信息
' B$ R8 n6 `& C( o' O$ M' _$ @rspdel  <search> [{if | unless} <cond>]0 @/ W1 t9 |' E+ X0 i! ?
rspidel <search> [{if | unless} <cond>]  (ignore case)
; }$ |: G, |3 Y/ ?4 I, Krspdeny  <search> [{if | unless} <cond>]
* |# y! b- f) @rspideny <search> [{if | unless} <cond>]  (ignore case)
' @( f6 t  K. V9 M& m9 }rsprep  <search> <string> [{if | unless} <cond>]' B* M1 O) e6 X4 `- H  {
rspirep <search> <string> [{if | unless} <cond>]  (ignore case)1 \; p6 f# @/ D" L; z  z% [7 K
以上和request 的差不多+ H! P, q+ w. o. S4 S! z; k* C( d+ \
$ C9 s/ Q) t/ L
source <addr>[:<port>] [usesrc { <addr2>[:<port2>] | client | clientip } ] 定义从代理出去的连接的对象,用于限定地址可以访问server9 {) ?1 d; u$ @' T: C

) v9 o8 a9 l4 a! |! e一些timeout% y- r# J3 c, |
% c/ I# a1 L$ P
srvtimeout <timeout> server 处理超时,不赞成设置2 v5 p0 o$ q4 `4 \9 a: B
timeout check                             X          -         X         X
; j; F9 g5 m$ b3 ]timeout client                            X          X         X         -
! l8 m% e7 a+ h# A6 ]: P0 Wtimeout clitimeout          (deprecated)  X          X         X         -
. ~, ]+ _& I9 t% O0 ]" vtimeout connect                           X          -         X         X
+ x5 {7 A, C, R$ w+ Utimeout contimeout          (deprecated)  X          -         X         X& c/ B5 A0 f3 M: n' A  [, Z
timeout http-keep-alive                   X          X         X         X4 U2 z. n3 h* {5 D& ?+ H4 W7 a
timeout http-request                      X          X         X         X
. K  u" m/ Q. G/ L, W$ A1 Etimeout queue                             X          -         X         X9 J5 {6 o/ V* d* ?0 N
timeout server                            X          -         X         X
: H# W- n. }1 y* @! Ftimeout srvtimeout          (deprecated)  X          -         X         X
  J9 b* n/ E( j3 O& vtimeout tarpit                            X          X         X         X
! t* N4 C/ ]: K: h. O" J4 t
/ Z( ^- T% P9 k2 s: C: P9 [& _. _
* }( t% J. D+ M4 W3 fstats auth <user>:<passwd> 监控统计的帐号和密码7 q% I  S) A( t) p1 N
backend public_www
4 D# I, {1 t( P3 Cserver srv1 192.168.0.1:80
2 g+ ?$ l- ?  Xstats enable5 m! D1 ~) S( A
stats hide-version: z; s- M" D/ ?- k; C
stats scope   .+ W( I0 n6 e5 ]/ n# h6 n5 g
stats uri     /admin?stats
, y5 {& ~' Z: x# g* Kstats realm   Haproxy\ Statistics
$ y! F9 s3 v2 i! m7 o! Gstats auth    admin1:AdMiN123
$ t8 Z" b; b8 `* @stats auth    admin2:AdMiN321
: i2 ]2 \) r3 \1 x4 [
% g1 X! S$ A9 @# internal monitoring access (unlimited)
) i% ~' R1 c2 x8 }2 Mbackend private_monitoring8 x3 v7 }7 k% K) ]7 C
stats enable( I8 X/ J) z1 z2 a2 @, [
stats uri     /admin?stats
" G% p+ k  B" q; estats refresh 5s
- p' l. e" W  y$ i1 w  f1 N
1 F' n& C) P* X还有很多参数,以上能用到的也没有几个,只要满足当前需求就好,对于性能要求高的话,建议把不需要的功能 都关了吧.
====================
HAProxy的配置示例
HAProxy配置中分成五部分内容,当然这些组件不是必选的,可以根据需要选择部分作为配置。4 ^; F7 G/ Z' R' o" @  \
global:参数是进程级的,通常和操作系统(OS)相关。这些参数一般只设置一次,如果配置无误,就不需要再次配置进行修改3 l' a7 j, U! t
defaults:配置默认参数的,这些参数可以被利用配置到frontend,backend,listen组件
$ \/ V% F# J% M1 ^2 Tfrontend:接收请求的前端虚拟节点,Frontend可以根据规则直接指定具体使用后端的 backend(可动态选择)。
7 @6 b! G  v& {8 j2 E! R' Abackend:后端服务集群的配置,是真实的服务器,一个Backend对应一个或者多个实体服务器。9 z/ d( y+ K2 r% C) M8 ^: U3 w3 j
listen:Frontend和Backend的组合体。
下面是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
您需要登录后才可以回帖 登录 | 开始注册

本版积分规则

关闭

站长推荐上一条 /4 下一条

北京云银创陇科技有限公司以云计算运维,代码开发

QQ|返回首页|Archiver|小黑屋|易陆发现技术论坛 点击这里给我发消息

GMT+8, 2026-4-8 12:08 , Processed in 0.060526 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

© 2012-2025 Discuz! Team.

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