AProxy是可提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,是免费、快速并且
可靠的一种解决方案。HAProxy非常适用于并发大(并发达1w以上)web站点,这些站点通
常又需要会话保持或七层处理。HAProxy的运行模式使得它可以很简单安全的整合至当前
的架构中,同时可以保护web服务器不被暴露到网络上。
拓展:常见的Web集群调度器分为软件和硬件
软件通常使用开源的LVS、Haproxy、Nginx
硬件一般使用比较多的是F5,也有很多人使用国内的一些产品,如梭子鱼、绿盟、深信服、360等。
LVS在企业应用中抗负载能力很强,但存在不足:LVS不支持正则处理,不能实现动静分离;对于大型网站,LVS的实施配置复杂,维护成本相对较高。
Haproxy 是一个使用C语言编写的自由及开放源代码软件,其提供高可用性、负载均衡,以及基于TCP和HTTP的应用程序代理
适用于负载大的Web站点
运行在硬件上可支持数以万计的并发连接的连接请求
Haproxy支持多种调度算法,最常用的有:
可靠性和稳定性非常好,可以与硬件级的F5负载均衡设备相媲美。
最高可以同时维护40000-50000个并发连接,单位时间内处理的最大请求数为20000个,最大处理能力可达10Git/s。
支持多达8 种负载均衡算法,同时也支持会话保持。
支持虚拟主机功能,从而实现web负载均衡更加灵活。
支持连接拒绝、全透明代理等独特功能。
拥有强大的ACL支持,用于访问控制。
其独特的弹性二叉树数据结构,使数据结构的复杂性上升到0(1),即数据的查询速度不会随着数据条目的增加而速度有所下降。
支持客户端的keepalive功能,减少客户端与haproxy的多次三次握手导致资源量费,让多个请求在一个tcp连接中完成。
支持TCP加速,零复制功能,类似于mmap机制。
支持响应池(response buffering)
支持RDP(远程桌面)协议
基于源的粘性,类似于nginx的ip_hash功能,把来自同一客户端的请求在一定时间内始终调度到上游的同一服务器
更好统计数据接口,其web接口显示后端冀全中各个服务器的接受、发送、拒绝、错误等数据的统计信息
详细的健康状态检测,web接口中有关对上流服务器的健康检测状态,并提供了一定的管理功能
基于流量的健康评估机制
基于http认证
基于命令行的管理接口
日志分析器,可对日志进行分析
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3QrvZAwP-1659918794437)(C:\Users\灰灰\AppData\Roaming\Typora\typora-user-images\image-20220803112155810.png)]
1.关闭防火墙,增强机制
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
2.上传软件包到/opt下,并解压
tar -xf haproxy-1.5.19.tar.gz
3. 安装依赖包
yum install -y pcre-devel bzip2-devel gcc gcc-c++ make
4.编译安装
cd haproxy-1.5.18/
make TARGET=linux2628 ARCH=x86_64
make install
#使用uname -r查看内核,kernel大于2.6.28用TARGET=linux2628,下于的用TARGET=linux26
ARCH=x86_64 #系统位数,64位系统
5.配置Haproxy
mkdir /etc/haproxy
cp examples/haproxy.cfg /etc/haproxy/ #将配置文件拷贝到etc/haproxy下
cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.bak #备份
vim /etc/haproxy/haproxy.cfg
全局配置,主要用于定义全局参数,属于进程级的配置
global
log /dev/log local0 info #local0为日志设备,默认存放到系统日志
log /dev/log local1 notice
#log loghost local0 info
maxconn 4096 #最大连接数,需考虑ulimit -n限制,推荐使用10240
--8行--注释,chroot运行路径,为该服务自设置的根目录,一般需将此行注释掉
#chroot /usr/share/haproxy
uid 99 #用户UID
gid 99 #用户GID
daemon #守护进程模式
nbproc 1 #添加,设置并发进程数,建议与当前服务器CPU核数相等或为其2倍
配置默认参数,这些参数可以被用到Listen,frontend,backend组件
defaults
log global #引入global定义的日志格式
mode http #模式为http
option httplog #日志类别为http日志格式
option dontlognull #不记录健康检查日志信息
retries 3 #检查节点服务器失败次数,连续达到三次失败,则认为节点不可用
redispatch #当服务器负载很高时,自动结束当前队列处理比较久的连接
maxconn 2000 #最大连接数,“defaults”中的值不能超过“global”段中的定义
#contimeout 5000 #设置连接超时时间,默认单位是毫秒
#clitimeout 50000 #设置客户端超时时间,默认单位是毫秒
#srvtimeout 50000 #设置服务器超时时间,默认单位是毫秒
timeout http-request 10s #默认http请求超时时间
timeout queue 1m #默认队列超时时间
timeout connect 10s #默认连接超时时间,新版本中替代contimeout,该参数向后兼容
timeout client 1m #默认客户端超时时间,新版本中替代clitimeout,该参数向后兼容
timeout server 1m #默认服务器超时时间,新版本中替代srvtimeout,该参数向后兼容
timeout http-keep-alive 10s #默认持久连接超时时间
timeout check 10s #设置心跳检查超时时间
删除下面所有listen项,添加如下内容
listen webcluster 0.0.0.0:80 #haproxy实例状态监控部分配置,定义一个名为webcluster的应用
option httpchk GET /test.html #检查服务器的test.html文件
balance roundrobin #负载均衡调度算法使用轮询算法
定义在线节点
server inst1 192.168.74.129:80 check inter 2000 fall 3
server inst1 192.168.74.130:80 check inter 2000 fall 3
轮询算法:roundrobin;
最小连接数算法:leastconn;
来源访问调度算法:source;类似于nginx的ip_hash
#check inter 2000 表示启用对此后端服务器执行健康检查,设置健康状态检查的时间间隔,单位为毫秒
#fall 3 表示连续三次检测不到心跳频率则认为该节点失效
#若节点配置后带有“backup”表示该节点只是个备份节点,仅在所有在线节点都失效该节点才启用。不携带“backup”,表示为主节点,和其它在线节点共同提供服务。
6.添加系统服务
cp /opt/haproxy-1.5.19/examples/haproxy.init /etc/init.d/haproxy
chmod +x /etc/init.d/haproxy
chkconfig --add /etc/init.d/haproxy
ln -s /usr/local/sbin/haproxy /usr/sbin/haproxy #创建软连接
systemctl start haproxy #启动服务
#关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
#安装nginx服务
rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
yum -y install nginx
cd /usr/share/nginx/html/
web1
echo "this is syw server " >/usr/share/nginx/html/test.html
web2
echo "this is xjw " >/usr/share/nginx/html/test.html
#启动服务
systemctl start nginx
#编辑测试文件
测试:在客户端浏览器输入192.168.74.128、test.html
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AnknVLs8-1659918794438)(C:\Users\灰灰\AppData\Roaming\Typora\typora-user-images\image-20220803153757312.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aBpp2Qv3-1659918794439)(C:\Users\灰灰\AppData\Roaming\Typora\typora-user-images\image-20220803153810232.png)]
默认haproxy的日志是输出到系统的syslog中,查看起来不是非常方便,为了更好的管理haproxy的日志,我们在生产环境中一般单独定义出来。需要将haproxy的info及notice日志分别记录到不同的日志文件中。
vim /etc/haproxy/haproxy.cfg
#更改日志文件
global
log /dev/log local0 info
log /dev/log local0 notice
#重启haproxy服务
service haproxy restart
需要修改rsyslog配置,为了便于管理。将haproxy相关的配置独立定义到haproxy.conf,并放到/etc/rsyslog.d/下,rsyslog启动时会自动加载此目录下的所有配置文件。
vim /etc/rsyslog.d/haproxy.conf
if ($programname == 'haproxy' and $syslogseverity-text == 'info')
then -/var/log/haproxy/haproxy-info.log
&~
if ($programname == 'haproxy' and $syslogseverity-text == 'notice')
then -/var/log/haproxy/haproxy-notice.log
&~
#将haproxy的info日志记录到/var/log/haproxy/haproxy-info.log下,将notice日志记录到/var/log/haproxy/haproxy-notice.log下
#“&~”表示当日志写入到日志文件后,rsyslog停止处理这个信息。
#重启服务
systemctl restart rsyslog.service
查看haproxy的访问请求日志信息
访问网页后查看日志
tail -f /var/log/haproxy/haproxy.log
使用网页访问192.168.48.10,则会产生对应的日志文件,查看/var/log/haproxy/haproxy-info.log。停止掉某个节点服务器,然后再刷新页面,开启节点服务器,则会产生haproxy-notice.log。
temctl restart rsyslog.service
查看haproxy的访问请求日志信息
访问网页后查看日志
tail -f /var/log/haproxy/haproxy.log
使用网页访问192.168.48.10,则会产生对应的日志文件,查看/var/log/haproxy/haproxy-info.log。停止掉某个节点服务器,然后再刷新页面,开启节点服务器,则会产生haproxy-notice.log。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0hy0J5Mr-1659918794440)(C:\Users\灰灰\AppData\Roaming\Typora\typora-user-images\image-20220803160951605.png)]