找回密码
 注册
查看: 5849|回复: 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代表权重
    - J/ c) n& J4 y  l. y/ ^

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


! V, r! H  y( ^8 \9 f8 j$ \  o

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不记录上级负载均衡发送过来的用于检测状态没有数据的心跳包。

+ o( [9 f; ^5 `! b
BALANCE 选项:
balance source :如果想让HAProxy按照客户端的IP地址进行负载均衡策略,即同一IP地址的所有请求都发送到同一服务
                             器时,需要配置此选项。
balance roundrobin :HAProxy把请求轮流的转发到每一个服务器上,依据每台服务器的权重,此权重会动态调整。最常
                                   见的默认配置。

+ e2 u8 X9 S0 n; Y! B
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 :
4 ]% i) G2 o) k2 z& h1 G5 h$ J
option httpclose
5 \7 A8 |; P: ]5 H) Wno option httpclose
1 q) P+ M- H: i% `# |- p  Enable or disable passive HTTP connection closing   启用或禁止消极的HTTP连接关闭2 ^- J4 B2 W5 s2 p
  May be used in sections :   defaults | frontend | listen | backend
4 U' Q' |4 L5 M5 D4 @1 Q                                 yes   |    yes   |   yes  |   yes$ c2 o+ v0 D' T9 R# q+ M) a7 h
  Arguments : none
; w4 ]7 U* m9 p( p  ) ~  c2 {+ D8 s
  默认的,客户端与服务端的通讯,HAProxy只做分析、日志和分析每个连接的第一个request。如果设置了 "option* {# V/ \5 K' H5 A9 y+ B: `- z
  httpclose" , 则会检查双向的http头是否有"Connection: close",如果没有则自动添加,使每个客户端或服务端在每次传输后,都会主动关闭TCP连接,使HTTP传输处于HTTP close模式下。任何 "Connection" 头如果不是"close",都会被移除。$ g0 W% g% g( K1 g4 s$ O" G  m
) Z0 w  {7 u  z
  很少会有服务器不正确的忽略掉头,即使收到"Connection: close"也不关闭连接,否则就是不兼容HTTP 1.0浏览器标准。 如果发生这种情况,可以使用"option forceclose",在服务端响应后主动关闭请求连接。选项 "forceclose"还可以及早释放服务连接,而不必等到客户端的应答确认。
9 @/ m6 H% q1 m" A" Y) _. {2 q8 S9 f( e0 G6 ]- r& S- C
  这个选项可以设置在frontend或backend上,只要其上可以建立连接。如果同时设置了"option forceclose",那么它比"httpclose"优先。如果同时设置了 "option http-server-close",则会实现"option forceclose"的效果。
option forceclose7 Q' \( f' K& j) Q3 Z2 V; L
no option forceclose
  Enable or disable active connection closing after response is transferred.     启用或禁止response后的主动关闭连接
  May be used in sections :   defaults | frontend | listen | backend( h1 Z$ r" Y7 S6 V( M
                                 yes   |    yes   |   yes  |   yes: \; T$ K( p7 n9 j3 O3 N; [) S2 E6 ?
  Arguments : none
* I8 m- V2 q! H2 T0 x        有的HTTP服务器收到"option httpclose"设置的"Connection: close",也不会关闭连接,如果客户端也不关闭,连接会 一直打开,直到超时。这会造成服务器上同一时段内的大量连接,日志中也会显示较高的全局会话时间。
        此时,可以使用 "option forceclose",当完成响应时,立即关闭对外的服务通道。该选项隐式打开httpclose选项。需要注意,该选项允许解析完整的request 和 response,所以可以很快关闭至服务器的连接,比httpclose更早释放一些资源。
) \6 b' f: C4 f6 |$ n; T, q6 p        如果同时启用了"option http-pretend-keepalive",虽然会禁止发送 "Connection: close"头,但是依然会在整个response被接收后,关闭连接。
4 z, a4 w) v( z" `) H) H- E
5 J+ k" s; S9 Y, b% L2 woption http-server-close5 O: y) `- b% K+ e# z  c
no option http-server-close% m# O  }4 e: B4 W, Q* ]
  Enable or disable HTTP connection closing on the server side  启用或禁止关闭服务端的HTTP连接
0 Z$ o7 H) R) v  May be used in sections :   defaults | frontend | listen | backend8 X8 S1 Y" m4 \! C9 N6 u2 T
                                 yes   |    yes   |   yes  |   yes
9 c7 Y4 ]$ F# t; e' P* Q  Arguments : none* S+ k: ^' g1 j4 J( @3 q
    默认的,客户端与服务端通讯,haproxy 只是分析、记日志,并处理每个连接的第一个请求。该选项设置server端为HTTP 连接关闭模式,并支持客户端为HTTP keep-alive的pipelining模式。提供了最低的客户端延迟和最快的服务端会话重用,以节省服务资源,类似"option forceclose"。还允许无keepalive能力的服务端在keep-alive模式下为客户端提供服务,但是需要符合 RFC2616。需要注意的是,有些服务器遇到"Connection: close" 时并不总是执行关闭,那么keep-alive 则无法使用,解决方法是启用 "option http-pretend-keepalive".
3 [6 G) P- K8 E# y
; V) L* ^2 Z* ^8 A; j' J     目前,日志无法指明请求是否来自同一会话;日志中的接收日期为前一个请求的结束;请求时间为新请求的等待时间;keep-alive request time 存活请求时间为超时时间,绑定 "timeout http-keep-alive" 或 "timeout http-request"的设置。* M8 j9 e" u5 C8 ]. a- Z9 h0 c
     这个操作可以设置在frontend或backend上,只要其上可以建立连接。需要注意的是,这个选项可以与 "option httpclose"结合, 但 "option httpclose"优先级更高,结合后基本实现了forceclose的效果。
