易陆发现互联网技术论坛

 找回密码
 开始注册
查看: 5849|回复: 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代表权重
    9 y$ a; f- D9 P- F! e" h! U: @" R

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


, @' i. p. E: q: t4 ?/ a) a
 楼主| 发表于 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不记录上级负载均衡发送过来的用于检测状态没有数据的心跳包。

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

7 v7 H, U5 a- D- C8 a/ }: \
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 :
! Z( T5 G, b& K* C
option httpclose
+ \( y0 k9 }8 bno option httpclose) ^% s5 M4 `) ~$ j. N( {7 W
  Enable or disable passive HTTP connection closing   启用或禁止消极的HTTP连接关闭8 Q* K9 e% O% ~  Y! Q- v/ D
  May be used in sections :   defaults | frontend | listen | backend; z3 P" ^$ ?& C, Z* h# b
                                 yes   |    yes   |   yes  |   yes
& V  }( [* f. L: E* {" s  Arguments : none
8 J& N, G- J( k. Q  * {( `1 k  f+ d
  默认的,客户端与服务端的通讯,HAProxy只做分析、日志和分析每个连接的第一个request。如果设置了 "option5 U) J* C' ~  N. w
  httpclose" , 则会检查双向的http头是否有"Connection: close",如果没有则自动添加,使每个客户端或服务端在每次传输后,都会主动关闭TCP连接,使HTTP传输处于HTTP close模式下。任何 "Connection" 头如果不是"close",都会被移除。
& f, X' D% U% |  k- N" A, u; k( i( I
  很少会有服务器不正确的忽略掉头,即使收到"Connection: close"也不关闭连接,否则就是不兼容HTTP 1.0浏览器标准。 如果发生这种情况,可以使用"option forceclose",在服务端响应后主动关闭请求连接。选项 "forceclose"还可以及早释放服务连接,而不必等到客户端的应答确认。3 L' P1 L' M) r. I% I9 X/ d1 Z
$ v1 |$ Z7 Y/ j3 \$ G
  这个选项可以设置在frontend或backend上,只要其上可以建立连接。如果同时设置了"option forceclose",那么它比"httpclose"优先。如果同时设置了 "option http-server-close",则会实现"option forceclose"的效果。
option forceclose
* l& g. f) i9 M" Z4 Z4 rno option forceclose
  Enable or disable active connection closing after response is transferred.     启用或禁止response后的主动关闭连接
  May be used in sections :   defaults | frontend | listen | backend
7 x& @- }& I. M, ~2 d% E                                 yes   |    yes   |   yes  |   yes: C' c, g1 T) _9 ^  ?" E
  Arguments : none
$ m( P* x: B# |* w% H        有的HTTP服务器收到"option httpclose"设置的"Connection: close",也不会关闭连接,如果客户端也不关闭,连接会 一直打开,直到超时。这会造成服务器上同一时段内的大量连接,日志中也会显示较高的全局会话时间。
        此时,可以使用 "option forceclose",当完成响应时,立即关闭对外的服务通道。该选项隐式打开httpclose选项。需要注意,该选项允许解析完整的request 和 response,所以可以很快关闭至服务器的连接,比httpclose更早释放一些资源。
# @) \4 N" J6 d+ f& `* T5 @        如果同时启用了"option http-pretend-keepalive",虽然会禁止发送 "Connection: close"头,但是依然会在整个response被接收后,关闭连接。! X( d+ m7 R& f# }  i
9 F) q+ ^  Q* w" f1 t
option http-server-close# _$ N* N# }" U) r
no option http-server-close* |7 c( @: x" P+ W+ @! Y
  Enable or disable HTTP connection closing on the server side  启用或禁止关闭服务端的HTTP连接2 _$ c& g1 b; {  l7 h
  May be used in sections :   defaults | frontend | listen | backend
) a& e! q5 I5 s: T1 P                                 yes   |    yes   |   yes  |   yes
) i0 V9 y& S  w3 N7 ^  Arguments : none- o7 u1 P2 ]3 p, R* k* p$ [
    默认的,客户端与服务端通讯,haproxy 只是分析、记日志,并处理每个连接的第一个请求。该选项设置server端为HTTP 连接关闭模式,并支持客户端为HTTP keep-alive的pipelining模式。提供了最低的客户端延迟和最快的服务端会话重用,以节省服务资源,类似"option forceclose"。还允许无keepalive能力的服务端在keep-alive模式下为客户端提供服务,但是需要符合 RFC2616。需要注意的是,有些服务器遇到"Connection: close" 时并不总是执行关闭,那么keep-alive 则无法使用,解决方法是启用 "option http-pretend-keepalive".
' A( a8 H0 h! r  i0 z
  n* s6 f3 r6 p/ A, |  g     目前,日志无法指明请求是否来自同一会话;日志中的接收日期为前一个请求的结束;请求时间为新请求的等待时间;keep-alive request time 存活请求时间为超时时间,绑定 "timeout http-keep-alive" 或 "timeout http-request"的设置。
  l7 ?1 s) d" z1 a' `     这个操作可以设置在frontend或backend上,只要其上可以建立连接。需要注意的是,这个选项可以与 "option httpclose"结合, 但 "option httpclose"优先级更高,结合后基本实现了forceclose的效果。) S# Z* N. e2 F* ~

0 h9 \0 R& T1 V5 O8 P( joption http-pretend-keepalive (http-假装-长连接)
# o/ d2 V' P1 _) z6 bno option http-pretend-keepalive
, F4 }, ~3 x" B+ l8 h! Q8 F7 ^  Define whether haproxy will announce keepalive to the server or not  定义 haproxy 与服务器是否是 keepalive 的。* x" E: ^  K& D* G/ N" N1 Z
  May be used in sections :   defaults | frontend | listen | backend
