监听所有80端口转发到8080
global
daemon
maxconn 25600
defaults
mode http
timeout connect 5000ms
timeout client 50000ms
timeout server 50000ms
frontend http-in
bind *:80
default_backend servers
backend servers
server server1 127.0.0.1:8080 maxconn 32
golbal
daemon
gid
group
log xxx/xx.log
log-send-hostname
nbporc 进程数
pidfile
uid
user
unlimit -n #不建议修改
stats socket /var/lib/haproxy/status
node
description
maxconn #并发连接数
noepoll #禁用noepoll
nokqueue
nopoll
nosepoll
nosplice
spread-checks用在haproxy后端有着众多服务器的场景中,在精确的时间间隔后统一对众服务器进行健康状况检查可能会带来意外问题;
此选项用于将其检查的时间间隔长度上增加或减小一定的随机时长
spread-checks <0..50,in percent>
设定buffer的大小,同样的内存条件下,较小的值可以让haproxy有能力接受更多的并发连接,
较大的值可以让某些应用程序使用较大的cookie信息;默认为16384,其可以在编译时修改,
不过强烈建议使用默认值
tune.bufsize <number>
tune.chksize <number> 检查缓冲的大小,专用检测用户的请求首部信息,建议默认值
tune.maxaccept <number> 一次性一次交由多少个请求给进程
maxpollevents设定一次系统调用可以处理的事件最大数,默认值取决于OS;其值小于200时可节约带宽,但会略微增大网络延迟,
而大于200时会降低延迟,但会稍稍增加网络带宽的占用量;
tune.maxpollevents <number>
maxrewrite设定首部重写或追加而预留的缓冲空间,建议使用1024左右的大小,在需要使用更大的空间时,haproxy全自动增加其值
tune.maxrewrite <number>
debug
quiet
defaults
frontend
backend
listen
defaults,frontend,backend
balance roundrobin,static-rr,leastconn,first,source,uri,uri-param,hdr,rdp-cookie,
roundrobin:基于权重进行轮叫,在服务器的处理时间保持均匀分布时,这是最平衡、最公平的算法。此算法是动态的,这表示其权重可以在运行时进行调整,不过,在设计上,每个后端服务器仅能最多接受4128个连接;
static-rr:基于权重进行轮叫,与roundrobin类似,但是为静态方法,在运行时调整其服务器权重不会生效;不过,其在后端服务器连接数上没有限制;
leastconn:新的连接请求被派发至具有最少连接数目的后端服务器;在有着较长时间会话的场景中推荐使用此算法,如LDAP、SQL等,其并不太适用于较短会话的应用层协议,如HTTP;此算法是动态的,可以在运行时调整其权重;
first:其会匹配server的id,id值设置低的先进行连接,直到达到该服务器的maxconn,再使用第二台。比较适用于RDP、IMAP、HTTP等长连接及云环境下;
source:将请求的源地址进行hash运算,并由后端服务器的权重总数相除后派发至某匹配的服务器;这可以使得同一个客户端IP的请求始终被派发至某特定的服务器;不过,当服务器权重总数发生变化时,如某服务器宕机或添加了新的服务器,许多客户端的请求可能会被派发至与此前请求不同的服务器;常用于负载均衡无cookie功能的基于TCP的协议;其默认为静态,不过也可以使用hash-type修改此特性;
uri:对URI的左半部分(“问题”标记之前的部分)或整个URI进行hash运算,并由服务器的总权重相除后派发至某匹配的服务器;这可以使得对同一个URI的请求总是被派发至某特定的服务器,除非服务器的权重总数发生了变化;此算法常用于代理缓存或反病毒代理以提高缓存的命中率;需要注意的是,此算法仅应用于HTTP后端服务器场景;其默认为静态算法,不过也可以使用hash-type修改此特性;
uri-param:通过为URL指定的参数在每个HTTP GET请求中将会被检索;如果找到了指定的参数且其通过等于号“=”被赋予了一个值,那么此值将被执行hash运算并被服务器的总权重相除后派发至某匹配的服务器;此算法可以通过追踪请求中的用户标识进而确保同一个用户ID的请求将被送往同一个特定的服务器,除非服务器的总权重发生了变化;如果某请求中没有出现指定的参数或其没有有效值,则使用轮叫算法对相应请求进行调度;此算法默认为静态的,不过其也可以使用hash-type修改此特性;
hdr(name):对于每个HTTP请求,通过指定的HTTP首部将会被检索;如果相应的首部没有出现或其没有有效值,则使用轮叫算法对相应请求进行调度;其有一个可选选项“use_domain_only”,可在指定检索类似Host类的首部时仅计算域名部分(比如通过www.361way.com来说,仅计算361way字符串的hash值)以降低hash算法的运算量;此算法默认为静态的,不过其也可以使用hash-type修改此特性;
rdp-cookie:其将looked up and hashed每个近入的TCP连接,并将该请求和之前的策略作匹配,这样对于同一个用户发来的请求,可以发往后端同一台realserver上,如果cookie not found,其将使用roundrobin 代替。
balance roundrobin
balance url_param userid
balance url_param session_id check_post 64
balance hdr(User-Agent)
balance hdr(host)
balance hdr(Host) use_domain_only
bind 只能用于frontend,listen
frontend main
bind *:80
bind *:8080
mode tcp,http,health /frontend和backend要一致
hash-type map-based consistent
map-based:hash表是一个包含了所有在线服务器的静态数组。其hash值将会非常平滑,会将权重考虑在列,但其为静态方法,对在线服务器的权重进行调整将不会生效,这意味着其不支持慢速启动。此外,挑选服务器是根据其在数组中的位置进行的,因此,当一台服务器宕机或添加了一台新的服务器时,大多数连接将会被重新派发至一个与此前不同的服务器上,对于缓存服务器的工作场景来说,此方法不甚适用。
consistent:hash表是一个由各服务器填充而成的树状结构;基于hash键在hash树中查找相应的服务器时,最近的服务器将被选中。此方法是动态的,支持在运行时修改服务器权重,因此兼容慢速启动的特性。添加一个新的服务器时,仅会对一小部分请求产生影响,因此,尤其适用于后端服务器为cache的场景。不过,此算法不甚平滑,派发至各服务器的请求未必能达到理想的均衡效果,因此,可能需要不时的调整服务器的权重以获得更好的均衡性。
配置log
log global
log <address> <facility> [<level>][<minlevel>]
maxconn 连接数不能用于backend
default_backend xx
use_backend xxxx
server srv1 ip:port
params: backup ,check inter 2000ms fall 3 rise 2,cookie srv1,maxconn,maxqueue,weight,redir:重定向,redir http://www.baidu.com 不能用/结尾,不能使用相对地址
backend
option httpcheck
option httpcheck uri
option httpchk methon uri
状态检查
listen statistics #定义listen区段名称
bind *:9090 #定义监听端口
stats enable #启用stats
stats hide-version #隐藏版本
stats refresh 10s #刷新时间
stats uri /haproxyadmin?stats #stats的URI地址
stats realm "HAProxy\ statistics" #stats的登陆提示信息
stats auth zhenping:123321 # 定义用户名和密码
stats admin if TRUE #如果用户验证成功,就给予admin权限
option httplog 使日志丰富
option logasap 不能用于frontend ,是否提前将http请求记录到日志
允许在发往服务器的请求首部中插入“X-Forwarded-For”首部,些参数定义后,需要在后端服务器的记录日志格式修改为记录X-Forwarded-For的信息,方可记录下客户端IP地址。if-none: 仅在此首部不存在时才将其添加至请求报文中。示例及用法如下:
用法:
option forwardfor [except <network>][header <name>][if-none]
示例:
frontend www
mode http
option forwardfor except 127.0.0.1/8
errorfile 400 /xxxxx.http
option redispatch 是否允许重新调度
如果/除非 条件满足,返回重定向给客户端;如果未指定条件,表示直接返回重定向。语法如下:
redirect location <loc> [code <code>] <option> [{if | unless} <condition>]
redirect prefix <pfx> [code <code>] <option> [{if | unless} <condition>]
redirect scheme <sch> [code <code>] <option> [{if | unless} <condition>]
示例1:强制用户使用 HTTPS 协议访问登陆页面
acl clear dst_port 80
acl secure dst_port 8080
acl login_page url_beg /login
acl logout url_beg /logout
acl uid_given url_reg /login?userid={FNXX==XXFN}+
acl cookie_set hdr_sub(cookie) SEEN=1
redirect prefix https://mysite.com set-cookie SEEN=1 if !cookie_set # 如果用户访问时不携带 cookie,让其重定向使用 HTTPS 访问,并且为其设置 cookie
redirect prefix https://mysite.com if login_page !secure # 访问登陆页面,但不是访问的安全端口,重定向使用 HTTPS 协议
redirect prefix http://mysite.com drop-query if login_page !uid_given # 访问登陆页面,但没有给出 userid 信息,让用户重新填写登陆信息
redirect location http://mysite.com/ if !login_page secure # 访问非登陆页面,但却要求使用安全端口,这没必要,让用户重定向到普通页面
redirect location / clear-cookie USERID= if logout # 登出之后,让浏览器删除
????
acl is_ssl dst_port 8080
redirect scheme https if !is_ssl
timeout http-keep-alive 10s