一、简介
HAProxy是法国开发者 威利塔罗(Willy Tarreau) 在2000年使用C语言开发的一个开源软件 是一款具备高并发(万级以上)、高性能的TCP和HTTP负载均衡器 支持基于cookie的持久性,自动故障切换,支持正则表达式及web状态统计
haproxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。haproxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。haproxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。
企业版网站:https://www.haproxy.com
社区版网站:http://www.haproxy.org
github:https://github.com/haprox
企业版本和社区版功能对比
功能 社区版 企业版 高级HTTP / TCP负载平衡和持久性 支持 支持 高级健康检查 支持 支持 应用程序加速 支持 支持 高级安全特性 支持 支持 高级管理 支持 支持 HAProxy Dev Branch新功能 支持 24*7 支持服务 支持 实时仪表盘 支持 VRRP和Route Health Injection HA工具 支持 ACL,映射和TLS票证密钥同步 支持 基于应用程序的高级DDoS和Bot保护(自动保护) 支持 Bot(机器人)监测 支持 Web应用防火墙 支持 HTTP协议验证 实时集群追踪
二、安装与服务信息
2.1实验架构
2.2配置
2.2.1安装
在haproxy中安装
yum install haproxy -y
查看版本
haproxy -v
2.2.2基本配置信息
global:全局配置段
- 进程及安全配置相关的参数
- 性能调整相关参数
- Debug参数
proxies:代理配置段
- defaults:为frontend, backend, listen提供默认配置
- frontend:前端,相当于nginx中的server {}
- backend:后端,相当于nginx中的upstream {}
- listen:同时拥有前端和后端配置,配置简单,生产推荐使用
2.2.2.1、global
chroot:锁定运行目录
deamon:守护进程运行
user、group、uid、gid:运行haproxy的用户身份
stats socket:套接字文件
nbproc N:开启的haproxy worker 进程数,默认进程数是一个
nbthread 1 (和nbproc 互斥):指定每个haproxy进程开启的线程数,默认为每个进程一个 线程
cpu-map 1 0:绑定haproxy worker 进程至指定CPU,将第1个work进程绑 定至0号CPU
cpu-map 2 1:绑定haproxy worker 进程至指定CPU,将第2个work进程绑 定至1号CPU maxconn N:每个haproxy进程的最大并发连接数
maxsslconn N :每个haproxy进程ssl最大连接数,用于haproxy配置了证书的 场景下 maxconnrate N : 每个进程每秒创建的最大连接数量
spread-checks N :后端server状态check随机提前或延迟百分比时间,建议2- 5(20%-50%)之间,默认值0
pidfile:指定pid文件路径
log 127.0.0.1 local2 info:定义全局的syslog服务器;日志服务器需要开启UDP协议, 最多可以定义两个
2.2.2.2、proxies
defaults []:默认配置项,针对以下的frontend、backend和listen生效,可以多个 name也可以没有name
frontend:前端servername,类似于Nginx的一个虚拟主机 server和LVS服务集群。
bind:指定haproxy的监听地址,可以是IPV4或IPV6,可以同时监听多个IP或端口,可同时用于listen字段中
backlog #针对所有server配置,当前端服务器的连接数达到上限后的后援队列长度,注意:不 支持backend
配置实例
frontend lee-webserver-80 bind 172.25.254.100:80 mode http use_backend lee-webserver-80-RS #调用backend的名称
backend:#后端服务器组,等于nginx的upstream和LVS中的RS服务器
定义一组后端服务器,backend服务器将被frontend进行调用。
注意: backend 的名称必须唯一,并且必须在listen或frontend中事先定义才可以使用,否则服务无法 启动
配置实例
mode http|tcp #指定负载协议类型,和对应的frontend必须一致 option #配置选项 server #定义后端real server,必须指定IP和端口
其中server
#针对一个server配置 check #对指定real进行健康状态检查,如果不加此设置,默认不开启检查,只有check后面没 有其它配置也可以启用检查功能 #默认对相应的后端服务器IP和端口,利用TCP连接进行周期性健康性检查,注意必须指定 端口才能实现健康性检查 addr <IP> #可指定的健康状态监测IP,可以是专门的数据网段,减少业务网络的流量 port <num> #指定的健康状态监测端口 inter <num> #健康状态检查间隔时间,默认2000 ms fall <num> #后端服务器从线上转为线下的检查的连续失效次数,默认为3 rise <num> #后端服务器从下线恢复上线的检查的连续有效次数,默认为2 weight <weight> #默认为1,最大值为256,0(状态为蓝色)表示不参与负载均衡,但仍接受持久连接 backup #将后端服务器标记为备份状态,只在所有非备份主机down机时提供服务,类似Sorry Server disabled #将后端服务器标记为不可用状态,即维护状态,除了持久模式 #将不再接受连接,状态为深黄色,优雅下线,不再接受新用户的请求 redirect prefix http://www.baidu.com/ #将请求临时(302)重定向至其它URL,只适用于http模 式 maxconn <maxconn> #当前后端server的最大并发连接数 实例: backend lee-webserver-80-RS mode http server web1 172.25.254.10:80 check inter 3s fall 3 rise 5 server web2 172.25.254.20:80 check inter 3s fall 3 rise 5
listen: #将frontend和backend合并在一起配置,相对于frontend和backend 配置更简洁,生产常用
配置实例
listen webserver bind 172.25.254.100:80 mode http option forwardfor server web1 172.25.254.10:80 check inter 3s fall 3 rise 5 server web2 172.25.254.20:80 check inter 3s fall 3 rise 5
2.2.3、socat
对服务器动态权重和其它状态可以利用 socat工具进行调整,Socat 是 Linux 下的一个多功能的网络工 具,名字来由是Socket CAT,相当于netCAT的增强版.Socat 的主要特点就是在两个数据流之间建立双向 通道,且支持众多协议和链接方式。如 IP、TCP、 UDP、IPv6、Socket文件等
安装
yum install socat -y
范例:利用工具socat 对服务器动态权重调整
在配置文件中更改设置,然后重启haproxy
#修改配置文件 [root@haproxy ~]# vim /etc/haproxy/haproxy.cfg stats socket /var/lib/haproxy/stats mode 600 level admin
以下是关于更改权重的命令
第一个命令是查看
第4,5个命令是更改
2.2.4、cookie
cookie value:为当前server指定cookie值,实现基于cookie的会话黏性,相对于基于 source 地址hash 调度算法对客户端的粒度更精准,但同时也加大了haproxy负载,目前此模式使用较少, 已经被session 共享服务器代替
配置选项
cookie name [ rewrite | insert | prefix ][ indirect ] [ nocache ][ postonly ] [ preserve ][ httponly ] [ secure ][ domain ]* [ maxidle ][ maxlife ]
- name: #cookie 的 key名称,用于实现持久连接
- insert: #插入新的cookie,默认不插入
- cookie indirect: #如果客户端已经有cookie,则不会再发送cookie信息
- nocache: #当client和hapoxy之间有缓存服务器(如:CDN)时,不允许中间缓存器缓存cookie, #因为这会导致很多经过同一个CDN的请求都发送到同一台后端服务器
配置实例
listen webserver bind *:80 option forwardfor mode http balance roundrobin cookie WEBCOOKIE insert nocache indirect server web1 172.25.254.10:80 cookie web1 weight 1 check inter 3s fall 3 rise 5 server web2 172.25.254.20:80 cookie web2 weight 1 check inter 3s fall 3 rise 5
可以通过此命令验证
curl -i 172.25.254.100
2.2.5、状态页
通过web界面,显示当前haproxy的运行状态
配置项
- stats enable #基于默认的参数启用stats page
- stats hide-version #将状态页中haproxy版本隐藏
- stats refresh #设定自动刷新时间间隔,默认不自动刷新
- stats uri #自定义stats page uri,默认值:/haproxy?stats
- stats auth : #认证时的账号和密码,可定义多个用户,每行指定一个用户 #默认no authentication
- stats admin { if | unless } #启用stats page中的管理功能
配置实例
listen stats: mode http bind *:80 stats enable log global stats uri /status #自定义stats page uri stats auth gxx:gxx #认证,此行可以出现多次
测试
浏览器访问:172.25.254.100:80/status
页面信息:
session rate(每秒的连接会话信息) Errors(错误统计信息)
cur:每秒的当前会话数量 Req:错误请求量
max:每秒新的最大会话数量 conn:错误链接量
limit:每秒新的会话限制量 Resp:错误响应量
sessions(会话信息) Warnings(警告统计信息)
cur:当前会话量 Retr:重新尝试次数
max:最大会话量 Redis:再次发送次数
limit: 限制会话量 Total:总共会话量
Server(real server信息) LBTot:选中一台服务器所用的总时间
Status:后端机的状态,包括UP和DOWN
Last:和服务器的持续连接时间 LastChk:持续检查后端服务器的时间
Wght:权重 Bytes(流量统计) Act:活动链接数量
In:网络的字节输入总量 Bck:备份的服务器数量
Out:网络的字节输出总量 Chk:心跳检测时间
Dwn:后端服务器连接后都是DOWN的数量
Denied(拒绝统计信息) Dwntme:总的downtime时间
Req:拒绝请求量 Thrtle:server 状态
Resp:拒绝回复量
2.2.6、透传
web服务器中需要记录客户端的真实IP地址,用于做访问统计、安全防护、行为分析、区域排行等场景。
四层透传
目前的阶段是nginx中配置比较多,apache是不支持了
在
vim /wtc/nginx/nginx.conf
更改后重启
并在haproxy中
弄好之后就可以重启
就可以在测试机上查看日志内容
tail -n 3 /var/log/nginx/access.log
七层透传
在apache下
vim /etc/httpd/conf/httpd.conf
在haproxy下
listen webserver option forwardfor bind 1*:80 mode http balance roundrobin server web1 172.25.254.10:80 send-proxy weight 1 check inter 3s fall 3 rise 5 server web2 172.25.254.20:80 weight 1 check inter 3s fall 3 rise 5
编辑完了都要重启
测试
tail -n 3 /etc/httpd/logs/access_log