' y) J7 |. v. z; Q: O0 e; |) e( x                                 yes   |    yes   |   yes  |   yes$ s7 j( M- W! I: G6 J. Y- ~
  Arguments : none+ Y# S# ~! L) X- H1 l: }
    当声明了 "option http-server-close" 或 "option forceclose", haproxy会在给server的request头中添加 "Connection: close" 。然而有些服务器看到这个头,会返回未知长度的response,并自动避免chunked encoding,其实这是不对的。它会阻止haproxy保持客户端长连接,还会使客户端或缓存接收了未完成的响应,却认为响应结束了。
& |' P' Y8 ^: h- Z) l+ I! z# J8 r    设置 "option http-pretend-keepalive", haproxy会在服务器端保持长连接,服务端则不会出现前面的问题。当 haproxy 获取了完整的response, 才会以类似forceclose的方式关闭服务端。这样客户端得到一个普通的响应,连接也在服务端被正常关闭。
. h) f- J2 [) ]6 w    建议不将其设为默认值,因为大部分服务器会在发送完最后一个包之后更高效的关闭连接,并释放缓存,而且网络上的数据包也会略微降低整体的峰值性能。但是启用该选项,haproxy会略微少做一些工作。所以如果haproxy在整个架构中是个瓶颈,可以启用该操作,以节省CPU。" ^( K0 H8 |4 o# |$ T
6 E# g8 i# C, \' V( e4 j% ], z0 N/ h
     这个选项可以设置在frontend或backend上,只要其上可以建立连接。这个选项可以与 "option httpclose"结合, 使服务端keepalive,客户端close,但并不建议这样做。

  x8 V* w0 p: c3 q; f7 o0 A
balance <algorithm> [ <arguments> ]
  [! C2 \0 |! wbalance url_param <param> [check_post [<max_wait>]]/ X2 j# a- a$ i) Z
  定义选择后端服务的负载均衡算法
7 @* H+ t3 @/ i% b5 ?  May be used in sections :   defaults | frontend | listen | backend
% h) m: o  e2 W( f                                               yes   |    no    |   yes  |   yes4 ]# ?( Y2 \+ A5 g0 w8 p, W' V$ d6 Y
  Arguments :& M$ u  y. v- Q+ y7 |9 |
    <algorithm> 是负载均衡时选择服务器的算法,没有持续信息时可用,或连接重定向到另一个服务器。<algorithm> 可以是以下几种:
$ f3 D: L( d4 q( |0 k' B& R      roundrobin  每个服务器根据权重轮流使用,如果服务器的处理时间平均分布,这是最流畅和公平的算法。算法是动态的,对于实例启动慢的服务器的权重会在运行中调整。每个backend的活动服务器在设计上限制为4128个。在一些大的群里面, 当服务器很短的宕机后恢复回来,有时会有几百个请求被重新整合到群当中,并开始接收处理。尽管很少发生,但是很正常。这也说明了有机会监视它们,所以不必担心。, S4 F) U4 }; j- a. M0 S, t
6 z7 y( {# S8 K+ w1 z8 @$ a8 M& y
      static-rr  每个服务器根据权重轮流使用,类似roundrobin,但它是静态的,意味着运行时修改权重是无效的。另一方面,它对服务器的数量没有设计上的限制,服务器启动后便会立即进到群中,整个分发方案会重新计算。这会略微降低CPU的运行(约1%)。
) E% S0 ?3 l0 g, Z; E9 W" o- b
  F: U! J  R7 P  B      leastconn  连接数最低的服务器优先接收连接。Round-robin用于负载相同的服务器,使每台服务器都被使用。leastconn建议用于长会话服务,例如LDAP, SQL, TSE等,而不是很适合短会话协议,如HTTP。算法是动态的,对于实例启动慢的服务器的权重会在运行中调整。' g! T8 E8 `- o( ~; s0 K
* n6 R4 o  h" o
      source    对源IP地址进行哈希,用可用服务器的权重总数除以哈希值,根据结果进行分配。只要服务器正常,同一个客户端IP地址总是访问同一台服务器。如果哈希的结果随可用服务器数量而变化,那么有的客户端会定向到不同的服务器。该算法一般用于不能插入cookie的TCP模式。它还可以用于广域网上,为拒绝使用会话cookie的客户端提供最有效的粘连。该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是算法会根据"hash-type"的变化做调整。
4 S1 O2 U' a$ ^6 p2 t+ L0 C& P' F
      uri        对URI左端(问号之前)进行哈希,用可用服务器的权重总数除以哈希值,根据结果进行分配。只要服务器正常,同一个URI地址总是访问同一台服务器。一般用于代理缓存和反病毒代理,以最大限度的提高缓存的命中率。该算法只能用于HTTP后端。该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是算法会根据"hash-type"的变化做调整。
% f. d+ E$ c/ b) V1 k3 _. o                  算法支持两个可选参数"len" 和 "depth", 都是后跟正整数。“len”参数指定算法只处理URI从头开始的字符数,据此计算哈希。因为大多URI以"/"开头,所以"len"最好不要设为1。"depth" 参数指定URI中最大的路径深度,据此计算哈希。请求中的每个斜线为一级。如果同时声明了这两个参数,则截取URI时必须同时满足。4 w# \  s8 U- Q& B
2 J, R0 V* D5 p9 B
      url_param  在HTTP GET请求的查询串中查找<param>中指定的URL参数。
" L1 ]" Z& J+ V; A                 若使用了修饰符"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被用了,则只能检查第一个块。如果参数值被块边界分隔开,则只能随机均衡负载了。
( P, ]' I' I- X) N6 V% Q                  如果参数后面跟着 ('=') 和一个值,则可以根据这个值进行哈希,用可用服务器的权重总数除以哈希值,根据结果进行分配。
( F6 P& |* u( }5 n1 ]) ]                  还可用于跟踪请求中的用户身份,只要服务器正常,同一个用户ID的请求总是发给同一台服务器。如果没有参数或参数没有值,则使用轮询算法。该算法只用于HTTP后端。该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是算法会根据"hash-type"的变化做调整。* V4 u( h$ I+ Y: u- _& `0 ^4 A
& N! Q' K( M0 U0 O, ?
      hdr(name)  在每个HTTP请求中查找HTTP头<name>。与ACL函数'hdr()'一样。括号括起来的头名字不区分大小写。如果缺少头或头没有任何值,则使用roundrobin算法代替。                  4 J. M) W* B' E. x6 ]$ J8 ?1 A  g
                       启用参数'use_domain_only',哈希算法将只用于一些类似'Host'的特定头的主域部分。例如主机值"haproxy.1wt.eu",则只考虑 "1wt"。该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是算法会根据"hash-type"的变化做调整。4 ]7 I. x& y6 f$ T+ X8 r
* S! b7 x; E- F( Y% e0 S
      rdp-cookie
7 R4 W3 O( F4 o      rdp-cookie(name)
0 d% a9 J6 ~5 _" j3 |% r2 D! S                  为每个进来的TCP请求查询并哈希RDP cookie <name> (或“mstshash”如果省略) 。与ACL函数 'req_rdp_cookie()'一样,name不区分大小写。该机制用于退化的持久模式,可以使同一个用户(或同一个会话ID)总是发送给同一台服务器。如果没有cookie, 则使用roundrobin算法代替。
+ v( E& b4 z  k, m* @% \                  必须注意该声明要生效,前端必须确保在请求缓冲中已经有RDP cookie,所以必须使用规则tcp-request content accept' 和ACL 'req_rdp_cookie_cnt'相结合。
; s2 |  Q0 h1 O+ h: i                  该算法默认是静态的,所以运行时修改服务器的权重是无效的,但是算法会根据"hash-type"的变化做调整。/ r6 @  A+ p8 J

4 Q) l3 g# X# m  X    <arguments> 是用于一些算法的可选参数列表,目前只有"url_param" 和 "uri" 用到,例如:2 N" m8 n$ f, g2 a9 w1 N/ u
                balance uri [len <len>] [depth <depth>]
: S1 v, [3 c9 ^. D! B                balance url_param <param> [check_post [<max_wait>]]
+ @* R  }+ s% \: f1 g/ i
* d' d( k! p! j' Q) w  b  如果没有其他算法、模式或选项的设置,后端的负载均衡算法默认为roundrobin。每个后端只能设置一种。- |( n/ y; ^5 W; ^
  Examples :. n# N0 T5 E7 _7 p5 Z, r
        balance roundrobin6 f4 F- z6 _& J" i7 ?" n
        balance url_param userid
3 e$ z' r+ y$ x) Q        balance url_param session_id check_post 64
( ~: P( N, h: E. j+ _        balance hdr(User-Agent)
3 U0 h) D0 N2 I$ l        balance hdr(host)5 R  W% I2 T0 N
        balance hdr(Host) use_domain_only
1 {1 S! u/ q' i  E. y5 F$ |- k' a" \( `
  注意:  以下的警告和限制是使用“check_post“扩展和”url_param”所必须考虑 :
2 u  |, h1 a' \/ ~    - 所有POST请求都要考虑,因为在包含二进制数据的体或实体中,没有办法决定是否会找到参数。因此需要另一种方法,限制POST请求的体中不含有URL参数 (见 acl reqideny http_end)
    - 大于请求缓冲大小的 <max_wait> 值是没用的。在build时设置缓冲大小,默认16KB。
) k9 Y9 I- t+ O! h4 _5 ~2 o$ Q    - 不支持Content-Encoding, 参数搜索会失败;负载均衡会改用 Round Robin。$ B1 b4 j7 v) d! Y5 s
    - 预计: 不支持100-continue,负载均衡会改用 Round Robin。