( O6 L9 V7 x3 f9 j2 z5 S+ E( I4 d* B
option http-pretend-keepalive (http-假装-长连接)" ?! |* @& W4 o5 J6 ?7 g
no option http-pretend-keepalive
# d8 S' l8 I9 d: K5 K" J  Define whether haproxy will announce keepalive to the server or not  定义 haproxy 与服务器是否是 keepalive 的。8 \& z$ x6 {- H, j
  May be used in sections :   defaults | frontend | listen | backend0 K  B* [' {% o; R& b
                                 yes   |    yes   |   yes  |   yes
4 T+ d8 ?8 {' F2 C, j2 `' n- S  Arguments : none
. m+ l% H" w  m6 U4 K/ A    当声明了 "option http-server-close" 或 "option forceclose", haproxy会在给server的request头中添加 "Connection: close" 。然而有些服务器看到这个头,会返回未知长度的response,并自动避免chunked encoding,其实这是不对的。它会阻止haproxy保持客户端长连接,还会使客户端或缓存接收了未完成的响应,却认为响应结束了。) N9 r- l( K' y/ s& z: Y) ~
    设置 "option http-pretend-keepalive", haproxy会在服务器端保持长连接,服务端则不会出现前面的问题。当 haproxy 获取了完整的response, 才会以类似forceclose的方式关闭服务端。这样客户端得到一个普通的响应,连接也在服务端被正常关闭。# b; t* t0 I: q$ T5 p; M5 I, I$ g2 s
    建议不将其设为默认值,因为大部分服务器会在发送完最后一个包之后更高效的关闭连接,并释放缓存,而且网络上的数据包也会略微降低整体的峰值性能。但是启用该选项,haproxy会略微少做一些工作。所以如果haproxy在整个架构中是个瓶颈,可以启用该操作,以节省CPU。
3 Y0 O' ?7 ~+ N) p7 c- Y$ r, V, O' z$ D9 C# T5 l- h% P
     这个选项可以设置在frontend或backend上,只要其上可以建立连接。这个选项可以与 "option httpclose"结合, 使服务端keepalive,客户端close,但并不建议这样做。
7 |; e* J; N: G9 _" a1 B
balance <algorithm> [ <arguments> ]$ E' k2 ]/ t( {4 Y* Z7 p6 z
balance url_param <param> [check_post [<max_wait>]]
- @. ^2 y7 r5 x- d- |  定义选择后端服务的负载均衡算法
; O4 @3 W3 c2 f# f  May be used in sections :   defaults | frontend | listen | backend! I# D$ e4 t: h8 S* [, Z: i$ X/ m: K
                                               yes   |    no    |   yes  |   yes, \' Z/ h& i+ H* V; {1 z# H
  Arguments :9 k8 q$ w: q8 N7 U! K" H
    <algorithm> 是负载均衡时选择服务器的算法,没有持续信息时可用,或连接重定向到另一个服务器。<algorithm> 可以是以下几种:  c0 p; a: N# B  i  X- j
      roundrobin  每个服务器根据权重轮流使用,如果服务器的处理时间平均分布,这是最流畅和公平的算法。算法是动态的,对于实例启动慢的服务器的权重会在运行中调整。每个backend的活动服务器在设计上限制为4128个。在一些大的群里面, 当服务器很短的宕机后恢复回来,有时会有几百个请求被重新整合到群当中,并开始接收处理。尽管很少发生,但是很正常。这也说明了有机会监视它们,所以不必担心。* K# d) g0 q$ \# E
# Y1 U8 @' E# i4 e( Z8 C
      static-rr  每个服务器根据权重轮流使用,类似roundrobin,但它是静态的,意味着运行时修改权重是无效的。另一方面,它对服务器的数量没有设计上的限制,服务器启动后便会立即进到群中,整个分发方案会重新计算。这会略微降低CPU的运行(约1%)。( k. ]* j- b' P- T) R5 Q

& g) H# m3 K. n" l& M3 \; D      leastconn  连接数最低的服务器优先接收连接。Round-robin用于负载相同的服务器,使每台服务器都被使用。leastconn建议用于长会话服务,例如LDAP, SQL, TSE等,而不是很适合短会话协议,如HTTP。算法是动态的,对于实例启动慢的服务器的权重会在运行中调整。
, }& g; U& I# `8 p' z: Y. u( z* M1 m5 O6 i6 H$ [- y9 h6 W+ K
      source    对源IP地址进行哈希,用可用服务器的权重总数除以哈希值,根据结果进行分配。只要服务器正常,同一个客户端IP地址总是访问同一台服务器。如果哈希的结果随可用服务器数量而变化,那么有的客户端会定向到不同的服务器。该算法一般用于不能插入cookie的TCP模式。它还可以用于广域网上,为拒绝使用会话cookie的客户端提供最有效的粘连。该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是算法会根据"hash-type"的变化做调整。( d6 V" t& u* H5 Y2 H
5 s* m/ g$ E$ R
      uri        对URI左端(问号之前)进行哈希,用可用服务器的权重总数除以哈希值,根据结果进行分配。只要服务器正常,同一个URI地址总是访问同一台服务器。一般用于代理缓存和反病毒代理,以最大限度的提高缓存的命中率。该算法只能用于HTTP后端。该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是算法会根据"hash-type"的变化做调整。! V  Q5 l: P1 K8 t2 H
                  算法支持两个可选参数"len" 和 "depth", 都是后跟正整数。“len”参数指定算法只处理URI从头开始的字符数,据此计算哈希。因为大多URI以"/"开头,所以"len"最好不要设为1。"depth" 参数指定URI中最大的路径深度,据此计算哈希。请求中的每个斜线为一级。如果同时声明了这两个参数,则截取URI时必须同时满足。8 n* r6 Y" F2 B6 ]; R2 c: S5 L6 X
- q: a+ H3 M% }, T8 ^# V9 M
      url_param  在HTTP GET请求的查询串中查找<param>中指定的URL参数。
- d0 u+ k' V- U5 R                 若使用了修饰符"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被用了,则只能检查第一个块。如果参数值被块边界分隔开,则只能随机均衡负载了。
0 L. t; u' l6 J% [9 w9 q; p                  如果参数后面跟着 ('=') 和一个值,则可以根据这个值进行哈希,用可用服务器的权重总数除以哈希值,根据结果进行分配。3 l- c8 F2 C; T7 \5 J5 p0 K
                  还可用于跟踪请求中的用户身份,只要服务器正常,同一个用户ID的请求总是发给同一台服务器。如果没有参数或参数没有值,则使用轮询算法。该算法只用于HTTP后端。该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是算法会根据"hash-type"的变化做调整。3 u, a% P' q/ R- h

$ q( _4 E( m6 A& x" o% r      hdr(name)  在每个HTTP请求中查找HTTP头<name>。与ACL函数'hdr()'一样。括号括起来的头名字不区分大小写。如果缺少头或头没有任何值,则使用roundrobin算法代替。                  
' b: B+ `8 Z% u+ U: V% L# j: m                       启用参数'use_domain_only',哈希算法将只用于一些类似'Host'的特定头的主域部分。例如主机值"haproxy.1wt.eu",则只考虑 "1wt"。该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是算法会根据"hash-type"的变化做调整。
# V0 z. {! m6 A& q/ S4 T& [" v3 e8 ?
      rdp-cookie( ^' }# G. Y6 ^( }  T/ M1 A
      rdp-cookie(name)& s* |* t% ]! Y1 f# m
                  为每个进来的TCP请求查询并哈希RDP cookie <name> (或“mstshash”如果省略) 。与ACL函数 'req_rdp_cookie()'一样,name不区分大小写。该机制用于退化的持久模式,可以使同一个用户(或同一个会话ID)总是发送给同一台服务器。如果没有cookie, 则使用roundrobin算法代替。# V* _* A1 q- h0 B/ s% `5 c. D6 o
                  必须注意该声明要生效,前端必须确保在请求缓冲中已经有RDP cookie,所以必须使用规则tcp-request content accept' 和ACL 'req_rdp_cookie_cnt'相结合。
, K. H0 x- ^0 x$ U- P                  该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是算法会根据"hash-type"的变化做调整。
1 M/ X/ N4 z4 n! I" V8 l
! x* a3 ?& w' ^( @$ M" |4 T    <arguments> 是用于一些算法的可选参数列表,目前只有"url_param" 和 "uri" 用到,例如:
( o9 V& G8 G( b' Z( U                balance uri [len <len>] [depth <depth>]" j6 i8 `" [- y- v- H
                balance url_param <param> [check_post [<max_wait>]]
, o( j$ t  z$ z6 w- P7 `! T; c( }* b/ U4 d  l& w6 \
  如果没有其他算法、模式或选项的设置,后端的负载均衡算法默认为roundrobin。每个后端只能设置一种。
/ Y4 Y* z2 {7 i* x+ g2 z  Examples :3 X5 d, y# R- h) N  k  }( k
        balance roundrobin
7 C* p+ l' J' y% l1 O  t        balance url_param userid  V' u- X0 C8 K8 D. h
        balance url_param session_id check_post 64/ k8 w8 f8 t( I/ ^- e6 I  _6 W9 a( }
        balance hdr(User-Agent)! k: o& N$ J. w* |( L4 ?) M* h4 N
        balance hdr(host)+ B- O. s9 v! v3 U( t' A. H: }2 t
        balance hdr(Host) use_domain_only: v; ~" t! x( O  b

' g2 V$ [& |: c7 ~& {# d' @9 t' X* ^  注意:  以下的警告和限制是使用“check_post“扩展和”url_param”所必须考虑 :
- ~" R8 J6 [5 A% b    - 所有POST请求都要考虑,因为在包含二进制数据的体或实体中,没有办法决定是否会找到参数。因此需要另一种方法,限制POST请求的体中不含有URL参数 (见 acl reqideny http_end)
    - 大于请求缓冲大小的 <max_wait> 值是没用的。在build时设置缓冲大小,默认16KB。1 E2 h% T& T- z7 I* C( h
    - 不支持Content-Encoding, 参数搜索会失败;负载均衡会改用 Round Robin。. `7 U0 Q% y7 I$ \" Z- }
    - 预计: 不支持100-continue,负载均衡会改用 Round Robin。3 |, M; g& Q8 p0 q& S' C+ s
    - Transfer-Encoding (RFC2616 3.6.1) 只在第一个块中支持。如果在第一个块中的参数值不完整,选择的服务器就没有定义。(实际上取决于在第一个块中定义的有多小)0 w: A9 [) t5 b: ]3 v2 y
    - 该特性不支持生成100, 411 或 501 响应。
/ Q- g" ?0 K' H* F    -  有的情况下,需要"check_post"只是要查看整个消息体的内容。检查一般会停在任意数量的空格(LWS: linear: I( x. c) f9 y: t. j& p1 ]
      white space)或控制符上,表示这可能是一个URL参数列表。这可能不是一个关于SGML的类型消息体。
+ L4 a( S( }0 X% r; V
& p3 [/ y- v( `2 s1 s( P8 o- s1 r8 I  See also : "dispatch", "cookie", "appsession", "transparent", "hash-type" and "http_proxy".
( T4 }1 |3 I3 k) l$ |
hash-type <method>8 n& O; b" p  q5 A3 @+ k
  将哈希映射到服务器的方法。Specify a method to use for mapping hashes to servers$ Y/ J9 J, Z/ ~
  May be used in sections :   defaults | frontend | listen | backend' j7 |  x2 |6 I0 C& V0 Y$ _. W
                                               yes   |    no    |   yes  |   yes4 m2 L0 c7 n& I: b/ B: [( C
  Arguments :" k8 L& }" ~  X! ?4 o
    map-based  哈希表是包含所有在线服务器的静态数组。哈希结果很平滑,并考虑了权重,但是会忽略服务器启动时的权重变化,也就是说不能慢启动。另外,服务器是根据数组中的位置所选择的,所以服务器数量变化时,大部分映射也会变化。当一台服务器启动或关闭,或服务器加入到群中,大部分连接会再分配给不同的服务器,这对有缓存的实例会比较麻烦。
    consistent  哈希表是由每个服务器构成的树,会在树上查找哈希Key,并选择最近的服务器。这种哈希是动态的,支持服务器启动时修改权重,所以可以慢启动。它有一个好处是当服务器启动或关闭时,只有其本身的关系被移除,当服务器加入群时,只有一小部分的映射会被重新分配,所以是一个比较理想的支持缓存的算法。但是根据其原理,算法不会非常平滑,有时候必须调整服务器的权重或ID来获得更平衡的分布。要保持多次负载均衡时的相同分布,服务器ID是绝对不能变的。(roloand:haproxy根据服务器的ID初始化其哈希值)+ u$ N1 B6 Y! _# c4 w, ^" V
   默认值是"map-based",建议大部分情况下使用。
* I, k% L0 l" Y/ N
6 U' O( \* \  o- q' Q, L" h  See also : "balance", "server"

+ [+ m: e- K& s% S. i8 [% mdispatch <address>:<port>
0 p& n$ F! J% K5 |& }4 N7 o; U  设置一个默认的服务器地址
# m( k! o# t. s  j+ p4 P1 ~  May be used in sections :   defaults | frontend | listen | backend3 Y' f! s. {' E1 F! r; C
                                               no    |    no    |   yes  |   yes
5 N0 {$ L' J* v0 [3 S  Arguments : none
3 |$ D% H3 Q, @% u; V    <address> 默认服务器的IPv4地址,也可以是主机名称,名称只在启动时解析为IP地址。0 ?" ]5 N8 c6 Z" h0 U' d
    <ports>  端口号,所有连接都会发送给这个端口,但是不允许像其他服务器一样使用端口偏移(port offsets)。
   "dispatch"关键字指定了一个默认的服务器,用于无可用服务器时的连接的处理。过去常用于前传非持久连接给后备负载均衡器,由于定义简单,还用于简单的TCP中继(TCP relays)。 建议对于明确的连接处理,应使用"server"直接声明。
====================
一:Global parameters: K# g; I3 [- x  \
* Process management and security7 d8 P! P3 |$ Y( S2 i5 ^. w2 E
- chroot 改变当前工作目录2 r) d% @$ d2 E, m; j5 X) K3 L2 w
- daemon 运行方式为后台工作
7 y( M% a6 x6 |8 ?+ m- user - group 工作用户和组
3 h2 @6 V4 e- l-log <address> <facility>日志输出设备) Z; D0 T7 K# H9 ~$ s+ A. v0 t. l& ~& R
- nbproc 创建工作的进程数目" e  A+ b; l* S  q7 \2 V/ @5 X. L& S- B# D
-pidfile pid文件位置
( _& W5 h8 ]; q) k& F' {- ulimit-n 设置每个进程的可用的最大文件描述符" @" g7 V# W8 A' y% @2 R
- stats 创建监控所用的套接字目录
. V& @6 L2 o+ t- node 创建另外一个节点名字共用一个IP地址,用来识别哪个节点在处理流量& z8 z. o) R5 U3 k
- description 描述实例的名称  G( R6 e  n1 L) ]8 y
maxconn <number> 每个进程可用的最大连接数5 k: G2 o7 \3 f3 _: [
maxpipes <number>  每个进程可用的最大管道数. b" w; w% p; F& [
nokqueue  nopoll  nosepoll nosplice  禁用这些功能8 [' M+ Y" Q1 u3 e
spread-checks <0..50, in percent>  health check 的时间间隔
+ F+ P9 D8 J# X0 K6 ~5 F) k% Y- Qtune.bufsize <number>
1 ~3 F& d" b2 t; T  ], vtune.maxaccept <number> / g: p% @* ^; ], K
tune.maxpollevents <number> 7 O! Z. l' `8 a5 E1 d' E
tune.maxrewrite <number>
$ }7 m0 N: C1 y/ f$ F# h% }tune.rcvbuf.client <number>
4 g5 }2 a7 p* M/ jtune.rcvbuf.server <number> : V* U2 z6 [% p' {3 x" F$ Z/ Y
tune.sndbuf.client <number> " I  |# O! o! y0 N4 c8 g
tune.sndbuf.server <number>
5 B6 A0 j4 z/ @0 T9 x% k# R以上凭字面理解吧6 A5 t& _7 T; T0 {
debug  调试模式,输出启动信息到标准输出
# n% }7 {0 V. Equiet   安装模式,启动时无输出& m7 G$ k7 i; _' l! E- x

5 A2 f& R+ l. Q4 u, L" v' ?二:defaults 块+ j7 Z8 U( @3 j
作用于其后紧跟的listen块,直至下一个defaults 块,下一个default 将替换上一个块作用于以后的listen
6 e9 n! F2 |+ s- {8 e( ffrontend 块,接受请求的端口组2 F' X8 z2 N& b/ \2 r
backend块,后端处理的server 组
) |1 b9 z' [- f* r9 ?/ Dlisten块,frontend和backend 块的结合
- o+ `+ U: }* Q1 z! K5 _; |7 m) X0 B8 S, G
三:常用配置命令1 ?1 ]0 U- O# r" n: ~1 Z" b
5 l- V4 b5 j" z1 J
balance <algorithm> [ <arguments> ]
+ T+ V. A, N5 x# ubalance url_param <param> [check_post [<max_wait>]]   负载均衡模块设置
; M6 F% u  S, a' B2 p
2 r  ~* [. p) AExamples :8 T5 u& G) u9 Q! f9 V; m! G! {
balance roundrobin
6 s" i& ?& D  d0 ?, Q+ Sbalance url_param userid  . C% l4 B. Y( W
balance url_param session_id check_post 64 * ?+ k5 ^8 a' @/ |) M
balance hdr(User-Agent) . Z0 `# g+ f# T1 w& K
balance hdr(host) 2 e8 J# J: K8 N7 U  |
balance hdr(Host) use_domain_only 3 B  f0 k7 v! y2 G& X. m; k1 h0 H

% \+ |  X+ v6 rblock { if | unless } <condition>  在7层阻止访问8 n( t1 A! ]7 z  _
Example: ; X# t' \$ Y& k' v
acl invalid_src src 0.0.0.0/7 224.0.0.0/3  acl定义和squid 很像
+ ^* h6 I$ Y7 {; ?1 F9 Cacl invalid_src src_port 0:1023
. j$ G; Z# v1 S& U% h, }" e3 N9 Gacl local_dst hdr(host) -i localhost ( u' U6 V2 j# Y8 O
block if invalid_src || local_dst
) a$ J: p$ L5 g- ]  y+ n' }: V+ p7 X7 a( O
capture cookie <name> len <length>  在请求和回应包中捕捉记录指定长度的cookie,name 为cookie的开头几个字母
+ L8 X4 _( w& }  o5 F& e$ b& Z* x" j9 v
Example:, w; K1 W. B- E% A& W
capture cookie ASPSESSION len 32
" q8 m+ Z) `& b- n. r# l" @2 p; R  R
capture request header <name> len <length>
  }9 U) [" V) S9 M4 Ccapture response header <name> len <length> 同上9 D8 Q; z' K, C4 U. I1 r
2 o, y! R2 E: H+ N- n& x
clitimeout <timeout> (deprecated)
# |# U* o# m: @/ E7 Econtimeout <timeout> (deprecated)  客户端超时时间,不赞成设置
. O& a' w0 ~% w# R) I  d( S$ h$ t; v; H) W/ |0 k
cookie <name> [ rewrite | insert | prefix ] [ indirect ] [ nocache ] [ postonly ] [ domain <domain> ]*   允许持续的基于cookie 的后端连接
* {' x! \4 R  T( q% \6 q' d1 m. i7 p7 f
default_backend <backend> 默认应用的后端3 @" x* P; k% B7 F7 S

5 U( c3 h5 Y3 Y; p; aExample :   H! I$ a/ T5 K8 \/ Y% `. m. _
use_backend dynamic if url_dyn ' ]6 i3 U' y: a
use_backend static if url_css url_img extension_img
% V/ v) q8 ]8 X8 C  _default_backend dynamic    当没有匹配时就用dynamic0 j) C& h" _! q- l
4 `* s- ]4 H6 c+ {
errorfile <code> <file> 定义出现错误的代码的返回页
  k" B! S; P) w$ r8 {Example :
" X' V& X: _, @errorfile 400 /etc/haproxy/errorfiles/400badreq.http
6 H: `( x" s# D- t# R7 M+ s6 uerrorfile 403 /etc/haproxy/errorfiles/403forbid.http
7 w* I$ |: B1 ]: l7 Eerrorfile 503 /etc/haproxy/errorfiles/503sorry.http ) ?' ^' j/ |5 b! g3 {

" t0 l$ [7 J7 v* J& P4 G/ |: O
9 b9 u; y2 U7 w6 ?4 l" derrorloc <code> <url> errorloc302 <code> <url>   出错重定向到指定url( S0 f% L6 k3 ^
force-persist { if | unless } <condition>  在特定条件下,强制继续连接down 掉的服务器后端6 N$ [" q6 R( W7 F7 U9 g
fullconn <conns>  定义后端组的最大连接数: L, y& X: c! K; H# [5 O+ M4 N# T
grace <time>  haproxy停止后,再持续多长时间用于处理连接0 Y6 Y# X$ }' k! l1 k5 H8 e
http-check disable-on-404  如果后端检测返回404,将不再把后端计入负载均衡
- t4 X0 }/ O: }' V9 v- U8 Vhttp-check send-state 允许haproxy 发送 X-Haproxy-Server-State
- ^' l" H6 `: D- e: u8 f$ jhttp-request { allow | deny | http-auth [realm <realm>] } [ { if | unless } <condition> ]   七层访问控制7 K* D8 R$ J5 [! ~  H1 A  g/ O
Example:
/ v( C/ [. `9 V6 k" n! q8 I" w/ vacl nagios src 192.168.129.3
5 v4 `# X/ Y& F7 L5 `3 C  C9 P" `& \acl local_net src 192.168.0.0/16
+ o) w, w) ^1 H: i4 Kacl auth_ok http_auth(L1). ]  \  R8 L: ~8 y; \; n9 A- I- t
! T% A* E) N% E- u2 Z9 k: ~
http-request allow if nagios
" w% |4 C6 o7 R" O5 A1 c. B$ Mhttp-request allow if local_net auth_ok
0 {% N& b; u4 F- hhttp-request auth realm Gimme if local_net auth_ok3 J8 f9 L( o  L9 x- O6 u, @
http-request deny# U5 ^! ^6 f" Z
6 d+ V: r0 b) }* z( z  Q
Example:' A% Z( s% ^, K' C7 w5 y! n6 ~) k
acl auth_ok http_auth_group(L1) G1
8 `) h2 v2 @8 D3 ^, k
3 g6 p! ~5 N7 D  w, @" d! thttp-request auth unless auth_ok" V6 ]. |) b. s' u4 o9 y, m4 P

: I7 q; n" `  A8 [mode { tcp|http|health }   设定启动的实例的协议类型8 f6 U# a3 M' F. Y4 a* F/ h
monitor fail { if | unless } <condition>  监控失败条件设置6 k' i& F! w7 T; y

0 D. U" I  |6 ?option abortonclose 丢弃由于客户端等待时间过长而关闭连接但仍在haproxy等待队列中的请求
4 B/ s# O7 ^0 T; c7 ]: q$ x: Goption accept-invalid-http-request  接受无效的http请求,建议关闭(开启可能有安全隐患)
& F* e6 ]. {- e3 y! joption accept-invalid-http-response 接受无效的response ,建议关闭6 m% T# K: ~8 f4 e5 v
option allbackups  应该是后备服务器,如果正常的后端无法使用,就使用这些后备的设备,balance方式还是用原来的,没有优先的选择,常用来提供错误的页面9 o$ {" P' j; u* J( b! N$ ^2 c
option checkcache    分析后端response,阻止可缓存的cookie,它对response 进行严格检查,包括"Cache-control", "Pragma" and "Set-cookie" ,查看在客户端代理那边保存是否有风险,如果这个允许的话,符全以下条件 的response 将被允许,其它的将被阻止。5 s. z; r! m. g7 J$ S& ^
- all those without "Set-Cookie" header ;! O7 s1 D8 g0 @) ~0 |$ m/ a) S
- all those with a return code other than 200, 203, 206, 300, 301, 410,% a$ N3 u1 A9 P5 e
provided that the server has not set a "Cache-control: public" header ;$ `" ~) B4 S& A
- all those that come from a POST request, provided that the server has not
8 h9 W, K2 T/ U5 {set a 'Cache-Control: public' header ;
! F0 q% C3 f: ?/ N  F8 O: c5 s- those with a 'Pragma: no-cache' header" I& E( `( @! r/ ]
- those with a 'Cache-control: private' header. o4 h& p8 V) w" u3 w; g
- those with a 'Cache-control: no-store' header  {8 a$ w8 U# U2 l, f
- those with a 'Cache-control: max-age=0' header0 j5 b: i# L/ I* q1 u
- those with a 'Cache-control: s-maxage=0' header
# \9 G  c7 Q' i$ D: {7 b- those with a 'Cache-control: no-cache' header2 l3 {! I1 _: y& R4 j# b) I
- those with a 'Cache-control: no-cache="set-cookie"' header) t) v* v, G* _3 }! z) I  r
- those with a 'Cache-control: no-cache="set-cookie,' header
; f4 w" o4 g8 y; Y(allowing other fields after set-cookie)
& k9 V( ?- ^' |5 |/ L/ h. l9 F( q5 F7 h# c+ Z+ q$ A7 J- i
option clitcpka   是否允许客户端发送tcp keepalive 包,这个和http 的keepalive 没有关系/ B% ]& J3 }3 P* U5 H3 {
option contstats   允许连续的流量统计更新
, C4 G% o, M- y/ n4 @option dontlog-normal   开启正常连接的日志
. Y! f& l7 j6 }2 a) Hoption dontlognull   记录空连接1 {4 m) H  |- m0 a4 Z/ L
option forceclose  允许关闭session 在后端把response 发送后
5 b) h: V* b8 n' w% {option forwardfor [ except <network> ] [ header <name> ]        允许在request 中加入X-Forwarded-For header 发往server
0 }3 @0 Z$ I* H! ~$ Zoption http-pretend-keepalive    定义是否haproxy要宣布同server keepalive5 _. v( a2 I8 o; Q9 ~
option http-server-close   是否开启在server 端 connection closing
% h' T- {5 a) z4 O0 ^0 Uoption http-use-proxy-header    用non-standard Proxy-Connection 替换 connection
. d: _/ o+ ~1 L. ]8 K& |; u7 \2 J! i, \9 B9 O8 m

