HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。
HAProxy实现了一种事件驱动, 单一进程模型,此模型支持非常大的并发连接数。多进程或多线程模型受内存限制 、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接。事件驱动模型因为在有更好的资源和时间管理的用户空间(User-Space) 实现所有这些任务,所以没有这些问题。此模型的弊端是,在多核系统上,这些程序通常扩展性较差。这就是为什么他们必须进行优化以 使每个CPU时间片(Cycle)做更多的工作。————百度百科
安装:
[root@sherry ~]# yum install haproxy -y
配置文件说明:
[root@sherry ~]# vim /etc/haproxy/haproxy.cfg
global
log 127.0.0.1 local2 # <address> <facility> [max level [min level]]:定义全局的syslog服务器,最多可以定义两个;
chroot /var/lib/haproxy #修改haproxy的工作目录至指定的目录并在放弃权限之前执行chroot()操作,可以提升haproxy的安全级别,不过需要注意的是要确保指定的目录为空目录且任何用户均不能有写权限;
pidfile /var/run/haproxy.pid
maxconn 4000 #设定每个haproxy进程所接受的最大并发连接数,其等同于命令行选项“-n”;“ulimit -n”自动计算的结果正是参照此参数设定的;
user haproxy
group haproxy
daemon #让haproxy以守护进程的方式工作于后台,其等同于“-D”选项的功能,当然,也可以在命令行中以“-db”选项将其禁用;
stats socket /var/lib/haproxy/stats
defaults
mode http
工作模式:
http 对应用层数据做深入分析,因此支持7层的过滤、处理、转换等机制;
tcp haproxy在客户端和upstream server之间建立一个全双工的连接;
不会对应用层协议做任何检查;
SSL、MySQL、SSL等都应该使用此模式;
log global 使用全局配置的日志
#log <address> <facility> [<level> [<minlevel>]] 重新指定 可以定在frontend
option httplog
option dontlognull
option httpclose #短连接
option logasap #先记录日志
option dontlognull #不记录空
option http-server-close #长链接时候 客户端超时 服务器自动断开连接
option Redispatch #基于cookie时候 后端服务器故障时候 自动迁移
option forwardfor except 127.0.0.0/8
#{httpd.conf LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b" common }
capture request header Host len 20 #记录host
capture request header Referer len 60 #记录referer
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 main *:5000 #定义前端
捕获信息
capture request header Host len 15
capture request header X-Forwarded-For len 15
capture requset Referrer len 15
capture request header <HEADER> len <LENGTH>
capture response header <HEADER> len <LENGTH>
errorfile 404 /demo.php
log 127.0.0.1 local3
bind :80,:443 #绑定端口 只能定义在frontend listen
acl index path -i /index.html
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 #如果条件符合上面的定义的 则引用的后端
use_backend app if <condition>
use_backend app unless <condition>
default_backend app #默认的后端
backend static #定义一个后端
检查方法:
option httpchk
option httpchk <uri>
option httpchk <method> <uri>
option httpchk <method> <uri> <version>:不能用于frontend段,例如:
cookie <name> [rewrite 重写|insert 拆入|prefix 前缀 多cookie 放在应用程序之前] [indirect] [nocache] [postonly] [preserve] [httponly] [secure] [domain<domian>]* [maxidle<idle>] [maxlife<life>]
还要在每台real-server 后加cookie 标志
cookie web insert nocache 缓存服务器不保存cookie
cookie SESSION_COOKIE insert indirect nocache 应用服务器
hash-type: map-based 权重取莫 默认
consistent hash一致性 后端服务器用这个
balance roundrobin #调用方法 轮询 只能定义在defaults listen backend
roundrobin:加权轮询 可以增加后来服务器 支持慢启动 图片服务器
static-rr 加权静态轮询 后面增加的服务器不生效,除非重启服务 服务器重新上线后理解分配高连接
leastconn 最少连接 支持权重改变 支持慢启动 mysql从服务器
source 源地址ip hash 并保存在hash表 支持加权 在ip层调用
uri 基于用户请求的uri 提高命中缓存命中率
url_param
hdr(<name>) #基于某个指定首部 use_domain_only 仅计算a.com
rdp-cookie 在应用调用
rdp-cookie(name)
server static 127.0.0.1:4331 check #后端服务器 定义名称 服务器地址 健康状态检测
backend app #定义后端
balance roundrobin #调度方法轮训
server app1 127.0.0.1:5001 check
#backup设定为备用服务器,仅在负载均衡场景中的其它server均不可用于启用此server;
#check:启动对此server执行健康状态检查,其可以借助于额外的其它参数完成更精细的设定,如:
check inter 3000 rise 2 fall 5
inter <delay>:设定健康状态检查的时间间隔,单位为毫秒,默认为2000;也可以使用fastinter和downinter来根据服务器端状态优化此时间延迟;
rise <count>:一般2次 设定健康状态检查中,某离线的server从离线状态转换至正常状态需要成功检查的次数;
fall <count>: 一般5次 确认server从正常状态转换为不可用状态需要检查的次数;
#cookie <value>:为指定server设定cookie值,此处指定的值将在请求入站时被检查,第一次为此值挑选的server将在后续的请求中被选中,其目的在于实现持久连接的功能;
#maxconn <maxconn>:指定此服务器接受的最大并发连接数;如果发往此服务器的连接数目高于此处指定的值,其将被放置于请求队列,以等待其它连接被释放; 前端连接个数小于等于后端 (maxconn+maxqueue)*server-number
#maxqueue <maxqueue>:设定请求队列的最大长度;
#observe <mode>:通过观察服务器的通信状况来判定其健康状态,默认为禁用,其支持的类型有“layer4”和“layer7”,“layer7”仅能用于http代理场景;
#redir <prefix>:启用重定向功能,将发往此服务器的GET和HEAD请求均以302状态码响应;需要注意的是,在prefix后面不能使用/,且不能使用相对地址,以免造成循环;例如:
server srv1 172.16.100.6:80 redir check
#weight <weight>:权重,默认为1,最大值为256,0表示不参与负载均衡;
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 stats
bind *:8009
stats enable
stats uri /haproxy?stats
stats auth admin:admin
stats hide-version
stats admin if TRUE 认证通过允许管理 一般用 stats admin if LOCALHOST 本机 比较危险
acl allow src 192.168.1.0/24 #定义允许访问段
acl deny src 192.168.1.111 #定义拒绝访问的网络
tcp-request content reject if deny #tcp层拒绝 也可以是http-requset 七层控制
tcp-request content accept if allow #tep层绝收
tcp-request content reject