4 R3 w6 H$ ]9 Z0 L) k+ v  K" y    - Transfer-Encoding (RFC2616 3.6.1) 只在第一个块中支持。如果在第一个块中的参数值不完整,选择的服务器就没有定义。(实际上取决于在第一个块中定义的有多小)
" M2 M) i2 Q) x6 q2 S    - 该特性不支持生成100, 411 或 501 响应。
' Q4 ?2 z9 V; v; P, p    -  有的情况下,需要"check_post"只是要查看整个消息体的内容。检查一般会停在任意数量的空格(LWS: linear
+ g8 _: j; Y) Y+ B1 |& ]: R/ L; b      white space)或控制符上,表示这可能是一个URL参数列表。这可能不是一个关于SGML的类型消息体。
8 |& q+ p; d$ ~& E, I% Z! T; a
9 k/ f1 ?# w+ ]# l1 A6 x! k7 E9 w; O  See also : "dispatch", "cookie", "appsession", "transparent", "hash-type" and "http_proxy".

0 n5 V7 z' t% \2 _& c$ D
hash-type <method>- \0 c- ]# W" O/ M
  将哈希映射到服务器的方法。Specify a method to use for mapping hashes to servers! t! w7 @" k& ]# s! t
  May be used in sections :   defaults | frontend | listen | backend2 U- O' S/ G4 z/ ~4 @; x
                                               yes   |    no    |   yes  |   yes
6 R" D* I$ H; z1 [$ c, }1 A( Q3 i  Arguments :
5 l! _1 j* V3 }1 ]9 s    map-based  哈希表是包含所有在线服务器的静态数组。哈希结果很平滑,并考虑了权重,但是会忽略服务器启动时的权重变化,也就是说不能慢启动。另外,服务器是根据数组中的位置所选择的,所以服务器数量变化时,大部分映射也会变化。当一台服务器启动或关闭,或服务器加入到群中,大部分连接会再分配给不同的服务器,这对有缓存的实例会比较麻烦。
    consistent  哈希表是由每个服务器构成的树,会在树上查找哈希Key,并选择最近的服务器。这种哈希是动态的,支持服务器启动时修改权重,所以可以慢启动。它有一个好处是当服务器启动或关闭时,只有其本身的关系被移除,当服务器加入群时,只有一小部分的映射会被重新分配,所以是一个比较理想的支持缓存的算法。但是根据其原理,算法不会非常平滑,有时候必须调整服务器的权重或ID来获得更平衡的分布。要保持多次负载均衡时的相同分布,服务器ID是绝对不能变的。(roloand:haproxy根据服务器的ID初始化其哈希值)