% r  K( L  X2 goption httpchk <method> <uri> <version>  允许用http协议检查server 的健康
9 B7 ?1 z2 x& C1 HExamples :+ ?0 t* }( i' _5 E6 J7 ~' ]- z
# Relay HTTPS traffic to Apache instance and check service availability) `% ~6 E, U8 i5 }8 q! G: Q
# using HTTP request "OPTIONS * HTTP/1.1" on port 80.
# C5 q. E7 u& Sbackend https_relay" @! ~4 M9 C1 S! c+ o' H
mode tcp1 o8 O8 G6 L; e, p, q3 N
option httpchk OPTIONS * HTTP/1.1\r\nHost:\ www+ K2 U+ J/ ]4 r% g3 D
server apache1 192.168.1.1:443 check port 80
& r5 ?) H9 D. t. |
. z2 s, P) g* o: q: [3 hoption httplog [ clf ] 定制日志格式
% }; E# T, a- X+ }- \& f$ l0 _option http_proxy  开启http 代理模式,只有最基本的代理功能
1 u* H4 [' h0 V  f+ z; f6 ]4 _7 Aoption ignore-persist { if | unless } <condition> 在某条件下拒绝持续连接,适用于对静态文件的负载均衡
' |& }& Q* J" G4 Koption independant-streams  启用双向超时处理,如socket 的read 和write : H* X9 q! Y( {8 P6 `
option log-health-checks   记录健康检查日志; o8 `$ k; E, p5 y2 a# @
option log-separate-errors   对非完全成功的连接改变日志记录等级" k9 y. t5 ?; o: |8 T6 M. ~
option logasap   大传输大文件时可以提前记录日志
2 E4 O9 U0 R0 t/ O/ l/ I/ X/ Foption mysql-check   mysql 健康检查4 `8 `. {! i& N; w3 `5 ]! o, d
option nolinger  清除肮脏连接后开成的tcp 状态及占用的资源,不过并不是强列要求你用这个选项,当然如果你有thousands of FIN_WAIT1 sessions on your system ,那肯定得用了
, f+ z( I5 y- Y) {% Voption originalto [ except <network> ] [ header <name> ]   允许在requests中加入X-Original-To header 发往server/ ?% `4 N& @0 M  L9 Z* i7 f
option persist     强制将http请求发往已经down 掉的server
* }5 {+ X# |( I. I# goption redispatch   是否允许重新分配在session 失败后7 C! v! G" o/ m( c0 F4 o
option smtpchk   smtp 检查  P" f1 w( L$ `) I7 U
option socket-stats  允许对单个socket进行统计
- E3 ?9 S! R: e) y( P0 d; ^0 o9 Ioption srvtcpka  是否允许向server 发送keepalive
8 o6 E& j6 l7 x' Ooption tcpka 是否允许向server和client发送keepalive8 |; `; V; [3 \7 B9 c9 }; C3 q
option tcplog  允许记录tcp 连接的状态和时间
. a/ }  p( n6 D0 x+ j1 N1 C* aoption transparent   允许客户端透明代理
2 b4 I# ]1 T  S$ D& k. K( Grate-limit sessions <rate> 设置frontend 每秒处理的连接的上限,如果到达上限就停止建立新的connection
0 O$ W' L3 i4 D; i. l( [
# Q7 P2 X# Y) O% |# Y. Dredirect location <to> [code <code>] <option> [{if | unless} <condition>]5 T4 X+ z8 e9 f# ~  q
redirect prefix   <to> [code <code>] <option> [{if | unless} <condition>] 重定向,相当于rewrite9 z. S- [% G# ]& a! s' L* |

- ?* U6 z/ R5 L- B0 r9 j) C+ SExample: move the login URL only to HTTPS.
# }4 v& E" U' t/ iacl clear      dst_port  80
$ k3 u! U1 A$ `* }& v+ p" Macl secure     dst_port  8080
# f9 w! d! J0 u7 d  O% }9 Jacl login_page url_beg   /login
5 W; W: C, x$ |0 tacl logout     url_beg   /logout" z# S& O. g. H" d3 R% F( i
acl uid_given  url_reg   /login?userid=[^&]+4 z- Z% I: h9 O
acl cookie_set hdr_sub(cookie) SEEN=1
2 c" o& U7 C) N6 J: T- x; E; Y! r7 L( B. v2 C( f0 `# N; F
redirect prefix   https://mysite.com set-cookie SEEN=1 if !cookie_set+ Y" h+ V/ n8 Y$ F, I7 ^4 ?, g
redirect prefix   https://mysite.com           if login_page !secure/ q! i3 v0 q- |$ m) l0 v* F
redirect prefix   http://mysite.com drop-query if login_page !uid_given! [! ]' `5 I7 ^( w0 F2 q0 n
redirect location http://mysite.com/           if !login_page secure: W$ c# @: U% j' T& d0 I
redirect location / clear-cookie USERID=       if logout  B6 O3 G% n* D8 R
+ |+ i: e1 O! p: W( `
Example: send redirects for request for articles without a '/'.
  T3 N1 y) \6 o( H& oacl missing_slash path_reg ^/article/[^/]*$
+ N  M4 z: X2 y9 ^1 mredirect code 301 prefix / drop-query append-slash if missing_slash% X  \8 {, y, _" u0 r
redisp (deprecated)9 v, N4 m3 {9 ^) `
redispatch (deprecated) 开启session 重新分配在connection连接失败后,不赞成启用
7 Y) W# m  g! I" b, nreqadd  <string> [{if | unless} <cond>] 在http请示的末尾加上string
: Y4 d( U/ c- o, Y) w; ]( E1 ]3 ~6 }9 L# Z
Example : add "X-Proto: SSL" to requests coming via port 81
) Z: Q! x) m8 F3 G) h/ dacl is-ssl  dst_port       81* L* T. Z) y6 B/ I$ x; q) f8 [; R
reqadd      X-Proto:\ SSL  if is-ssl
0 V' C5 y+ U% _: |& O0 H( r
! x# N( Q" F4 treqallow  <search> [{if | unless} <cond>]& E7 ^' Q9 t& w* N5 P" I
reqiallow <search> [{if | unless} <cond>] (ignore case)    request 请求访问控制9 }9 o2 J' T- {- ^
. i/ O% Q- G" {" Q
Example :& {& a% F" B2 L+ a: Q7 o( L
# allow www.* but refuse *.local
! d, z" B8 n$ d, |  m8 S. c: Xreqiallow ^Host:\ www\.
8 [& K! F0 s7 g! U" K# Preqideny  ^Host:\ .*\.local
- s2 A. b# ?% ^% ]& Q1 @' q2 o; _0 X9 D% u  \7 t( \# d
reqdel  <search> [{if | unless} <cond>]: U: H, V9 u: L+ {4 ?  j# Q0 |
reqidel <search> [{if | unless} <cond>]  (ignore case) 删除请求的head 中的内容+ y. w/ a% ~& W1 F! L
& M! k$ j" z2 {
Example :
/ k8 K8 R* K& l8 p7 G, o  X* l- v& N# remove X-Forwarded-For header and SERVER cookie5 v" {; N) d- d! {
reqidel ^X-Forwarded-For:.*
2 a& d  }3 k0 b3 G! n; Qreqidel ^Cookie:.*SERVER=
, y( j( p" G4 i' H2 L" V$ a% n- T! N

; W$ @! h% X. P5 ~0 ~  f+ Breqdeny  <search> [{if | unless} <cond>]+ c3 h5 C1 O% e5 s: b1 a9 B
reqideny <search> [{if | unless} <cond>]  (ignore case) 拒绝访问' g1 u1 M( _& p: d# Q

/ f1 Y% f3 Y2 m1 N5 U9 \' Sreqrep  <search> <string> [{if | unless} <cond>]
( s2 H8 ]3 o2 [) ^( d& hreqirep <search> <string> [{if | unless} <cond>]   (ignore case)  request 请求替换
: A/ j3 p& s, H' x, B' a' L* T  gExample :
" g% T! D* o! S7 U# replace "/static/" with "/" at the beginning of any request path.
4 h: u% s8 ~* ^( |+ preqrep ^([^\ ]*)\ /static/(.*)     \1\ /\2
) w# s: \- L( e1 |! Z# replace "www.mydomain.com" with "www" in the host name.
3 r7 X* ^/ j9 p1 ureqirep ^Host:\ www.mydomain.com   Host:\ www
& F5 D) b: H" d. [% {% |- }  c+ }+ F- |; {7 D& B9 x* I
reqtarpit  <search> [{if | unless} <cond>]2 U9 K) b* X+ ^2 e* G) O% i
reqitarpit <search> [{if | unless} <cond>]  (ignore case) 阻止http请求中的某些信息
( t. N. l6 t& W" G/ y2 a3 w. G% W
Examples :+ p: c+ \: ^9 ^7 {* x8 g
# ignore user-agents reporting any flavour of "Mozilla" or "MSIE", but
  y( o4 D$ O6 \! ?6 o# block all others.4 b  L9 o% i. O" x$ Z. r& r
reqipass   ^User-Agent:\.*(Mozilla|MSIE)' t0 v6 u, H& V9 L& a
reqitarpit ^User-Agent:) C/ a; t5 ?1 k8 q1 Q" w$ Y

* g7 _/ |7 X+ g5 e, G# block bad guys) @- s# T4 m* y+ F( q9 |& B: s
acl badguys src 10.1.0.3 172.16.13.20/28
8 A# s# x7 r5 B  v: treqitarpit . if badguys* ~1 O" \: A4 t* N2 H8 h3 Y/ F
( j8 b6 a! M7 N4 J9 j6 P, d
retries <value> 当对server的connection失败后,重试的次数6 P, `% |- ~- Q( u$ `9 l# H+ t5 f! y
rspadd <string> [{if | unless} <cond>] response 增加信息6 D& _+ e1 w  k4 H- M
rspdel  <search> [{if | unless} <cond>]
4 c* H8 Q3 }) {8 j0 h( G+ Xrspidel <search> [{if | unless} <cond>]  (ignore case)2 L) R- a3 }% N$ O* S) k
rspdeny  <search> [{if | unless} <cond>]
% {; I- X2 J- Hrspideny <search> [{if | unless} <cond>]  (ignore case)! c0 X, T9 {- n: [1 k% Z) H9 S
rsprep  <search> <string> [{if | unless} <cond>]
% G5 W' N+ T( j% K2 k( [* E6 |rspirep <search> <string> [{if | unless} <cond>]  (ignore case)  x1 K) A. F" _- v- c- Q
以上和request 的差不多
7 u8 J+ B! g1 u# m' ^  ~
/ `) i* N1 o% }source <addr>[:<port>] [usesrc { <addr2>[:<port2>] | client | clientip } ] 定义从代理出去的连接的对象,用于限定地址可以访问server! K$ D7 m& ?  x  G5 `7 x

* y3 `+ k- F1 O, W一些timeout7 g/ m' P  ^# w# k1 S
4 Q3 C4 ^8 I* O* O* `
srvtimeout <timeout> server 处理超时,不赞成设置
; v: `7 V6 K$ B/ ^1 `3 ztimeout check                             X          -         X         X6 o' y0 i% R+ ]: H* X& ?
timeout client                            X          X         X         -
  ^3 s6 q7 m5 B+ S3 Ctimeout clitimeout          (deprecated)  X          X         X         -
" h' x6 r4 E9 o  o) c8 a3 atimeout connect                           X          -         X         X. }$ D7 J/ a9 Q) ~: B$ _
timeout contimeout          (deprecated)  X          -         X         X
  r; x* P7 ]9 @  V' Q8 L* f3 u' H; xtimeout http-keep-alive                   X          X         X         X) f  a. V& D4 s  L" r/ Z
timeout http-request                      X          X         X         X$ [7 }- j' Z3 ^1 h2 ?8 D
timeout queue                             X          -         X         X
7 @3 n/ z0 c; ?" E8 t' @timeout server                            X          -         X         X: d( R0 B+ ^  _# W0 f0 u
timeout srvtimeout          (deprecated)  X          -         X         X$ F% O0 _" B4 q
timeout tarpit                            X          X         X         X/ D: {0 g! Z1 A$ z

! V; y! i( I0 Q* [: e, K1 A8 \9 Y9 k- x# G, a
stats auth <user>:<passwd> 监控统计的帐号和密码6 v8 e" Z  V* C  F4 t
backend public_www5 v6 c- x2 H3 S1 `, r2 a
server srv1 192.168.0.1:80% |- ?; e% C7 f9 D9 u* l' |# @7 q
stats enable  }4 J' R1 E" n6 `$ ^4 M
stats hide-version
! F# c& X' ~" w( K: V% ]( x5 e6 f) \stats scope   .
, k" K& u! V0 ]6 j1 P8 ?, Ustats uri     /admin?stats
* i& f+ `, Z. E! b: }stats realm   Haproxy\ Statistics
' _8 a3 P5 P3 ~/ b% Q/ Ystats auth    admin1:AdMiN1238 h/ Q5 S/ b6 S3 g4 m
stats auth    admin2:AdMiN321  u* v8 ?) Q& {
8 S; C! I) ~  o" }% N& `$ [6 ?, W7 e
# internal monitoring access (unlimited); N0 S2 B: Q0 i* K* B  k2 @' n
backend private_monitoring# l) i  M3 U7 i' w" N) P+ z/ U3 b
stats enable
' @% K: p! m6 F2 t' n! Istats uri     /admin?stats; ^" c! u* y* B. p* x7 g
stats refresh 5s
6 G0 a* B( C, ]3 _9 M, B. C0 ^% P" o( j  Y1 s& k- R
还有很多参数,以上能用到的也没有几个,只要满足当前需求就好,对于性能要求高的话,建议把不需要的功能 都关了吧.
====================
HAProxy的配置示例
HAProxy配置中分成五部分内容,当然这些组件不是必选的,可以根据需要选择部分作为配置。
; I( n3 V9 f4 \global:参数是进程级的,通常和操作系统(OS)相关。这些参数一般只设置一次,如果配置无误,就不需要再次配置进行修改
5 I/ @7 F4 V* |+ wdefaults:配置默认参数的,这些参数可以被利用配置到frontend,backend,listen组件
" C. S, C% k. m- \7 D! Q- Ffrontend:接收请求的前端虚拟节点,Frontend可以根据规则直接指定具体使用后端的 backend(可动态选择)。+ [' g* M# i" H+ _
backend:后端服务集群的配置,是真实的服务器,一个Backend对应一个或者多个实体服务器。
, S; N" m+ }1 `* [* Z; zlisten: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 04:30 , Processed in 0.022190 second(s), 24 queries .

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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