1. 概念
1.1. 官方网站 http://www.haproxy.org/
2. 安装
yum安装
yum -y install haproxy keepalived
配置haproxy日志,修改/etc/rsyslog.conf
#去掉下面两行的注释
$ModLoad imudp
$UDPServerRun 514
#添加下面这行
local2.* /var/log/haproxy.log
修改/etc/sysconfig/rsyslog
#-r是允许接受外部日志
#-c 是说兼容syslog v2
#-m 是说每隔多长时间加一个时间戳,0表示不加
SYSLOGD_OPTIONS="-r -c 2"
3. 配置文件详解
#--------------------------------------------------------------------- # Example configuration for a possible web application. See the # full configuration options online. # # http://haproxy.1wt.eu/download/1.4/doc/configuration.txt # #--------------------------------------------------------------------- #--------------------------------------------------------------------- # Global settings #--------------------------------------------------------------------- global # to have these messages end up in /var/log/haproxy.log you will # need to: # # 1) configure syslog to accept network log events. This is done # by adding the '-r' option to the SYSLOGD_OPTIONS in # /etc/sysconfig/syslog # # 2) configure local2 events to go to the /var/log/haproxy.log # file. A line like the following can be added to # /etc/sysconfig/syslog # # local2.* /var/log/haproxy.log # ##log 相关的配置## # 定义全局的syslog服务器,最多可以定义两个,用于将haproxy产生的日志发往此服务器予以存储 # log <address> [len <length>] <facility> [<level> [<minlevel>]] # log global # no log # # log-format <string> 日志格式 log 127.0.0.1 local2 # capture cookie <name> len <length> # 记录请求及相应报文的cookie与日志中; # <name>:cookie信息的起头字符; # <len>:记录长度; # # capture request header <name> len <length> # capture response header <name> len <length> # 记录请求或相应报文中的指定的首部的值于日志中; # <name>:指定的首部的名称; # compression algo <algorithm> ... # compression type <mime type> ... # compression offload # algo:identitiy(通常仅debug时候使用),gzip,deflate # tpye:压缩的mime类型,通常仅压缩文本类型的资源 ##进程管理## chroot /var/lib/haproxy #haproxy的家目录 #运行的用户和运行的组,也可以用uid和gid来指定 user haproxy group haproxy daemon #使用守护进程的模式来运行,会在后台运行 # turn on stats unix socket # 打开socket文件 stats socket /var/lib/haproxy/stats pidfile /var/run/haproxy.pid #PID nbproc <number>:指明要启动的haproxy进程数量 #每个haproxy进程所能够打开的最大文件数。应该大于maxconn,但是haproxy会自动计算此数据并为其设定合理值。 ulimit -n <number> ##性能调整## maxconn 4000 #设定单个haproxy进程所能承受的最大并发连接数; maxpipes #haproxy使用pipe机制实现内核级tcp报文重组,每进程所能够使用的最大pipe数量,默认为maxconn/4; ##不建议设置的参数## noepoll/nokqueue/nopoll/nosepoll:禁用事件机制 nosplice:禁用内核级tcp报文重组功能 tune.bufsize: tune.chksize: ... tune.rcvbuf.client tune.sndbuf.client tune.rcvbuf.server tune.sndbuf.server ##其他## spread-checks <0..50> # 百分比 debug quiet ##代理相关的参数## #defaults:用于为listen/frontend/backend提供默认值; defaults # mode { tcp|http|health } # tcp:当代理的为ssl、ssh、mysql等非http协议时使用;默认即此模式; # http:仅当代理的为http协议时使用; # health:工作在健康状态响应模式,当收到请求仅回应“OK”即断开连接; mode http log global option httplog option dontlognull option http-server-close option forwardfor except 127.0.0.0/8 option redispatch retries 3 timeout http-request 10s timeout queue 1m timeout connect 10s timeout client 1m timeout server 1m timeout http-keep-alive 10s timeout check 10s maxconn 3000 #frontend <name>:定义监听的套接字,用于接收客户端请求 frontend main *:5000 acl url_static path_beg -i /static /images /javascript /stylesheets acl url_static path_end -i .jpg .gif .png .css .js use_backend static if url_static default_backend app #backend <name>:定义后端服务器组,用于处理由frondend转发来的用户请求 backend static balance roundrobin server static 127.0.0.1:4331 check #--------------------------------------------------------------------- # round robin balancing between the various backends #--------------------------------------------------------------------- backend app balance roundrobin server app1 127.0.0.1:5001 check server app2 127.0.0.1:5002 check server app3 127.0.0.1:5003 check server app4 127.0.0.1:5004 check #listen <name>:通过关联“前端”和“后端”定义一个完整的proxy server; #bind:指明监听的套接字 #bind *:80,*:8080 绑定两个端口 listen smtp 10.25.2.22:25 # https://cbonte.github.io/haproxy-dconv/1.6/configuration.html#4-balance # balance <algorithm> [<arguments>] # balance url_param <param> [check_post] # <algorithm> # roundrobin:动态算法,支持权重的运行时调整及慢启动机制;最大支持4095个后端主机 # static-rr:静态算法,不支持权重的运行时调整及慢启动机制;后端主机无数量上限 # leastconn:推荐使用在较长时间会话场景中;例如,LDAP,MySQL等协议; # first:根据服务器在列表中的位置,自上而下进行调度;前面服务器连接数达到上限,新请求将调度至下一个服务器 # 适用用会话较长的tcp连接; # source:源地址hash; # 取模法:将原地址hash计算后除以服务器总权重;服务器变动会影响全局调度效果;静态调度 # 一致性hash:服务器变动仅影响局部调度;动态调度 # uri:对URI的左半部分或整个url做hash计算,并由服务器的总权重相除后派发至某挑选出的后端主机; # 作用在于能够将同一个uri的请求始终发往同一个backend server,使用与后端为缓存服务器的场景 # <scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag> # 左半部分:/<path>;<params> # 整个uri:/<path>;<params>?<query>#<frag> # # url_param: # 对用户请求的url中的<params>中的参数的值作hash计算,并由服务器的总权重相除后派发至某挑选出的后端主机; # 此算法通常用于追踪请求中的用户标识,以确保来自同一个用户的请求始终发往同一个backend server; # hdr(<name>):对于每个http请求,通过<name>指定的http首部会被取出;此首部如果没有有效值,则轮询调度; # 否则,对其做hash计算,并由服务器总权重相除后派发至挑选出的后端主机 # # hash:哈希算法的计算方式 # hash-tpye <method><function><modifier> # map-based # consistent # <function> # sdbm # djb2 # wt6 balance roundrobin # server <name> <address>[:[port]] [param*] 定义后端主机中的服务器及其参数 # <name>:服务器的内部名称,出现在日志及警告信息中; # 如果设定了http-send-server-name,它还将被添加至发往此服务器的请求首部当中; # <address>:服务器的地址,支持使用主机名; # [:[port]]:端口映射;省略时,表示与bind的端口相同; # [param*]:可用参数: # backup:设置为备用服务器,仅在所有服务器均不可用时,方才启用 # check:对后端服务器做健康状态监测;无check时表示假设后端主机始终可用;同时可使用辅助参数有很多; # addr:通过此地址进行健康状态监测; # port <prot>:通过此端口进行健康状态监测 # inter<delay>:连续两次健康监测之间的时间间隔,默认为2000ms # fall<count>:连续多少次的失败监测将标记服务器为dead; # rise<count>:连续多少次的成功监测将标记服务器为available # cookie <value>:为当前server指定cookie值,用于谁西安基于cookie会话粘性; # cookie <name> [ rewrite | insert | prefix ] [ indirect ] [ nocache ] [ postonly ] [ preserve ] [ httponly ] [ secure ] [ domain <domain> ]* [ maxidle <idle> ] [ maxlife <life> ] # cookie <name>:is the name of the cookie which will be monitored, modified or inserted in order to bring persistence. # rewrite:重写 # insert:插入 # prefix:添加前缀 # # 基于cookie会话粘性: # cookie WEBSRV insert indirect nocache # server srv1 172.18.100.68:80 check weight 1 max conn 2000 maxqueue 200 cookie websrv1 # server srv1 172.18.100.69:80 check weight 1 max conn 5000 maxqueue 500 cookie websrv2 # # maxconn <maxconn>:当前服务器支持的最大并发连接数;超出此值的连接将被放置于请求队列中; # maxqueue <maxqueue>:当前服务器的队列上限; # redir <prefix>:将发往此服务器的所有GET和HEAD请求重定向至指定的地址; # weight <weight>:权重 # maxconn <conns>: # # option httpchk # option httpchk <uri> # option httpchk <method> <uri> # option httpchk <method> <uri> <version> # # server mail1 10.24.8.4:25 weight 1 maxconn 10000 check inter 10s # server mail2 10.24.8.4:25 check # server hcwhmailproxy01 10.25.8.2:25 check # server hcwhmailproxy02 10.25.8.3:25 check # server hcwhmailproxy03 10.25.8.4:25 check # server hcwhmailproxy04 10.25.8.5:25 check # 统计接口启用相关的参数: # stats enable # 启用统计页,基于默认参数启用统计页; # -stats url:/haproxy?stats # -stats reaml:"HAProxy Statistics" # -stats auth:no authentication # -stats scope:no restriction # stats url <prefix> # 统计页的访问url前缀,通常要跟上?stats; # stats realm <realm> # 设定认证时使用realm # stats auth <user>:<passwd> # 认证的账号和密码;可以使用多次 # stats refresh <delay> # 自动刷新时间间隔; # stats admin {if | unless} <cond> # 在指定的条件下启用admin功能; listen stats 10.25.2.22:9001 stats enable stats uri /haproxyadmin?stats stats realm HAProxy Statistics stats auth admin:admin stats admin if TRUE # option forwardfor # 在发往backend server的请求报文中添加“X-Forwarded-For”首部,其值为客户端主机地址 # option forwardfor [except <network>][header<name>] # except <network>:来自于此网络的请求不添加; # header <name>:不使用默认的X-Forwarded-For,而使用此处定义的首部名称; # reqadd <string>{{if|unless} <cond>} # 向请问报文尾部添加自定义的header # reqdel <search>{{if|unless} <cond>} # reqdel <search>{{if|unless} <cond>}(ignore case) # 基于模式删除删除匹配到的请求报文中的header及其值; # rspadd, rspdel, rspidel; # 相应报文; # errorfile # errorfile <code> <file> # errorloc # errorloc 302 # errorloc <code> <url> # acl <aclname> <criterion> [flags] [operator] <value>... # Declare or complete and access list. # # criterion: # dst IP # dst_port PORT # src IP # src_port PORT # # path # path : exact string match # path_beg : prefix match # path_dir : subdir match # path_dom : domain match # path_end : suffix match # path_len : length match # path_reg : regex match # path_sub : substring match # # ACL derivatives : # url : exact string match # url_beg : prefix match # url_dir : subdir match # url_dom : domain match # url_end : suffix match # url_len : length match # url_reg : regex match # url_sub : substring match # # ACL derivatives :检查请求的url中指定的param的值 # urlp(<name>[,<delim>]) : exact string match # urlp_beg(<name>[,<delim>]) : prefix match # urlp_dir(<name>[,<delim>]) : subdir match # urlp_dom(<name>[,<delim>]) : domain match # urlp_end(<name>[,<delim>]) : suffix match # urlp_len(<name>[,<delim>]) : length match # urlp_reg(<name>[,<delim>]) : regex match # urlp_sub(<name>[,<delim>]) : substring match # #ACL derivatives : 检查请求报文指定的首部的值 # hdr([<name>[,<occ>]]) : exact string match # hdr_beg([<name>[,<occ>]]) : prefix match # hdr_dir([<name>[,<occ>]]) : subdir match # hdr_dom([<name>[,<occ>]]) : domain match # hdr_end([<name>[,<occ>]]) : suffix match # hdr_len([<name>[,<occ>]]) : length match # hdr_reg([<name>[,<occ>]]) : regex match # hdr_sub([<name>[,<occ>]]) : substring match # # block { if | unless } <condition> # http-request { allow |deny | auth}[{if | unless } <condition>] # http-response { allow |deny | auth}[{if | unless } <condition>]