. O$ G: t) x7 n- G' o6 T4 I/ z! k: F   默认值是"map-based",建议大部分情况下使用。3 ^* [$ }/ ~0 l  z# C
+ i4 ^" y* \, p2 m9 G# M
  See also : "balance", "server"
+ S. D/ [0 ^, F# {5 W& X
dispatch <address>:<port>3 }4 J2 j6 E: l! U! ~
  设置一个默认的服务器地址  z2 Z  h/ K+ d9 A
  May be used in sections :   defaults | frontend | listen | backend
1 {# J5 W$ [% ]% M; S0 v7 y                                               no    |    no    |   yes  |   yes
, |) z! H% d$ k. l4 i  Arguments : none
2 O3 w' U. p) e; _    <address> 默认服务器的IPv4地址,也可以是主机名称,名称只在启动时解析为IP地址。
! u7 w- w6 n8 ]/ r2 T    <ports>  端口号,所有连接都会发送给这个端口,但是不允许像其他服务器一样使用端口偏移(port offsets)。
   "dispatch"关键字指定了一个默认的服务器,用于无可用服务器时的连接的处理。过去常用于前传非持久连接给后备负载均衡器,由于定义简单,还用于简单的TCP中继(TCP relays)。 建议对于明确的连接处理,应使用"server"直接声明。
