HAProxy是一个使用C语言编写的自由及开放源代码软件,其提供高可用性、负载均衡,以及基于TCP和HTTP的应用程序代理。
HAProxy特别适用于那些负载特大的web站点,这些站点一般又须要会话保持或七层处理。HAProxy运行在当前的硬件上,彻底能够支持数以万计的并发链接。而且它的运行模式使得它能够很简单安全的整合进您当前的架构中, 同时能够保护你的web服务器不被暴露到网络上。
HAProxy实现了一种事件驱动, 单一进程模型,此模型支持很是大的并发链接数。多进程或多线程模型受内存限制 、系统调度器限制以及无处不在的锁限制,不多能处理数千并发链接。事件驱动模型由于在有更好的资源和时间管理的用户空间(User-Space) 实现全部这些任务,因此没有这些问题。此模型的弊端是,在多核系统上,这些程序一般扩展性较差。这就是为何他们必须进行优化以 使每一个CPU时间片(Cycle)作更多的工做。前端
配置文件: /etc/haproxy/haproxy.cfg #yum安装haproxy的主配置文件web
代理配置段:分四个区段: defaults、frontend、listen、backend;redis
defaults name 用于为listen/frontend/backend提供默认值,其name是可选参数,只是为了更好的阅读。算法
listen name 经过关联先后端定义一个完整的代理服务器apache
frontend name 定义监听的套接字,用于接收客户端请求并与之链接vim
global log 127.0.0.1 local2 chroot /var/lib/haproxy pidfile /var/run/haproxy.pid maxconn 4000 user haproxy group haproxy daemon stats socket /var/lib/haproxy/stats
maxconn conns
设定一个前端的最大并发链接数,所以其不能用于backend区段。对于大型站点来讲,能够尽量提升此值以便让haproxy管理链接队列,从而避免没法应答用户请求。固然,此最大值不能超出“global”段中的定义。此外,须要留心的是,haproxy会为每一个链接维持两个缓冲,每一个缓冲的大小为8KB,再加上其它的数据,每一个链接将大约占用17KB的RAM空间。这意味着通过适当优化后,有着1GB的可用RAM空间时将能维护40000-50000并发链接。
若是为conns指定了一个过大值,极端场景下,其最终占据的空间可能会超出当前主机的可用内存,这可能会带来意想不到的结果;所以,将其设定了一个可接受值方为明智决定。其默认为2000。后端
log address facility [level [ minlevel ]]
为每一个实例启用事件和流量日志,所以可用于全部区段。每一个实例最多能够指定两个log参数,不过,若是使用了“log global”且"global"段已经定了两个log参数时,多余了log参数将被忽略。安全
global:当前实例的日志系统参数同"global"段中的定义时,将使用此格式;每一个实例仅能定义一次“log global”语句,且其没有任何额外参数;服务器
address:定义日志发往的位置,其格式之一能够为IPv4_address:PORT,其中的port为UDP协议端口,默认为514;格式之二为Unix套接字文件路径,但须要留心chroot应用及用户的读写权限;cookie
facility:能够为syslog系统的标准facility之一;
defaults mode http #默认的模式mode{tcp|http|health},health只会返回OK #retries 2 #两次链接失败就认为是服务器不可用,也能够经过后面设置 option redispatch #当serverId对应的服务器挂掉后,强制定向到其余健康的服务器 option abortonclose #当服务器负载很高的时候,自动结束掉当前队列处理比较久的连接 timeout connect 5000ms #链接超时 timeout client 30000ms #客户端超时 timeout server 30000ms #服务器超时 #timeout check 2000 #心跳检测超时 log 127.0.0.1 local0 err #[err warning info debug] balance roundrobin #负载均衡算法 option httplog #日志类别,采用httplog option httpclose #每次请求完毕后主动关闭http通道,ha-proxy不支持keep-alive,只能模拟这种模式的实现 option dontlognull option forwardfor #若是后端服务器须要得到客户端真实ip须要配置的参数,能够从Http Header中得到客户端ip
mode { tcp|http|health } 设定实例的运行模式或协议。当实现内容交换时,前端和后端必须工做于同一种模式(通常说来都是HTTP模式),不然将没法启动实例。
tcp:实例运行于纯TCP模式,在客户端和服务器端之间将创建一个全双工的链接,且不会对7层报文作任何类型的检查;此为默认模式,一般用于SSL、SSH、SMTP等应用;
http:实例运行于HTTP模式,客户端请求在转发至后端服务器以前将被深度分析,全部不与RFC格式兼容的请求都会被拒绝;
listen stats bind 0.0.0.0:8888 #监听端口 option httplog #采用http日志格式 stats enable #开启stats统计页面 stats uri / #统计页面访问的前缀,后一般要加上?stats stats realm "Haproxy Auth" #开启认证功能 stats auth admin:admin #认证时的帐号和密码 stats admin if TRUE #在制定条件下开启admin功能 stats refresh 3s #统计页面自动刷新时间间隔 stats show-desc demo #统计页面显示的相关描述信息 stats hide-version #隐藏haproxy的版本号
bind 绑定监听地址
语法:bind [address]:port_range [, ...] interface interface
此指令仅能用于frontend和listen区段,用于定义一个或几个监听的套接字。
frontend main *:80 default_backend apache_groups
use_backend: 调用指定的后端主机(定义在frontend和listen中);
语法: use_backend backend [{if | unless} condition]
condition 条件多为acl的名称
backend apache_groups balance roundrobin cookie SERVERID insert indirect server slave2 192.168.1.3:80 check inter 1s rise 2 fall 3 cookie A maxconn 1000 server slave3 192.168.1.4:80 check inter 1s rise 2 fall 3 cookie B maxconn 1000
语法:balance algorithm [ arguments ]
algorithm用于在负载均衡场景中挑选一个server,其仅应用于持久信息不可用的条件下或须要将一个链接从新派发至另外一个服务器时。
支持的算法有:
roundrobin:基于权重进行轮叫,在服务器的处理时间保持均匀分布时,这是最平衡、最公平的算法。此算法是动态的,这表示其权重能够在运行时进行调整,不过,在设计上,每一个后端服务器仅能最多接受4128个链接;
static-rr:基于权重进行轮叫,与roundrobin相似,可是为静态方法,在运行时调整其服务器权重不会生效;不过,其在后端服务器链接数上没有限制;
leastconn:新的链接请求被派发至具备最少链接数目的后端服务器;在有着较长时间会话的场景中推荐使用此算法,如LDAP、SQL等,其并不太适用于较短会话的应用层协议,如HTTP;此算法是动态的,能够在运行时调整其权重;
语法: server name address [param ]
name:为此服务器指定的内部名称,其将出如今日志及警告信息中;若是设定了"http-send-server-name",它还将被添加至发往此服务器的请求首部中;
address:此服务器的的IPv4地址,也支持使用可解析的主机名,只不过在启动时须要解析主机名至相应的IPv4地
址;
disabled:此服务器禁用;
backup:设定为备用服务器,仅在负载均衡场景中的其它server均不可用于启用此server;
check:启动对此server执行健康状态检查,其能够借助于额外的其它参数完成更精细的设定。
inter delay: 设定监控状态检查的时间间隔,单位为毫秒,默认为2000,也可使用fastinter和downinter来根据服务器端专题优化此事件延迟
rise count:设定检查状态检查中,某离线的server从离线状态转换至正常状态须要成功检查的次数
fall count:设定检查状态检查中,某server从正常状态转换至离线状态须要成功检查的次数
cookie value:为指定server设定cookie值,此处指定的值将在请求入站时被检查,第一次为此值挑选的server将在后续的请求中被选中,其目的在于实现持久链接的功能;
maxconn maxconn:指定此服务器接受的最大并发链接数;若是发往此服务器的链接数目高于此处指定的值,其将被放置于请求队列,以等待其它链接被释放;
maxqueue maxqueue:设定请求队列的最大长度;0表示无上限;
weight weight:权重,默认为1,最大值为256,0表示不参与负载均衡;
[root@Haproxy ~]# yum install -y haproxy #直接使用RPM来安装
[root@Haproxy ~]# vim /etc/haproxy/haproxy.cfg #haproxy的主配置文件
listen proxytofirehose :443 mode tcp balance roundrobin stick-table type ip size 200k expire 30m stick on src server firehose 192.168.122.2:443 check
curl -x 192.168.122.172:80 www.wo.com.cn 此命令使用192.168.122.172:80这个代理服务器IP和端口访问站点www.wo.com.cn参数说明 -x 设置代理,格式为host[:port],port的缺省值为1080
wget -Y on -e "http_proxy=http://192.168.122.172:9201" "www.wo.com.cn" 此命令使用192.168.122.172:9201这个代理服务器IP和端口访问站点www.wo.com.cn 参数说明 -Y 是否使用代理 -e 执行命令