找回密码
 注册
查看: 5850|回复: 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代表权重 & t! N# F& a' g+ c0 ~& y$ g; [& y1 l

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

7 q5 \1 x+ i" L+ d" S

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

5 R% \1 `% c4 z' L6 k% C2 N
BALANCE 选项:
balance source :如果想让HAProxy按照客户端的IP地址进行负载均衡策略,即同一IP地址的所有请求都发送到同一服务
                             器时,需要配置此选项。
balance roundrobin :HAProxy把请求轮流的转发到每一个服务器上,依据每台服务器的权重,此权重会动态调整。最常
                                   见的默认配置。

7 p2 M  Z5 z4 g
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 :

1 B+ a  n- T5 |) y( Z6 }- l
option httpclose$ ?* ?5 u/ R7 G& ^/ [3 a& H
no option httpclose
- [* v6 J5 L3 g  Enable or disable passive HTTP connection closing   启用或禁止消极的HTTP连接关闭
+ Y+ `" K/ h8 \  May be used in sections :   defaults | frontend | listen | backend
+ S9 T" |: X8 q3 m/ Q                                 yes   |    yes   |   yes  |   yes
5 ?$ S  V+ M0 L5 G3 s' f  Arguments : none/ l+ m2 M, U3 ~* Y
  
( W- W( [0 w# p! U; O  默认的,客户端与服务端的通讯,HAProxy只做分析、日志和分析每个连接的第一个request。如果设置了 "option
( W% x$ ]/ ^  z# _) C  httpclose" , 则会检查双向的http头是否有"Connection: close",如果没有则自动添加,使每个客户端或服务端在每次传输后,都会主动关闭TCP连接,使HTTP传输处于HTTP close模式下。任何 "Connection" 头如果不是"close",都会被移除。3 K. I6 C1 b1 C
; @- v' Z. H& Y( l
  很少会有服务器不正确的忽略掉头,即使收到"Connection: close"也不关闭连接,否则就是不兼容HTTP 1.0浏览器标准。 如果发生这种情况,可以使用"option forceclose",在服务端响应后主动关闭请求连接。选项 "forceclose"还可以及早释放服务连接,而不必等到客户端的应答确认。
' K% K2 J& i4 D( n3 B" k: }! O5 u5 u0 U1 u
  这个选项可以设置在frontend或backend上,只要其上可以建立连接。如果同时设置了"option forceclose",那么它比"httpclose"优先。如果同时设置了 "option http-server-close",则会实现"option forceclose"的效果。
option forceclose& }7 L' @; t, b9 [/ r/ s
no option forceclose
  Enable or disable active connection closing after response is transferred.     启用或禁止response后的主动关闭连接
  May be used in sections :   defaults | frontend | listen | backend# d4 I. _' c+ Z/ K7 `$ t
                                 yes   |    yes   |   yes  |   yes
  a  g. U+ M# R" ~
  Arguments : none6 c: B& B  @7 j! j7 A7 G: @& e+ D
        有的HTTP服务器收到"option httpclose"设置的"Connection: close",也不会关闭连接,如果客户端也不关闭,连接会 一直打开,直到超时。这会造成服务器上同一时段内的大量连接,日志中也会显示较高的全局会话时间。
        此时,可以使用 "option forceclose",当完成响应时,立即关闭对外的服务通道。该选项隐式打开httpclose选项。需要注意,该选项允许解析完整的request 和 response,所以可以很快关闭至服务器的连接,比httpclose更早释放一些资源。: T! }, }1 {# ~+ Y( Q$ B" K$ k
        如果同时启用了"option http-pretend-keepalive",虽然会禁止发送 "Connection: close"头,但是依然会在整个response被接收后,关闭连接。
' |8 C6 Y3 Y* w. ~+ l* \9 z# h
; P" |6 q, _' {  Poption http-server-close# f; h* T/ Y: C- `( x6 X
no option http-server-close
$ ?7 w$ H$ A  a7 L7 C) h  Enable or disable HTTP connection closing on the server side  启用或禁止关闭服务端的HTTP连接1 ^; U: P% L& q+ h' Y/ t. I6 P  f
  May be used in sections :   defaults | frontend | listen | backend