====================
一:Global parameters2 e/ n$ W7 \  E: F) [: r
* Process management and security$ K8 B) \. l6 X3 _  ~
- chroot 改变当前工作目录! |* R8 o0 y8 o$ j) c/ `* u
- daemon 运行方式为后台工作
8 f$ n5 \, q' H# W$ k0 o- user - group 工作用户和组* j8 M* L$ }# U) Y
-log <address> <facility>日志输出设备3 D- j: y3 W, J5 X
- nbproc 创建工作的进程数目
' |3 Z/ ]7 h. _1 D0 G+ u/ H' C-pidfile pid文件位置5 l! T' P1 D2 ], e3 e3 E
- ulimit-n 设置每个进程的可用的最大文件描述符
4 O9 T9 i! a; @- stats 创建监控所用的套接字目录
! a5 G. g, q7 y  s* C0 `' H# z- node 创建另外一个节点名字共用一个IP地址,用来识别哪个节点在处理流量' b% {0 e  G* @0 @, l
- description 描述实例的名称
7 R7 q6 p0 w/ L: n) ^6 X% _maxconn <number> 每个进程可用的最大连接数' |9 W1 J* l, q/ s6 _  y! p1 n* U0 @
maxpipes <number>  每个进程可用的最大管道数
# I; L3 O- [, F* ^' Vnokqueue  nopoll  nosepoll nosplice  禁用这些功能' d/ k* k" M3 V7 z% S  \1 @8 B
spread-checks <0..50, in percent>  health check 的时间间隔
6 n& S3 D3 {* c- x$ k8 B' S  Mtune.bufsize <number>
/ r  n& w5 u  o( M0 y& ~) Ftune.maxaccept <number>
3 ~+ W7 X9 @- atune.maxpollevents <number> , G; W8 k6 l( p$ d. \# [6 ?: x
tune.maxrewrite <number>
9 a& S  D) L; D4 e* D* Vtune.rcvbuf.client <number>
' g  N) r6 l* W' i# n! ttune.rcvbuf.server <number> & I+ p" \. Y6 T# m6 p  z5 N
tune.sndbuf.client <number>
; C# T" q& A, r. l. Q+ ~3 gtune.sndbuf.server <number>
  n5 E4 C1 L0 n7 f4 D+ ^: K以上凭字面理解吧' N8 d7 i* \% z- V4 J
debug  调试模式,输出启动信息到标准输出
$ `7 B3 N; h$ f3 aquiet   安装模式,启动时无输出8 u) h8 G0 ^+ v" C. ]3 \% z) B
0 i  N  \) B$ L7 s. J9 T* X4 ]
二:defaults 块
, U" i+ {( u& |- c& o2 ]+ m4 x作用于其后紧跟的listen块,直至下一个defaults 块,下一个default 将替换上一个块作用于以后的listen* j8 g7 u' a* b; z. y, J) o
frontend 块,接受请求的端口组
; y) y8 M; W; m& y4 R3 zbackend块,后端处理的server 组
4 x  y3 d( b, nlisten块,frontend和backend 块的结合, t9 ^$ N0 E, S& @  Q, {( D
% ~9 k' f! h, j6 J3 l. T
三:常用配置命令
9 r  V" g( Y7 B2 q4 m. h
7 p/ `+ ^9 f$ U- S9 i2 Zbalance <algorithm> [ <arguments> ] 8 i  l4 _  h) u$ H' n
balance url_param <param> [check_post [<max_wait>]]   负载均衡模块设置
: e" w7 f2 t, G! T
( i# i4 p! P7 G1 r4 H1 QExamples :
2 _, {" |' G+ jbalance roundrobin
; {7 @  x3 ]4 c' p+ Q+ Dbalance url_param userid  
3 e' A- ?& s$ m% a+ d* tbalance url_param session_id check_post 64
$ {! B; i7 d7 r& X, j, dbalance hdr(User-Agent)
# y  w" f' y7 Z0 _3 ]& Z% |: }1 rbalance hdr(host)
; u+ c1 a# `- S' ^& Gbalance hdr(Host) use_domain_only 8 G% l9 s9 d; H% A& W3 w  V2 Q$ ]& A7 t

" L$ p! t+ ~2 r, }block { if | unless } <condition>  在7层阻止访问
4 B4 ^8 {) x$ Y  l3 t6 n' JExample: 3 l+ }# m7 ?* x& }7 O
acl invalid_src src 0.0.0.0/7 224.0.0.0/3  acl定义和squid 很像
4 m$ b+ Q- d9 r5 I: L; Kacl invalid_src src_port 0:1023
  p% R; H' P2 X, |: Macl local_dst hdr(host) -i localhost
) _# @* F) C8 q2 @; M7 Fblock if invalid_src || local_dst ( o$ O1 |2 L5 O. b+ u; y) O
+ m7 f! e; I- N" m3 B- f& `/ [
capture cookie <name> len <length>  在请求和回应包中捕捉记录指定长度的cookie,name 为cookie的开头几个字母: ~  ?2 s! P4 q& `
& h/ f  g8 n+ M( K/ q% p7 j+ Z
Example:
3 R- n% ~, ?* X5 Z7 g5 |0 Rcapture cookie ASPSESSION len 32 ( ]4 {$ I. _$ y4 @2 }: [

. D- ^/ B2 T. s1 L9 qcapture request header <name> len <length>
/ H* ^9 q! N2 d3 qcapture response header <name> len <length> 同上: x5 q% t: x) N" ?4 t
) Y  Q! U5 [# B; I0 C3 z3 n
clitimeout <timeout> (deprecated)
* l/ M) F9 g" P9 e. P6 B1 Xcontimeout <timeout> (deprecated)  客户端超时时间,不赞成设置3 ~0 E. A3 h0 h$ ?  i7 a4 |0 \8 B

* {  a/ S* G7 W/ W8 j& ~# V0 scookie <name> [ rewrite | insert | prefix ] [ indirect ] [ nocache ] [ postonly ] [ domain <domain> ]*   允许持续的基于cookie 的后端连接8 A% _* t% ?' T8 N8 W- l+ s

6 m4 w# ]) ^% X5 W. M& fdefault_backend <backend> 默认应用的后端  B9 V0 X% `9 g* U* d
, V/ _2 K1 q) L. W, g; `
Example :
( I" y5 G& _! v3 f4 Y" yuse_backend dynamic if url_dyn . \* g/ H  t- n8 k
use_backend static if url_css url_img extension_img
; Q2 E  ?  R- Rdefault_backend dynamic    当没有匹配时就用dynamic9 @) @+ @; j+ J

6 [# y- I. r) v5 J$ E  I. zerrorfile <code> <file> 定义出现错误的代码的返回页
) [/ N  M8 d0 z4 _! ]9 H% ^Example :
3 t) h9 d1 v7 j& a7 j+ ~errorfile 400 /etc/haproxy/errorfiles/400badreq.http ; p3 i: ^) U% C- |$ E
errorfile 403 /etc/haproxy/errorfiles/403forbid.http
2 t, o  T" p8 }: e. O9 A* u/ serrorfile 503 /etc/haproxy/errorfiles/503sorry.http & l% P& I! y, x/ [( B0 a. f
& g5 b3 u4 D7 v6 n' Z. ?$ Z
& y" Z( l0 u. ]- q- J
errorloc <code> <url> errorloc302 <code> <url>   出错重定向到指定url
! i; a" F0 ]4 U3 t% S8 ^" q0 _force-persist { if | unless } <condition>  在特定条件下,强制继续连接down 掉的服务器后端/ u9 ?+ v% s/ C, H
fullconn <conns>  定义后端组的最大连接数
1 |2 J5 D9 ~6 r9 vgrace <time>  haproxy停止后,再持续多长时间用于处理连接
" F  I+ O4 J# x. m! c- [http-check disable-on-404  如果后端检测返回404,将不再把后端计入负载均衡* W3 Q( m- I; X
http-check send-state 允许haproxy 发送 X-Haproxy-Server-State
; |4 _' @3 c0 b. D4 |- mhttp-request { allow | deny | http-auth [realm <realm>] } [ { if | unless } <condition> ]   七层访问控制3 Y0 @+ s$ ?% e6 R* v
Example:2 b/ d. V+ _6 S4 k
acl nagios src 192.168.129.3
/ t" H$ S/ z& `; Cacl local_net src 192.168.0.0/16
9 H) n5 v7 ?+ m: T% Z4 i; a# Vacl auth_ok http_auth(L1)
2 E( c9 g9 ^6 u! H1 i8 C
& [. e- S4 o" g/ x+ j: y0 o, Dhttp-request allow if nagios; o) Y& w! k& O4 m8 g
http-request allow if local_net auth_ok
8 g$ d. R2 c3 g: d0 J4 ?% h# Fhttp-request auth realm Gimme if local_net auth_ok
) ?9 d# {# T' I6 z' t) uhttp-request deny# z. G  i& A& u! a

: I4 O6 a0 z! q! {5 `5 EExample:
9 f' j: a+ \6 z, G- [. Y. p4 Aacl auth_ok http_auth_group(L1) G1
# n7 _  D& u/ V
' U7 T; o' ~* Q9 C1 xhttp-request auth unless auth_ok5 B$ L; |& D  @0 p
" m7 N+ s: w0 H! k
mode { tcp|http|health }   设定启动的实例的协议类型
* V4 L# E: {3 ]2 z0 ~! ^2 Wmonitor fail { if | unless } <condition>  监控失败条件设置
& K* D( ]# R6 l& U# I* K1 [0 ]" x3 E8 ^0 R8 E
option abortonclose 丢弃由于客户端等待时间过长而关闭连接但仍在haproxy等待队列中的请求8 L# K7 M' J( a8 G
option accept-invalid-http-request  接受无效的http请求,建议关闭(开启可能有安全隐患)3 G6 f% [) t* L) E+ `
option accept-invalid-http-response 接受无效的response ,建议关闭
  _' h* m/ N1 k# d9 w3 Xoption allbackups  应该是后备服务器,如果正常的后端无法使用,就使用这些后备的设备,balance方式还是用原来的,没有优先的选择,常用来提供错误的页面
# b" z- A4 ?4 E! L8 aoption checkcache    分析后端response,阻止可缓存的cookie,它对response 进行严格检查,包括"Cache-control", "Pragma" and "Set-cookie" ,查看在客户端代理那边保存是否有风险,如果这个允许的话,符全以下条件 的response 将被允许,其它的将被阻止。4 V% W' u( }8 h* ~0 D' ]
- all those without "Set-Cookie" header ;
9 _& d+ {0 Q! X3 Q+ T3 l, `: X- all those with a return code other than 200, 203, 206, 300, 301, 410,! F# E- |9 ~' v( M1 e
provided that the server has not set a "Cache-control: public" header ;& K0 s' ]/ ^2 j- p& T
- all those that come from a POST request, provided that the server has not
7 Y/ c% ^; f' Z- s* m. K4 R. Pset a 'Cache-Control: public' header ;: P5 ?) r- k1 t% \0 s/ W
- those with a 'Pragma: no-cache' header
( Z) m) F) c( m5 Z- those with a 'Cache-control: private' header" W' ]9 s, P6 J5 n; D0 R( w$ g  u
- those with a 'Cache-control: no-store' header
. `. U5 F4 m3 X/ v3 ?, t- those with a 'Cache-control: max-age=0' header
0 b$ c) P- @8 ^6 J. D: p- those with a 'Cache-control: s-maxage=0' header) l! a- Y4 H0 f& U  ^
- those with a 'Cache-control: no-cache' header
# {$ h" `1 M3 s' G$ {$ \2 m/ q3 W- those with a 'Cache-control: no-cache="set-cookie"' header# H( D/ c. Q7 n' b5 ~
- those with a 'Cache-control: no-cache="set-cookie,' header
- p+ }0 y) E; H. h(allowing other fields after set-cookie)& @4 i- H: V' ?7 |8 H
4 h! F% E' A8 W
option clitcpka   是否允许客户端发送tcp keepalive 包,这个和http 的keepalive 没有关系5 B! ^% G( v; \# N7 ]
option contstats   允许连续的流量统计更新
, l8 E" n& \2 `5 m; K6 V; t0 `option dontlog-normal   开启正常连接的日志5 {9 N/ S9 [! w8 E% D
option dontlognull   记录空连接  Z5 b8 Y. m' n
option forceclose  允许关闭session 在后端把response 发送后$ i5 I4 ~; Z2 b9 q+ Q2 V' B  T
option forwardfor [ except <network> ] [ header <name> ]        允许在request 中加入X-Forwarded-For header 发往server
( e$ ?( s1 a! `( n6 }* D8 l5 Aoption http-pretend-keepalive    定义是否haproxy要宣布同server keepalive9 Y7 ~, [) ^& c; _% Y
option http-server-close   是否开启在server 端 connection closing" \3 n* E: H# X% i% h, W$ i' B
option http-use-proxy-header    用non-standard Proxy-Connection 替换 connection
: u: R/ ~& m1 J# M: }# _+ d7 P9 x1 t
- E2 N3 D3 ~- D! z. h' K
option httpchk <method> <uri> <version>  允许用http协议检查server 的健康
" W8 I. Z5 Q8 F6 GExamples :
' x# p% g( i0 {6 Z8 N: f# Relay HTTPS traffic to Apache instance and check service availability
# r. u9 e( Y+ X8 P8 T# using HTTP request "OPTIONS * HTTP/1.1" on port 80.
2 Q0 Z% w9 G& `. R1 S) T8 m1 s) Obackend https_relay- i* |2 ~! b1 g. ~
mode tcp! ?& u! B" d( j- `
option httpchk OPTIONS * HTTP/1.1\r\nHost:\ www/ W& I/ A6 q2 q
server apache1 192.168.1.1:443 check port 803 |, y( Y5 o9 @7 {; u" d  q/ a
- ]4 l! d* g  e( U- A9 ?; z
option httplog [ clf ] 定制日志格式, y! B  ]  z6 b) A+ ~0 m, U
option http_proxy  开启http 代理模式,只有最基本的代理功能' n1 {  Z  l; i3 W: d! O9 k& w
option ignore-persist { if | unless } <condition> 在某条件下拒绝持续连接,适用于对静态文件的负载均衡, `8 N" t7 [) Y/ k. N0 p
option independant-streams  启用双向超时处理,如socket 的read 和write
- T. v5 ]+ `$ P* w2 @* F9 ^option log-health-checks   记录健康检查日志
$ ]( ~$ w1 O* {9 z  g( a+ Boption log-separate-errors   对非完全成功的连接改变日志记录等级
( ?! q! [6 L4 G5 N- d0 Zoption logasap   大传输大文件时可以提前记录日志
% L0 f1 u0 b4 z' ^* ]& Zoption mysql-check   mysql 健康检查
8 f/ z1 q& A( @7 d% g! i3 Eoption nolinger  清除肮脏连接后开成的tcp 状态及占用的资源,不过并不是强列要求你用这个选项,当然如果你有thousands of FIN_WAIT1 sessions on your system ,那肯定得用了
3 a; q& z" O, I: N- _option originalto [ except <network> ] [ header <name> ]   允许在requests中加入X-Original-To header 发往server% @9 k4 a6 @( u& q/ D6 Q% s
option persist     强制将http请求发往已经down 掉的server# Y  Q  f, L; ?3 o& s  L
option redispatch   是否允许重新分配在session 失败后
. s: C7 S( F" B+ Qoption smtpchk   smtp 检查# m7 M9 C$ L0 z3 J9 N2 n
option socket-stats  允许对单个socket进行统计  ]& @! D1 r; O
option srvtcpka  是否允许向server 发送keepalive
- s* v  F0 U' i1 |1 t' L! goption tcpka 是否允许向server和client发送keepalive. [, o0 A2 l; m. g. _' G
option tcplog  允许记录tcp 连接的状态和时间/ d( ^/ S* b% v  n  V3 g- m7 H
option transparent   允许客户端透明代理! s7 n* |  l+ L5 r' }. v$ H
rate-limit sessions <rate> 设置frontend 每秒处理的连接的上限,如果到达上限就停止建立新的connection
6 U4 t1 A7 z9 _  ]  C- k9 W
) I- P# j( b' k1 G( D: z) Predirect location <to> [code <code>] <option> [{if | unless} <condition>]8 I& t: M3 V6 r, H6 [
redirect prefix   <to> [code <code>] <option> [{if | unless} <condition>] 重定向,相当于rewrite+ z# l( j, s. L9 s3 w$ Y' q  n

+ y2 x/ n' h) T+ F  xExample: move the login URL only to HTTPS.9 @  T- z7 r+ L( a3 s0 b/ q; {
acl clear      dst_port  80
( o0 w  U! ]7 Q  H8 N, qacl secure     dst_port  8080
; w2 i' O) }1 I3 _. l' f- hacl login_page url_beg   /login
* a2 Y0 \* ~4 r+ q- D+ Facl logout     url_beg   /logout
$ A& u/ m; U) z* k- lacl uid_given  url_reg   /login?userid=[^&]+
% g5 I! W# m0 Z6 h9 L* Eacl cookie_set hdr_sub(cookie) SEEN=1$ e; }; ^0 f- F' G8 K  b

' ?9 H  X! _8 Rredirect prefix   https://mysite.com set-cookie SEEN=1 if !cookie_set
6 I% }; q' F, W+ Q5 e+ C, Dredirect prefix   https://mysite.com           if login_page !secure
. Z% v, d3 d' U( k" @1 tredirect prefix   http://mysite.com drop-query if login_page !uid_given
9 k" l& h% \8 v0 d; i" J* B/ m; \$ @! xredirect location http://mysite.com/           if !login_page secure
6 ^9 Z/ x6 c: j9 J; v6 Nredirect location / clear-cookie USERID=       if logout
* T: ^: ~9 K/ y" z, e' }' j+ I" j* u  r* ^( C6 E- r
Example: send redirects for request for articles without a '/'.
: J  o( i. e$ l% g7 Y& Zacl missing_slash path_reg ^/article/[^/]*$
9 y9 E0 o% L# fredirect code 301 prefix / drop-query append-slash if missing_slash
9 V: V1 B0 ]5 v) u+ h" ?1 oredisp (deprecated)
1 |/ {+ L% X0 |+ o5 ~/ T; V5 v& Bredispatch (deprecated) 开启session 重新分配在connection连接失败后,不赞成启用
3 z+ s  q) y  B# M/ K0 P" u6 I4 C. dreqadd  <string> [{if | unless} <cond>] 在http请示的末尾加上string
5 |9 S# M* B) b8 r
) o0 x, A$ A. X( v+ ~. s% JExample : add "X-Proto: SSL" to requests coming via port 817 T1 E% ~$ O# t/ m
acl is-ssl  dst_port       81/ \7 A$ N" W1 M- Q: g
reqadd      X-Proto:\ SSL  if is-ssl
2 o/ c0 _6 a5 H7 k" a
- b+ Q  n" E4 A# r5 ]reqallow  <search> [{if | unless} <cond>], @' J) n5 E' l8 C: m
reqiallow <search> [{if | unless} <cond>] (ignore case)    request 请求访问控制
7 d: l" k. e  F+ X/ A% P8 _, Y8 Y& X' N5 z$ M# t
Example :+ W$ v8 |  @; u8 k! p
# allow www.* but refuse *.local1 T) L  y6 r) k
reqiallow ^Host:\ www\.
3 [; S: N  a4 J6 Creqideny  ^Host:\ .*\.local
$ r3 |6 I6 a% U0 J( f8 B
( t. S6 L# m1 b7 C# }6 Yreqdel  <search> [{if | unless} <cond>]
9 d7 l2 k' `  n. P( W; }reqidel <search> [{if | unless} <cond>]  (ignore case) 删除请求的head 中的内容
4 X, [2 Z$ V. l4 G& u* S
+ O0 x1 L# Y0 {3 K) MExample :4 _6 U, ~7 y! h+ a8 V* F8 U
# remove X-Forwarded-For header and SERVER cookie6 H3 h# L/ |, q! Z9 E6 b
reqidel ^X-Forwarded-For:.*
* x6 G) ?; {( _7 _, d+ l+ [6 Jreqidel ^Cookie:.*SERVER=
) b  ?9 f8 W; f" r: L7 b7 a4 e" v+ L4 L" l  d2 ]

: u' }+ k& H  Z8 E: T' xreqdeny  <search> [{if | unless} <cond>]
/ O, R9 n, p* O& @( Dreqideny <search> [{if | unless} <cond>]  (ignore case) 拒绝访问6 r$ y# P9 L  N
: X/ x& {5 S$ j! R4 _' z
reqrep  <search> <string> [{if | unless} <cond>]
, v4 t$ e% [  Vreqirep <search> <string> [{if | unless} <cond>]   (ignore case)  request 请求替换
$ U; c) V! e# ?+ ?Example :
0 Z9 b, I1 i( S. ]$ p  O# replace "/static/" with "/" at the beginning of any request path.
, r- w2 P  M, x7 e( ?  Treqrep ^([^\ ]*)\ /static/(.*)     \1\ /\2
2 h6 d5 s1 K) @& M  Y# replace "www.mydomain.com" with "www" in the host name.
9 \; }$ f  n) P, Z7 w3 Hreqirep ^Host:\ www.mydomain.com   Host:\ www* h% c8 L1 w# F

) y4 u" M2 h0 E8 oreqtarpit  <search> [{if | unless} <cond>]
/ H& ~0 |! r; X- F' rreqitarpit <search> [{if | unless} <cond>]  (ignore case) 阻止http请求中的某些信息, T2 K5 D- V3 d; e# V, y6 J( B
4 C, M- {3 i  q$ M3 L) ~: k- C5 G# \
Examples :3 L7 q" z3 ~! y3 {2 _
# ignore user-agents reporting any flavour of "Mozilla" or "MSIE", but# Y$ i8 R8 h  R$ a1 y# Y
# block all others.' p1 r$ P; w  p; N
reqipass   ^User-Agent:\.*(Mozilla|MSIE)
& \! _0 I- w1 _, u" n) x1 ^% Wreqitarpit ^User-Agent:
* V& F% x' n- G+ x% K  n" v' g
8 @& _- C2 Q3 V+ ?! |  i# block bad guys
/ P. w# a9 k* W" Sacl badguys src 10.1.0.3 172.16.13.20/280 i& q$ n) F2 ?" g
reqitarpit . if badguys8 L. s. y$ z3 Z9 a5 r% S

7 N, U6 R8 P) _) O9 x0 |retries <value> 当对server的connection失败后,重试的次数
. \) T- E  y: ]& k' qrspadd <string> [{if | unless} <cond>] response 增加信息. ], h  u$ h+ N; w2 K/ Q$ B; P; i. l5 N
rspdel  <search> [{if | unless} <cond>]1 S2 N, n7 S. f0 V& v
rspidel <search> [{if | unless} <cond>]  (ignore case)
# [) [: e+ R" V/ }+ T- J9 _rspdeny  <search> [{if | unless} <cond>]8 W; G" t" ^% ~* t" {# T4 \
rspideny <search> [{if | unless} <cond>]  (ignore case)! _4 c2 J9 l8 d, x+ r# J4 W$ F
rsprep  <search> <string> [{if | unless} <cond>]
- m! ]7 {0 H6 l; d2 hrspirep <search> <string> [{if | unless} <cond>]  (ignore case)
1 Z  }! N) T5 \以上和request 的差不多
" ?$ u* N' ?# q- H  m, O- w
4 H9 ~, B" M- lsource <addr>[:<port>] [usesrc { <addr2>[:<port2>] | client | clientip } ] 定义从代理出去的连接的对象,用于限定地址可以访问server
: s; o: `0 i: e0 B* y9 {, e2 d! N4 O* _  `2 W+ M3 C# u- Q
一些timeout
" O* x( R, M8 r  M5 ?, C$ X' B. U/ {8 {; Q3 n+ i4 g0 U
srvtimeout <timeout> server 处理超时,不赞成设置& T0 i9 e' i7 w/ k. }( q. v1 T
timeout check                             X          -         X         X
0 n6 Y6 X% H. w/ L& ktimeout client                            X          X         X         -  R* A, ^1 S/ r$ m# m8 d0 L
timeout clitimeout          (deprecated)  X          X         X         -2 w  N5 n5 F& j0 }
timeout connect                           X          -         X         X" d. _  Q! Q! u
timeout contimeout          (deprecated)  X          -         X         X; T% y% }- i5 [
timeout http-keep-alive                   X          X         X         X( @" l/ |, {+ U3 P1 L0 E
timeout http-request                      X          X         X         X
, H- Y- {3 @& i5 C. _2 s9 H) \timeout queue                             X          -         X         X
0 Q) E- P& U# `+ p; W6 h: ftimeout server                            X          -         X         X* Z* y% v1 w0 p' B4 L
timeout srvtimeout          (deprecated)  X          -         X         X
8 I, l! L0 E6 \  Ptimeout tarpit                            X          X         X         X
2 |/ _  R1 I* t. y5 Z& A
* a4 V- |1 M3 |6 U" _  U. D8 ^' j& n4 c, l5 _" @
stats auth <user>:<passwd> 监控统计的帐号和密码# O1 K& V; y! {
backend public_www
. ~5 T& D& L/ i! k- lserver srv1 192.168.0.1:80, j: F9 `/ h9 e7 j
stats enable5 a% A+ i' h. Y" j* M
stats hide-version. K% [6 a' N0 q" u" c4 K$ Y5 R$ [
stats scope   .: t0 V; S" }6 z1 B9 N; G
stats uri     /admin?stats
; g2 S4 u; p: k! @stats realm   Haproxy\ Statistics9 L# R& d4 P) P' R& W' x
stats auth    admin1:AdMiN1234 Y6 L. Q0 ]) b( I3 e" q4 L
stats auth    admin2:AdMiN3210 a  J) A8 V% h& E0 s

* F& W$ \* |* L. f9 m/ F) q; B# internal monitoring access (unlimited)
9 ~0 _) R0 y6 a# ^4 r5 d. q% rbackend private_monitoring$ X6 D3 z0 ~% s' Z" ~1 M8 B9 s
stats enable! s8 h" R6 p6 Q3 [' @7 T; V/ l% _
stats uri     /admin?stats5 E5 q2 M2 J# d# n2 h  N0 K/ p$ F
stats refresh 5s" w# k6 q" ^# w& i# R9 K  M
# v$ K" y0 L) K8 U5 b
还有很多参数,以上能用到的也没有几个,只要满足当前需求就好,对于性能要求高的话,建议把不需要的功能 都关了吧.
====================
HAProxy的配置示例
HAProxy配置中分成五部分内容,当然这些组件不是必选的,可以根据需要选择部分作为配置。! f8 ?5 p2 D5 x0 J7 \( l6 N6 [
global:参数是进程级的,通常和操作系统(OS)相关。这些参数一般只设置一次,如果配置无误,就不需要再次配置进行修改
# t% W; Q) M; H* F7 K% \defaults:配置默认参数的,这些参数可以被利用配置到frontend,backend,listen组件" [' I- P& {9 ^, }
frontend:接收请求的前端虚拟节点,Frontend可以根据规则直接指定具体使用后端的 backend(可动态选择)。
- b" L/ h; b+ ~. l9 l8 Ybackend:后端服务集群的配置,是真实的服务器,一个Backend对应一个或者多个实体服务器。
* x( J! M4 Z. ~  M* y2 Slisten: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 10:37 , Processed in 0.099818 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

© 2012-2025 Discuz! Team.

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