: w0 w+ K; c: B0 ~! B8 E9 Y                                 yes   |    yes   |   yes  |   yes5 T0 f. L3 s2 R/ H- {. c
  Arguments : none( [" \5 h) _% ^) d/ l5 E! {
    默认的,客户端与服务端通讯,haproxy 只是分析、记日志,并处理每个连接的第一个请求。该选项设置server端为HTTP 连接关闭模式,并支持客户端为HTTP keep-alive的pipelining模式。提供了最低的客户端延迟和最快的服务端会话重用,以节省服务资源,类似"option forceclose"。还允许无keepalive能力的服务端在keep-alive模式下为客户端提供服务,但是需要符合 RFC2616。需要注意的是,有些服务器遇到"Connection: close" 时并不总是执行关闭,那么keep-alive 则无法使用,解决方法是启用 "option http-pretend-keepalive".
1 r! Z2 A/ o3 v, s7 t" t
9 j2 S0 Y* a- @8 `0 w) U5 G* q     目前,日志无法指明请求是否来自同一会话;日志中的接收日期为前一个请求的结束;请求时间为新请求的等待时间;keep-alive request time 存活请求时间为超时时间,绑定 "timeout http-keep-alive" 或 "timeout http-request"的设置。* C2 J; {' ]- I$ k  Z) S
     这个操作可以设置在frontend或backend上,只要其上可以建立连接。需要注意的是,这个选项可以与 "option httpclose"结合, 但 "option httpclose"优先级更高,结合后基本实现了forceclose的效果。
- j/ P; J4 P5 f9 k3 ^: S
3 X6 ]1 t/ x8 N" \) r% x7 yoption http-pretend-keepalive (http-假装-长连接)* A3 L; F1 U: `, x$ j& _
no option http-pretend-keepalive
8 i, J# N' \- q$ c3 C  Define whether haproxy will announce keepalive to the server or not  定义 haproxy 与服务器是否是 keepalive 的。
& a1 D# C" M& E, Z) i; n9 o4 H8 B# f  May be used in sections :   defaults | frontend | listen | backend
4 F& W7 O0 l4 u, ~" L/ w                                 yes   |    yes   |   yes  |   yes
# c% T1 g8 v7 o7 O: ?: N# d  Arguments : none
* k) G9 G5 d% j! y4 v    当声明了 "option http-server-close" 或 "option forceclose", haproxy会在给server的request头中添加 "Connection: close" 。然而有些服务器看到这个头,会返回未知长度的response,并自动避免chunked encoding,其实这是不对的。它会阻止haproxy保持客户端长连接,还会使客户端或缓存接收了未完成的响应,却认为响应结束了。7 W6 x* v) l0 J
    设置 "option http-pretend-keepalive", haproxy会在服务器端保持长连接,服务端则不会出现前面的问题。当 haproxy 获取了完整的response, 才会以类似forceclose的方式关闭服务端。这样客户端得到一个普通的响应,连接也在服务端被正常关闭。. [( f7 f  V$ H" h& a# P! o
    建议不将其设为默认值,因为大部分服务器会在发送完最后一个包之后更高效的关闭连接,并释放缓存,而且网络上的数据包也会略微降低整体的峰值性能。但是启用该选项,haproxy会略微少做一些工作。所以如果haproxy在整个架构中是个瓶颈,可以启用该操作,以节省CPU。# B+ \* A1 V) ]4 X

7 i( }( \: f( `     这个选项可以设置在frontend或backend上,只要其上可以建立连接。这个选项可以与 "option httpclose"结合, 使服务端keepalive,客户端close,但并不建议这样做。
1 ~. Q3 y) w5 Q; n2 q+ Q
balance <algorithm> [ <arguments> ]
6 p! [1 \+ J/ r% ebalance url_param <param> [check_post [<max_wait>]]- H1 P/ l" b, W% N, G1 @) N8 k
  定义选择后端服务的负载均衡算法
/ \' I- ~# b* F; p: K- g  May be used in sections :   defaults | frontend | listen | backend
) @) U5 N7 v. H* g4 f  l                                               yes   |    no    |   yes  |   yes+ z+ w/ F2 R( e
  Arguments :
, l; O1 [* g0 u( @1 m5 ~& Y3 d    <algorithm> 是负载均衡时选择服务器的算法,没有持续信息时可用,或连接重定向到另一个服务器。<algorithm> 可以是以下几种:
% L; ]- r1 t& [$ `1 t9 g      roundrobin  每个服务器根据权重轮流使用,如果服务器的处理时间平均分布,这是最流畅和公平的算法。算法是动态的,对于实例启动慢的服务器的权重会在运行中调整。每个backend的活动服务器在设计上限制为4128个。在一些大的群里面, 当服务器很短的宕机后恢复回来,有时会有几百个请求被重新整合到群当中,并开始接收处理。尽管很少发生,但是很正常。这也说明了有机会监视它们,所以不必担心。
$ U8 X  `4 O- Z4 m! O
2 @+ @- Q9 L9 [7 W  [  V) [5 B      static-rr  每个服务器根据权重轮流使用,类似roundrobin,但它是静态的,意味着运行时修改权重是无效的。另一方面,它对服务器的数量没有设计上的限制,服务器启动后便会立即进到群中,整个分发方案会重新计算。这会略微降低CPU的运行(约1%)。
, @# {* S) E, z# S$ M4 o. |% L" \& z5 l6 W: r
      leastconn  连接数最低的服务器优先接收连接。Round-robin用于负载相同的服务器,使每台服务器都被使用。leastconn建议用于长会话服务,例如LDAP, SQL, TSE等,而不是很适合短会话协议,如HTTP。算法是动态的,对于实例启动慢的服务器的权重会在运行中调整。
  K0 y7 ?5 F; ]) X% {6 u, N. b# }' J% v* \
      source    对源IP地址进行哈希,用可用服务器的权重总数除以哈希值,根据结果进行分配。只要服务器正常,同一个客户端IP地址总是访问同一台服务器。如果哈希的结果随可用服务器数量而变化,那么有的客户端会定向到不同的服务器。该算法一般用于不能插入cookie的TCP模式。它还可以用于广域网上,为拒绝使用会话cookie的客户端提供最有效的粘连。该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是算法会根据"hash-type"的变化做调整。
' G6 L" z5 ^$ f
/ h3 \2 j' L5 a. P' n      uri        对URI左端(问号之前)进行哈希,用可用服务器的权重总数除以哈希值,根据结果进行分配。只要服务器正常,同一个URI地址总是访问同一台服务器。一般用于代理缓存和反病毒代理,以最大限度的提高缓存的命中率。该算法只能用于HTTP后端。该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是算法会根据"hash-type"的变化做调整。1 B* _; [* I, Q
                  算法支持两个可选参数"len" 和 "depth", 都是后跟正整数。“len”参数指定算法只处理URI从头开始的字符数,据此计算哈希。因为大多URI以"/"开头,所以"len"最好不要设为1。"depth" 参数指定URI中最大的路径深度,据此计算哈希。请求中的每个斜线为一级。如果同时声明了这两个参数,则截取URI时必须同时满足。
) B& W! j3 E9 C) J* F0 s/ A! a2 a/ p' ]' ~
      url_param  在HTTP GET请求的查询串中查找<param>中指定的URL参数。
! U5 m+ S& p3 u3 A. }" s! T                 若使用了修饰符"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被用了,则只能检查第一个块。如果参数值被块边界分隔开,则只能随机均衡负载了。/ v/ \& R6 V, q
                  如果参数后面跟着 ('=') 和一个值,则可以根据这个值进行哈希,用可用服务器的权重总数除以哈希值,根据结果进行分配。' x. V+ ?& D! w9 r9 g5 g  G. n( L  R
                  还可用于跟踪请求中的用户身份,只要服务器正常,同一个用户ID的请求总是发给同一台服务器。如果没有参数或参数没有值,则使用轮询算法。该算法只用于HTTP后端。该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是算法会根据"hash-type"的变化做调整。
9 u& u% q. t5 n
% V6 s8 m* d" G* c      hdr(name)  在每个HTTP请求中查找HTTP头<name>。与ACL函数'hdr()'一样。括号括起来的头名字不区分大小写。如果缺少头或头没有任何值,则使用roundrobin算法代替。                  0 C: }. U7 h/ ?
                       启用参数'use_domain_only',哈希算法将只用于一些类似'Host'的特定头的主域部分。例如主机值"haproxy.1wt.eu",则只考虑 "1wt"。该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是算法会根据"hash-type"的变化做调整。. b6 t8 z' j' C& V1 ~5 s
- V, K8 f! c) J
      rdp-cookie, X* ^5 W$ _4 D7 k
      rdp-cookie(name)
( ~  F' J; x. s$ G8 G                  为每个进来的TCP请求查询并哈希RDP cookie <name> (或“mstshash”如果省略) 。与ACL函数 'req_rdp_cookie()'一样,name不区分大小写。该机制用于退化的持久模式,可以使同一个用户(或同一个会话ID)总是发送给同一台服务器。如果没有cookie, 则使用roundrobin算法代替。" @" c0 A0 E& E) v& o( D( \
                  必须注意该声明要生效,前端必须确保在请求缓冲中已经有RDP cookie,所以必须使用规则tcp-request content accept' 和ACL 'req_rdp_cookie_cnt'相结合。
  a. P# C' L- \+ t5 F$ Y+ e  B                  该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是算法会根据"hash-type"的变化做调整。" l- V) S0 Q1 \4 ~* H( V2 r6 E$ }9 H

: O# \8 t) \  z) s) ?  Q    <arguments> 是用于一些算法的可选参数列表,目前只有"url_param" 和 "uri" 用到,例如:
" e+ Z' `: u  W" s: G  Z3 ^7 u                balance uri [len <len>] [depth <depth>]
8 y! K/ t  q$ w* s0 d" b                balance url_param <param> [check_post [<max_wait>]]" H; o  Z! {8 H$ L/ [. ]" j5 h& ]1 y

1 y+ d  e9 i7 k# W8 K+ L7 O8 R  如果没有其他算法、模式或选项的设置,后端的负载均衡算法默认为roundrobin。每个后端只能设置一种。' n8 ]/ t$ e) Y" e; R% P% A
  Examples :2 |7 e8 g, r0 T
        balance roundrobin
0 E, E$ M% E# C& x. a1 I9 W! e5 @* i        balance url_param userid
- R5 X% S1 h( R4 w+ H        balance url_param session_id check_post 643 q# J: f) n9 l: J; m. c" A; I' J
        balance hdr(User-Agent)( H3 G- i/ u3 h+ a& f
        balance hdr(host)
- B1 c) `8 }0 k# G        balance hdr(Host) use_domain_only
  Z) Q: Q! i+ ]5 K0 x4 W+ O
# i7 h( ~' z, _; S; S  注意:  以下的警告和限制是使用“check_post“扩展和”url_param”所必须考虑 :' J. V) B8 a  q6 W/ ?
    - 所有POST请求都要考虑,因为在包含二进制数据的体或实体中,没有办法决定是否会找到参数。因此需要另一种方法,限制POST请求的体中不含有URL参数 (见 acl reqideny http_end)
    - 大于请求缓冲大小的 <max_wait> 值是没用的。在build时设置缓冲大小,默认16KB。' ]2 j7 h( ]  a$ v- k
    - 不支持Content-Encoding, 参数搜索会失败;负载均衡会改用 Round Robin。, X1 X6 l/ p, u5 w
    - 预计: 不支持100-continue,负载均衡会改用 Round Robin。
: D$ ]+ J2 D% O    - Transfer-Encoding (RFC2616 3.6.1) 只在第一个块中支持。如果在第一个块中的参数值不完整,选择的服务器就没有定义。(实际上取决于在第一个块中定义的有多小)
, S, k( J$ B' r' d9 t" _1 d    - 该特性不支持生成100, 411 或 501 响应。
# s9 k  F) V0 J  e! v8 j; q    -  有的情况下,需要"check_post"只是要查看整个消息体的内容。检查一般会停在任意数量的空格(LWS: linear
& r! p1 Y6 C6 z+ c      white space)或控制符上,表示这可能是一个URL参数列表。这可能不是一个关于SGML的类型消息体。$ e1 M  Y' Q' E) h- T0 x

9 q$ f7 Q5 d! \# U8 R( ]7 I" u  See also : "dispatch", "cookie", "appsession", "transparent", "hash-type" and "http_proxy".

) `- _9 i4 @) G4 u; M2 m- B  @( g
hash-type <method>
8 C/ _5 t6 U' o/ g' s  将哈希映射到服务器的方法。Specify a method to use for mapping hashes to servers: M9 v1 Y! ?, w8 V# h5 R' a
  May be used in sections :   defaults | frontend | listen | backend$ E# u" n+ F! D5 e; M
                                               yes   |    no    |   yes  |   yes" ^& \  n* o3 K0 [/ j) v  v
  Arguments :* i: x; r; m. k
    map-based  哈希表是包含所有在线服务器的静态数组。哈希结果很平滑,并考虑了权重,但是会忽略服务器启动时的权重变化,也就是说不能慢启动。另外,服务器是根据数组中的位置所选择的,所以服务器数量变化时,大部分映射也会变化。当一台服务器启动或关闭,或服务器加入到群中,大部分连接会再分配给不同的服务器,这对有缓存的实例会比较麻烦。
    consistent  哈希表是由每个服务器构成的树,会在树上查找哈希Key,并选择最近的服务器。这种哈希是动态的,支持服务器启动时修改权重,所以可以慢启动。它有一个好处是当服务器启动或关闭时,只有其本身的关系被移除,当服务器加入群时,只有一小部分的映射会被重新分配,所以是一个比较理想的支持缓存的算法。但是根据其原理,算法不会非常平滑,有时候必须调整服务器的权重或ID来获得更平衡的分布。要保持多次负载均衡时的相同分布,服务器ID是绝对不能变的。(roloand:haproxy根据服务器的ID初始化其哈希值)" [* }! n" d# G! |, d5 q- ~
   默认值是"map-based",建议大部分情况下使用。7 k6 @1 U% f4 ]$ V! Q0 ~9 {$ e- X' B! R( G

4 }9 o1 n- q- X$ o6 h! T: v  See also : "balance", "server"

7 b  C' s3 p  W  [& n0 t# N- udispatch <address>:<port># m* A6 V& [& `2 o" X( i* g
  设置一个默认的服务器地址
3 D9 L3 H5 u! a2 W% R( ]# o  May be used in sections :   defaults | frontend | listen | backend" t* E( W0 z  _6 H( U
                                               no    |    no    |   yes  |   yes7 o. j% ?, Z" f' S' X; J
  Arguments : none
: \& k  [6 K) k. H' O    <address> 默认服务器的IPv4地址,也可以是主机名称,名称只在启动时解析为IP地址。: i# Y$ @5 x) |9 p5 T  X. B
    <ports>  端口号,所有连接都会发送给这个端口,但是不允许像其他服务器一样使用端口偏移(port offsets)。
   "dispatch"关键字指定了一个默认的服务器,用于无可用服务器时的连接的处理。过去常用于前传非持久连接给后备负载均衡器,由于定义简单,还用于简单的TCP中继(TCP relays)。 建议对于明确的连接处理,应使用"server"直接声明。
====================
一:Global parameters
4 v6 Y- X- n* f4 ~7 d0 m* Process management and security* M" Y% ]! H; I: p+ c# @% o" P
- chroot 改变当前工作目录- w8 d! L# F1 s) I; ^
- daemon 运行方式为后台工作3 _: J8 @4 ?2 e8 v
- user - group 工作用户和组
. a) w( M- R/ r/ o7 o-log <address> <facility>日志输出设备# `  T  Q7 d2 v! M2 x
- nbproc 创建工作的进程数目
. |9 P, g- @/ e6 h-pidfile pid文件位置
9 n! M$ a* y8 R# I# S9 x6 e) I- ulimit-n 设置每个进程的可用的最大文件描述符4 a# U0 z" x8 {0 @7 Q1 C
- stats 创建监控所用的套接字目录  x# H' d, j6 T" Q- [% r- l
- node 创建另外一个节点名字共用一个IP地址,用来识别哪个节点在处理流量4 R: C, A* K" y9 U# f" E4 u) i
- description 描述实例的名称( M* `  @+ [' G
maxconn <number> 每个进程可用的最大连接数
* c+ X% \- r! f+ b! w" b, Emaxpipes <number>  每个进程可用的最大管道数: X' s& e: u, X& W8 Z" @" h
nokqueue  nopoll  nosepoll nosplice  禁用这些功能
- l$ X+ _" {0 T3 i  ?spread-checks <0..50, in percent>  health check 的时间间隔
. c$ y' ^1 D" L) r$ Ytune.bufsize <number>
6 C# c! a6 b9 J) [tune.maxaccept <number> ) E6 I# k* R: Y2 O  z) u# ?
tune.maxpollevents <number>
% Q# o" F, |. xtune.maxrewrite <number> 6 @# i. Y6 g, W2 J% N% C5 q; G9 t
tune.rcvbuf.client <number> + \; S2 Z6 B! @/ W. _2 C
tune.rcvbuf.server <number> * D& a# r+ x1 d, N
tune.sndbuf.client <number> , B. b. x9 T# t
tune.sndbuf.server <number> " n8 L; w/ q% w9 Y+ m. _9 z
以上凭字面理解吧+ c0 B1 e+ R0 d$ N4 Y2 ?
debug  调试模式,输出启动信息到标准输出
: Y5 x& }0 }. W" Equiet   安装模式,启动时无输出& a. E$ z6 i/ F* J& S% |
$ [& s' A. g( i/ {& E2 n
二:defaults 块& Z0 d6 W3 z' s# o! e, n: ^: o
作用于其后紧跟的listen块,直至下一个defaults 块,下一个default 将替换上一个块作用于以后的listen2 Z( f" }$ D# k6 @. m' L
frontend 块,接受请求的端口组
5 d) K) e- W3 P" s$ A3 `2 ?backend块,后端处理的server 组' {7 ^8 @+ F6 u8 P( t
listen块,frontend和backend 块的结合
( w( `! m3 ?+ v. e; y+ a6 w6 J1 J7 o0 N& S$ S' r7 h: v( x" n
三:常用配置命令  S8 b- b- N; _, t# ~1 }( U

, }0 \/ \3 n( b$ S- k& Nbalance <algorithm> [ <arguments> ] 6 L: ~# j$ h. U1 Y* _9 z
balance url_param <param> [check_post [<max_wait>]]   负载均衡模块设置! X3 w4 ~4 ^3 n( b; U) a2 w

* h1 [2 {& D1 Z% a7 D- E" LExamples :
$ J6 F% C4 O4 _0 _# lbalance roundrobin
8 U) f, T6 Z/ V0 l0 H: gbalance url_param userid  
* Q" S7 y" u9 Q( }' I# n: l1 qbalance url_param session_id check_post 64
( y' a$ o5 f. @5 f' Lbalance hdr(User-Agent) ' K  N9 B, A9 H) w% E
balance hdr(host)
8 E5 ]1 y6 o; x& R1 ~$ jbalance hdr(Host) use_domain_only   k, v. v7 T( D
! L. z2 g8 v& Q# x' u. c/ ^
block { if | unless } <condition>  在7层阻止访问
$ ~2 _# m+ [  iExample:
! T3 S6 V$ K" \  R. Jacl invalid_src src 0.0.0.0/7 224.0.0.0/3  acl定义和squid 很像( A7 W& \1 `* U8 e/ o
acl invalid_src src_port 0:1023 7 O! u3 v' }/ \5 W
acl local_dst hdr(host) -i localhost
/ P; c2 z$ K: A! ~4 X7 [& R% u5 Pblock if invalid_src || local_dst 6 j/ M9 ~2 e$ F  Q1 Y* B1 |

; y& @0 j, X/ M6 i- m3 Ncapture cookie <name> len <length>  在请求和回应包中捕捉记录指定长度的cookie,name 为cookie的开头几个字母
* U( {8 S. I" M4 ^0 ^6 l, o
( [9 ]8 u) E! [' BExample:2 ^- Z3 I. _' F( q% }8 q
capture cookie ASPSESSION len 32
5 |" K! d: o% i& \) e# U$ C9 p
2 `$ E* t, ]0 H- lcapture request header <name> len <length>
2 W. s- m. D. L) S7 `capture response header <name> len <length> 同上0 b  R- V# d8 |% Q3 |7 i

; Y; ?. n0 o  H: ^clitimeout <timeout> (deprecated) + k6 A* r4 k3 s. }
contimeout <timeout> (deprecated)  客户端超时时间,不赞成设置' u- d4 s2 r) X6 m2 Q& n

% i, `2 b8 G( v) Y. ~cookie <name> [ rewrite | insert | prefix ] [ indirect ] [ nocache ] [ postonly ] [ domain <domain> ]*   允许持续的基于cookie 的后端连接
3 G. K4 w3 Y6 x4 v* k& T4 K! l: t8 g7 f1 }/ [) H
default_backend <backend> 默认应用的后端
3 G5 ]9 Z7 S9 D5 @( X. Z' D
" h* R# h& E( }' a8 |* L1 C; b9 B4 nExample :
! {- ^/ N, k% {+ F9 ^. F& \( Tuse_backend dynamic if url_dyn
/ v) |  O' r+ ?) ]! u. Quse_backend static if url_css url_img extension_img ' c8 k& V- P, I3 w2 m8 I
default_backend dynamic    当没有匹配时就用dynamic0 a* [; `9 h* |; ]( {) w

9 K, \, C0 K. D# n7 i) [errorfile <code> <file> 定义出现错误的代码的返回页
8 i0 O3 @6 K4 e" f6 YExample : ) p5 o( v  S3 Y) ~1 h
errorfile 400 /etc/haproxy/errorfiles/400badreq.http
3 c/ q* g' d( h- Y4 K/ A6 B) Cerrorfile 403 /etc/haproxy/errorfiles/403forbid.http
5 s) G6 S5 b" ~1 cerrorfile 503 /etc/haproxy/errorfiles/503sorry.http
' \" \8 a% ~9 W# `2 C) X/ y  `1 G/ V9 x* D
8 u( U8 P6 n% g1 ]
errorloc <code> <url> errorloc302 <code> <url>   出错重定向到指定url
; |" H% Y6 m. w9 F- v1 X; r  d1 Sforce-persist { if | unless } <condition>  在特定条件下,强制继续连接down 掉的服务器后端0 j; z5 C( X- {6 V0 I& F/ a
fullconn <conns>  定义后端组的最大连接数3 [8 K5 z3 u6 z. p. F( k6 E
grace <time>  haproxy停止后,再持续多长时间用于处理连接
& T- J" T8 e5 v3 f- Z* m( J! ihttp-check disable-on-404  如果后端检测返回404,将不再把后端计入负载均衡
( l1 |% t) _" thttp-check send-state 允许haproxy 发送 X-Haproxy-Server-State
1 ~/ {* E: q  U" A6 r' _http-request { allow | deny | http-auth [realm <realm>] } [ { if | unless } <condition> ]   七层访问控制7 j8 T6 g9 ^) q& x1 r
Example:6 [8 X& N2 K# J9 x, J
acl nagios src 192.168.129.35 h1 g) O* Z# i+ L
acl local_net src 192.168.0.0/16# _2 ]+ f2 ~2 X5 _
acl auth_ok http_auth(L1)
2 B6 {0 ?* c- S4 j. B) J5 J0 S9 {: i: S
http-request allow if nagios* d1 l+ e1 u, ^( h
http-request allow if local_net auth_ok
+ C0 d1 ?: {* v% vhttp-request auth realm Gimme if local_net auth_ok  T1 f# [4 r, J7 O, a
http-request deny
, ~5 t* g- X; E) [) O; R! m0 g6 s8 A
$ i0 `( ~7 d% s1 H0 yExample:9 q% z5 B9 }0 v: ^# m* e. ^
acl auth_ok http_auth_group(L1) G1. [. T* W5 Z: g- a0 z
9 x! {: R! t3 d6 c% p. n  q
http-request auth unless auth_ok" n" x" Q' ^+ I3 Q8 e

3 \4 R1 s7 v8 I( w. _5 E& qmode { tcp|http|health }   设定启动的实例的协议类型
9 y. B( O% M0 B! @0 ?! y" R0 T# ~/ smonitor fail { if | unless } <condition>  监控失败条件设置) j+ p( j+ B( V& u( U
/ W1 c: a# ]( t6 j. N
option abortonclose 丢弃由于客户端等待时间过长而关闭连接但仍在haproxy等待队列中的请求' y0 \, D' ]  v0 C
option accept-invalid-http-request  接受无效的http请求,建议关闭(开启可能有安全隐患), j+ ?6 @! L& A% B& Q2 ^- _9 I
option accept-invalid-http-response 接受无效的response ,建议关闭
# m( n3 h* q$ N" B6 hoption allbackups  应该是后备服务器,如果正常的后端无法使用,就使用这些后备的设备,balance方式还是用原来的,没有优先的选择,常用来提供错误的页面
% T+ B- b( {4 O/ s1 doption checkcache    分析后端response,阻止可缓存的cookie,它对response 进行严格检查,包括"Cache-control", "Pragma" and "Set-cookie" ,查看在客户端代理那边保存是否有风险,如果这个允许的话,符全以下条件 的response 将被允许,其它的将被阻止。; a: n# O0 h0 ~7 I% t* \
- all those without "Set-Cookie" header ;, H# S: D4 j+ J/ G) u! P' c
- all those with a return code other than 200, 203, 206, 300, 301, 410,
# H# K' P2 z8 B( Fprovided that the server has not set a "Cache-control: public" header ;9 y$ e4 ]! M% ^0 S
- all those that come from a POST request, provided that the server has not( h8 r2 J( q' h+ i/ J
set a 'Cache-Control: public' header ;
- S! W6 F. m* [0 ^+ D- those with a 'Pragma: no-cache' header
3 s2 x" Q% e3 c( l! K$ r- those with a 'Cache-control: private' header
. c7 }4 K2 A4 q6 Q! d- those with a 'Cache-control: no-store' header
; ?' p% L2 @/ u  Q( `( }  B- those with a 'Cache-control: max-age=0' header. I1 Z" ?4 H! A6 M  o5 M3 N  D: }
- those with a 'Cache-control: s-maxage=0' header
4 I0 L, `! O" B; c. E- those with a 'Cache-control: no-cache' header) V9 L, e7 h1 a- n
- those with a 'Cache-control: no-cache="set-cookie"' header
3 s, S7 V$ s# W- those with a 'Cache-control: no-cache="set-cookie,' header
9 x! o* ~$ E7 {8 c* ~) |: H* U(allowing other fields after set-cookie)
0 u1 a' b* o1 n3 F$ f  [1 A& q  p  R& I. U* k
option clitcpka   是否允许客户端发送tcp keepalive 包,这个和http 的keepalive 没有关系& _# _; s4 \7 c7 b0 N
option contstats   允许连续的流量统计更新9 {( I6 r! K# {' b6 c! i: v! m8 K& e# G
option dontlog-normal   开启正常连接的日志
' B7 \" K! \+ b! N9 Xoption dontlognull   记录空连接9 B# z$ e7 o. r/ b) _
option forceclose  允许关闭session 在后端把response 发送后
' y% I& h6 n# ?9 ooption forwardfor [ except <network> ] [ header <name> ]        允许在request 中加入X-Forwarded-For header 发往server; D2 K4 l+ M- d4 P
option http-pretend-keepalive    定义是否haproxy要宣布同server keepalive" D) g1 ?$ R+ N8 ~# G; c
option http-server-close   是否开启在server 端 connection closing
8 s( h4 I. x; ?9 l" v7 Ooption http-use-proxy-header    用non-standard Proxy-Connection 替换 connection
- T! f7 c+ [( G6 ^3 M
! \. S& `' s! a* v7 F+ V
! A& J" V& q* W3 [% t# doption httpchk <method> <uri> <version>  允许用http协议检查server 的健康
( X- K. }& {; D+ J- oExamples :
3 }/ g, B8 d: b0 |2 C6 N# Relay HTTPS traffic to Apache instance and check service availability
; j7 K& K9 q4 \# using HTTP request "OPTIONS * HTTP/1.1" on port 80.3 p1 s+ t/ h; ?" s8 o3 V# o' W
backend https_relay
9 A# h/ {" h# B* vmode tcp
- s& H' w: G! t' Poption httpchk OPTIONS * HTTP/1.1\r\nHost:\ www) w& v3 }" K; d! J5 }0 h0 u. e+ E
server apache1 192.168.1.1:443 check port 80% Q- I( ~+ t4 o' t7 g1 y! |! Y
; e0 K- j2 u% a
option httplog [ clf ] 定制日志格式
2 H4 e3 z$ {( _3 V; t+ D' D5 l6 |) t9 koption http_proxy  开启http 代理模式,只有最基本的代理功能
$ T7 v% R. A& h- {; s0 }' P# Joption ignore-persist { if | unless } <condition> 在某条件下拒绝持续连接,适用于对静态文件的负载均衡
* s: \: `: I9 k, Y5 n$ ^% f* Doption independant-streams  启用双向超时处理,如socket 的read 和write
. U+ c( z) e2 l, o) ~6 koption log-health-checks   记录健康检查日志
; l7 {$ r2 c* _: B2 m" L1 d: Foption log-separate-errors   对非完全成功的连接改变日志记录等级
) P6 z; R+ L8 R% p6 b4 d; foption logasap   大传输大文件时可以提前记录日志: J2 X% ^+ l$ T4 V1 e: ~4 V
option mysql-check   mysql 健康检查) n5 U* v. t* }: L& I: M
option nolinger  清除肮脏连接后开成的tcp 状态及占用的资源,不过并不是强列要求你用这个选项,当然如果你有thousands of FIN_WAIT1 sessions on your system ,那肯定得用了
9 R' v" r8 L: u. v' yoption originalto [ except <network> ] [ header <name> ]   允许在requests中加入X-Original-To header 发往server+ F5 |0 m7 G( E( `. m/ D0 Y
option persist     强制将http请求发往已经down 掉的server
" j0 ]: X+ }+ d' @6 ioption redispatch   是否允许重新分配在session 失败后
. z$ s1 k, e' L6 H4 Soption smtpchk   smtp 检查5 {6 ^) W% V) a$ x7 G9 Y
option socket-stats  允许对单个socket进行统计3 z  _$ P: _2 F3 |; O4 v. R$ c
option srvtcpka  是否允许向server 发送keepalive- W3 k! ^! `! U, f  U8 k
option tcpka 是否允许向server和client发送keepalive
/ f! ^$ P  q/ `4 v* s. boption tcplog  允许记录tcp 连接的状态和时间) y$ K+ c: u5 n  q3 H1 W: e  W/ ?
option transparent   允许客户端透明代理3 o* @3 s  T$ J# I+ ]5 |
rate-limit sessions <rate> 设置frontend 每秒处理的连接的上限,如果到达上限就停止建立新的connection* e1 e* e6 I/ |5 ~/ R% |( ^0 ]
4 [- D4 b* G# g! G
redirect location <to> [code <code>] <option> [{if | unless} <condition>]
& G+ d$ i- ?- P# d0 q0 mredirect prefix   <to> [code <code>] <option> [{if | unless} <condition>] 重定向,相当于rewrite* y6 u2 w. R- b" w( N8 {8 _3 l

4 N( n# z0 |9 e7 l$ UExample: move the login URL only to HTTPS.+ z3 A. m. {& a) u+ @: C0 [
acl clear      dst_port  80
% k  B$ }: E  uacl secure     dst_port  8080
+ [/ B+ D& J5 v- p- @% hacl login_page url_beg   /login. L% U- M+ n7 s4 D% Y
acl logout     url_beg   /logout
3 s) r+ S3 C3 ~- bacl uid_given  url_reg   /login?userid=[^&]+4 a. X# S5 C; {$ h5 h
acl cookie_set hdr_sub(cookie) SEEN=1/ V9 T* O8 ]# d4 R9 L$ S9 M

8 ~0 B, y7 {9 Q* L: ], N  oredirect prefix   https://mysite.com set-cookie SEEN=1 if !cookie_set& G; i1 {, s5 F, m/ ?
redirect prefix   https://mysite.com           if login_page !secure
" G( G3 K8 }1 f  g8 Sredirect prefix   http://mysite.com drop-query if login_page !uid_given
6 l0 Z4 P- B" V+ j: _% Eredirect location http://mysite.com/           if !login_page secure3 k: f3 r/ ?5 P$ d) N3 b
redirect location / clear-cookie USERID=       if logout+ p/ |' C0 ]! O$ g2 _
: I- m- B/ M* N5 Z! f- y
Example: send redirects for request for articles without a '/'.
& k$ V& ^5 t4 ?$ n' @# G1 c9 macl missing_slash path_reg ^/article/[^/]*$
: `! S! Y( Y# s6 P3 Kredirect code 301 prefix / drop-query append-slash if missing_slash
8 M/ T' G1 e  X1 U5 E$ }redisp (deprecated)
- h3 G0 K- {3 q$ kredispatch (deprecated) 开启session 重新分配在connection连接失败后,不赞成启用
2 y1 `2 r2 O" m* A+ f/ ereqadd  <string> [{if | unless} <cond>] 在http请示的末尾加上string
. x! B+ F  [3 ^+ _$ G; g* H- T( k- |7 g& A
Example : add "X-Proto: SSL" to requests coming via port 81
$ r' r7 O; ^7 iacl is-ssl  dst_port       81
4 T& h, J6 h# \reqadd      X-Proto:\ SSL  if is-ssl" e1 Z9 [( X) l4 i, v; A# q

& \" Q7 K1 P  Rreqallow  <search> [{if | unless} <cond>]# S* @- n4 j6 n/ f0 \( p
reqiallow <search> [{if | unless} <cond>] (ignore case)    request 请求访问控制
& L+ Y) e/ ]' k
" o6 M5 Y, {8 ^5 l& ~- sExample :
0 Q, v- w$ x8 R2 C( B; H/ @# Q# allow www.* but refuse *.local
' E6 M' t4 [( x! K) w0 wreqiallow ^Host:\ www\.
% |3 q( Y7 q) ^: Wreqideny  ^Host:\ .*\.local
6 U  O8 r- z# K: w9 @" s2 `
# `& l) q7 W0 q, jreqdel  <search> [{if | unless} <cond>]" U( I+ s6 r; W+ i/ d5 l
reqidel <search> [{if | unless} <cond>]  (ignore case) 删除请求的head 中的内容
( f4 P7 `7 T/ y' w9 G# P. X6 n
Example :7 ^1 ]/ g$ J: s& [& L$ N2 p8 A' U. \
# remove X-Forwarded-For header and SERVER cookie
6 P: j& m1 X2 hreqidel ^X-Forwarded-For:.*' Z0 q% v; r5 l- B1 G  c
reqidel ^Cookie:.*SERVER=5 F4 v+ J: j! K  p: L! i

% i" p$ q' a% D% F! D/ Y
5 ]' F( e, W1 H1 creqdeny  <search> [{if | unless} <cond>]
2 s0 o, t: T5 c8 t9 @+ B0 hreqideny <search> [{if | unless} <cond>]  (ignore case) 拒绝访问
' o# Y" h) m- B- j2 _: t. [7 o0 c6 v& }" b' V
reqrep  <search> <string> [{if | unless} <cond>]
/ t( V4 B3 O6 i  |7 C& R7 @8 u; Ereqirep <search> <string> [{if | unless} <cond>]   (ignore case)  request 请求替换  M$ a* A+ s& U
Example :  G, O* B! G3 }% ~' l4 O* s
# replace "/static/" with "/" at the beginning of any request path.
% s1 Q2 k# r% j! s0 l# Treqrep ^([^\ ]*)\ /static/(.*)     \1\ /\2
! R3 _5 x3 W& [3 y# replace "www.mydomain.com" with "www" in the host name.% I  D5 t& K, m8 F( w
reqirep ^Host:\ www.mydomain.com   Host:\ www
6 T; F2 z3 F! i9 A0 H& U- |0 \1 F5 j2 v" O' D6 V
reqtarpit  <search> [{if | unless} <cond>], i3 s, c2 \  F, f
reqitarpit <search> [{if | unless} <cond>]  (ignore case) 阻止http请求中的某些信息7 {* p5 s! {* G$ W( H' T% I7 r
1 s1 X8 \9 i( v$ ]9 h! M' _
Examples :8 X0 M& I* |  B- n5 ?, L6 E4 n1 F1 z
# ignore user-agents reporting any flavour of "Mozilla" or "MSIE", but0 Y( E* e/ i& l
# block all others.( U6 ]( O' I5 Y, }0 S6 x" T
reqipass   ^User-Agent:\.*(Mozilla|MSIE)" X: j( ]% t; w9 l* K, @. q# d+ Q
reqitarpit ^User-Agent:4 H+ N4 ]0 M! y2 ]% q
9 j0 J. X) F8 F  w
# block bad guys
6 W; \3 J" b2 c0 u2 nacl badguys src 10.1.0.3 172.16.13.20/28. ]0 C* P2 O7 N5 l
reqitarpit . if badguys
4 n/ x3 }  v1 u7 [, H1 v  W+ O
8 F9 `: A8 n( [% \2 y. d  ]8 Jretries <value> 当对server的connection失败后,重试的次数
/ E" q: G; F; r0 B. R, Crspadd <string> [{if | unless} <cond>] response 增加信息
! d& W' L! O" ]rspdel  <search> [{if | unless} <cond>], V) W0 `1 D. O$ v! z) z
rspidel <search> [{if | unless} <cond>]  (ignore case)
0 C( D# p3 Y% Srspdeny  <search> [{if | unless} <cond>]
/ Q5 o4 x! N$ o  l2 W% |rspideny <search> [{if | unless} <cond>]  (ignore case)
& b6 n1 `8 v8 u" trsprep  <search> <string> [{if | unless} <cond>]
: j$ `4 }+ o* H  I. f5 r; V/ i8 erspirep <search> <string> [{if | unless} <cond>]  (ignore case)
6 z- N, K2 R* z& B! G  x+ R& q以上和request 的差不多7 y0 C5 g3 k# U, j

$ F, x4 D7 j* t5 L4 nsource <addr>[:<port>] [usesrc { <addr2>[:<port2>] | client | clientip } ] 定义从代理出去的连接的对象,用于限定地址可以访问server
. B7 \% s8 p( y$ B3 I
- T! }5 ?% `8 o9 e一些timeout2 ?7 [( B; m) e7 V

# n, _" G  @, B5 P" y  a. R6 Usrvtimeout <timeout> server 处理超时,不赞成设置
0 q. y' C3 ~! X) Y. @timeout check                             X          -         X         X: w- o9 s+ P4 b
timeout client                            X          X         X         -
  j2 h* ~: T; ~! N* t$ g1 stimeout clitimeout          (deprecated)  X          X         X         -) D& ~" m4 Y4 u' q- f
timeout connect                           X          -         X         X
9 T  U" f& I6 u! e6 s; i6 b7 i# ktimeout contimeout          (deprecated)  X          -         X         X$ C+ M4 l  ~( R; u
timeout http-keep-alive                   X          X         X         X6 a/ N% [" J5 t9 [0 v! b" o6 x
timeout http-request                      X          X         X         X7 J  A1 E, v% W/ L
timeout queue                             X          -         X         X
: V4 S1 Q3 n5 i7 W0 Ttimeout server                            X          -         X         X5 U* b# [; R1 O7 k6 x. {. C
timeout srvtimeout          (deprecated)  X          -         X         X, h' c% J3 {. `9 v& L1 q+ e3 B
timeout tarpit                            X          X         X         X" B: x0 A, V* w. Y5 ~: m# T7 V
8 }+ z# P" o% i- `

7 F8 i6 U; y3 `  B8 p2 H) cstats auth <user>:<passwd> 监控统计的帐号和密码( h0 @+ b. @/ ^3 c% G( }2 I
backend public_www
# o# A' Q$ r% l" {1 E9 p2 zserver srv1 192.168.0.1:80# |  _! {# d& R) A# @4 B# v
stats enable- l. J: D/ |+ I% l
stats hide-version% A  `: J" U0 B- R$ z  x
stats scope   .( k& v' A8 I) C6 {1 X+ ?+ J
stats uri     /admin?stats* n& J$ m. r" v# C6 p) i5 |
stats realm   Haproxy\ Statistics
2 r! d) z0 Q* T; G- t. lstats auth    admin1:AdMiN1233 u, d; g% a' y% B& P
stats auth    admin2:AdMiN3214 m1 R# p0 d# n& d" S

! Z: W# b4 W  S6 d1 E5 a- {# internal monitoring access (unlimited)
: M  z- V- L7 o" [; Z9 r. F* ^3 kbackend private_monitoring
7 C9 _9 ^, ^: @% O% l, sstats enable0 W* A) \3 J* d( j
stats uri     /admin?stats+ k2 A# K- h9 s7 V
stats refresh 5s
3 d5 ~* ^4 b0 K1 l# ?
6 n0 C; S) k' N还有很多参数,以上能用到的也没有几个,只要满足当前需求就好,对于性能要求高的话,建议把不需要的功能 都关了吧.
====================
HAProxy的配置示例
HAProxy配置中分成五部分内容,当然这些组件不是必选的,可以根据需要选择部分作为配置。
$ l2 q4 H0 F" ^; t& Qglobal:参数是进程级的,通常和操作系统(OS)相关。这些参数一般只设置一次,如果配置无误,就不需要再次配置进行修改8 L; l- e5 t, d- G6 w
defaults:配置默认参数的,这些参数可以被利用配置到frontend,backend,listen组件
) o8 ?! Y- F) ]4 S8 H2 G: x) jfrontend:接收请求的前端虚拟节点,Frontend可以根据规则直接指定具体使用后端的 backend(可动态选择)。7 R( l: {9 L, K' ]5 Z( ~1 b+ ~
backend:后端服务集群的配置,是真实的服务器,一个Backend对应一个或者多个实体服务器。, n$ ~/ i2 W0 \6 p
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 05:30 , Processed in 0.027033 second(s), 26 queries .

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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