一、HAproxy介绍
HAProxy是一个使用C语言编写的自由及开放源代码软件[1],其提供高可用性、负载均衡,以及基于TCP和HTTP的应用程序代理。
HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。
HAProxy实现了一种事件驱动, 单一进程模型,此模型支持非常大的并发连接数。多进程或多线程模型受内存限制 、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接。事件驱动模型因为在有更好的资源和时间管理的用户空间(User-Space) 实现所有这些任务,所以没有这些问题。此模型的弊端是,在多核系统上,这些程序通常扩展性较差。这就是为什么他们必须进行优化以 使每个CPU时间片(Cycle)做更多的工作。
包括 GitHub、Bitbucket[3]、Stack Overflow[4]、Reddit、Tumblr、Twitter[5][6]和Tuenti[7]在内的知名网站,及亚马逊网络服务系统都使用了HAProxy。
haproxy的优点
(1)免费开源,稳定性也是非常好。单haproxy也跑得不错,稳定性可以与硬件级的F5相媲美。
(2)根据官方文档,haproxy可以跑满10Gbps,这个数值作为软件级负载均衡器是相当惊人的。
(3)haproxy支持连接拒绝:因为维护一个连接的打开的开销是很低的,有时我们很需要限制攻击蠕虫(attack bots),也就是说限制它们的连接打开从而限制它们的危害。这个已经为一个陷于小型DDoS攻击的网站开发了而且已经拯救了很多站点,这个优点也是其它负载均衡器没有的。
(4)haproxy支持全透明代理(已具备硬件防火墙的典型特点):可以用客户端IP地址或者任何其他地址来连接后端服务器。这个特性仅在Linux 2.4/2.6内核打了tcp proxy补丁后才可以使用。这个特性也使得为某特殊服务器处理部分流量同时又不修改服务器的地址成为可能。
(5)haproxy现多于线上的Mysql集群环境,我们常用于它作为MySQL(读)负载均衡。
(6)自带强大的监控服务器状态的页面,实际环境中我们结合Nagios进行邮件或短信报警。
haproxy的功能
HAProxy是TCP / HTTP反向代理服务器,尤其适合于高可用性环境
可以针对HTTP请求添加cookie,进行路由后端服务器
可平衡负载至后端服务器,并支持持久连接
支持基于cookie进行调度
支持所有主服务器故障切换至备用服务器
支持专用端口实现监控服务
支持不影响现有连接情况下停止接受新连接请求
可以在双向添加,修改或删除HTTP报文首部
支持基于pattern实现连接请求的访问控制
通过特定的URI为授权用户提供详细的状态信息
7层负载平衡:
7层负载平衡是更复杂的负载均衡网络流量的方法是使用第7层(应用层)负载均衡。使用第7层允许负载均衡器根据用户请求的内容将请求转发到不同的后端服务器。这种负载平衡模式允许您在同一域和端口下运行多个Web应用程序服务器。
二、HAproxy部署
实验环境
主机信息 主机的功能(服务)
server1(172.25.254.1) haproxy服务
server2(172.25.254.2) 后端web服务器
server2(172.25.254.3) 后端web服务器
真机(172.25.254.66) 用作客户端测试
也可以去官网下载
https://www.haproxy.org/#down
[root@server1 ~]# id haproxy 安装完成会自动建立haproxy用户
uid=188(haproxy) gid=188(haproxy) groups=188(haproxy)
/usr/sbin/haproxy 二进制文件
/usr/share/haproxy 共享文件
/var/lib/haproxy 库文件
/etc/rc.d/init.d/haproxy 启动二进制文件
/etc/logrotate.d/haproxy 日志切割
/etc/sysconfig/haproxy 配置
/etc/haproxy 配置目录
haproxy 配置中分成五部分内容,分别如下:
global: 设置全局配置参数,属于进程的配置,通常是和操作系统相关。
defaults:配置默认参数,这些参数可以被用到frontend,backend,Listen组件;
frontend:接收请求的前端虚拟节点,Frontend可以更加规则直接指定具体使用后端的backend;
backend:后端服务集群的配置,是真实服务器,一个Backend对应一个或者多个实体服务器;
Listen :frontend和backend的组合体。
更改配置文件:
[root@server1 ~]# vim /etc/haproxy/haproxy.cfg
要使用的配置文件:
在两台服务端设置
[root@server2 ~]# yum install httpd -y 安装http服务
[root@server2 ~]# echo www.server2.com > /var/www/html/index.html默认发布页面写入内容
[root@server2 ~]# systemctl restart httpd.service 重启httpd
[root@server2 ~]# curl localhost 测试访问
www.server2.com
[root@server3 ~]# yum install -y httpd
[root@server3 ~]# echo www.server3.com > /var/www/html/index.html
[root@server3 ~]# systemctl restart httpd
[root@server3 ~]# curl localhost
www.server3.com
客户端主机测试
实现反向代理+负载均衡
配置监控后段服务器状态和监控页面
[root@server1 ~]# vim /etc/haproxy/haproxy.cfg
[root@server1 ~]# systemctl start haproxy
客户端访问测试
监控页面
查看后端服务器状态页面
[root@client Desktop]# curl 172.25.254.1
www.server3.com
[root@client Desktop]# curl 172.25.254.1
www.server2.com
[root@client Desktop]# curl 172.25.254.1
www.server3.com
[root@client Desktop]# curl 172.25.254.1
www.server2.com
haproxy实现访问权限控制(不能让所有人都访问监控页面)
[root@server1 ~]# vim /etc/haproxy/haproxy.cfg
[root@server1 ~]# systemctl restart haproxy
访问会自动保存密码需清理缓存删除登录密码信息
haproxy定义程序日志的存放路径
[root@server1 ~]# vim /etc/haproxy/haproxy.cfg
[root@server1 ~]# vim /etc/rsyslog.conf 添加程序日志存放路径
[root@server1 ~]# systemctl restart rsyslog.service
**访问四次查看日志
[root@client Desktop]# curl 172.25.254.1
www.server3.com
[root@client Desktop]# curl 172.25.254.1
www.server2.com
[root@client Desktop]# curl 172.25.254.1
www.server3.com
[root@client Desktop]# curl 172.25.254.1
www.server2.com
haproxy设置黑名单
[root@server1 ~]# vim /etc/haproxy/haproxy.cfg
[root@server1 ~]# systemctl restart haproxy.service
测试客户端被限制访问并且看到了代码或者就在页面看到了403报错信息
设置客户端访问看到的是提示语
[root@server1 ~]# vim /etc/haproxy/haproxy.cfg
[root@server1 ~]# systemctl restart haproxy.service
更改httpd的端口为8080因80端口已经被haproxy服务占用
[root@server1 ~]# vim /etc/httpd/conf/httpd.conf
[root@server1 ~]# echo “不好意思!!访问页面丢失,请刷新试试.....” > /var/www/html/index.html
[root@server1 ~]# systemctl restart httpd
[root@client Desktop]# vim /etc/httpd/conf/httpd.conf 更改客户端的80端口
[root@client Desktop]# systemctl restart httpd
客户端测试
haproxy精准定位客户端请求(动静态访问页面分离)
是效果明显在两台后端服务器同时安装php
[root@server2 ~]# vim /var/www/html/index.php
[root@server2 ~]# cat /var/www/html/index.php
<?php
phpinfo()
?>
[root@server2 ~]# systemctl restart httpd
[root@server3 ~]# vim /var/www/html/index.php
[root@server3 ~]# cat /var/www/html/index.php
<?php
phpinfo()
?>
[root@server3 ~]# systemctl restart httpd
[root@server1 ~]# vim /etc/haproxy/haproxy.cfg 注意吧名单主机172.25.254.66取消)
[root@server1 ~]# systemctl restart haproxy.service
haproxy精准定位客户端请求实现读写分离
上传upload目录
[root@client Desktop]# ls
rpms.tar.gz upload.tar.gz
[root@client Desktop]# tar zxf upload.tar.gz 解压
[root@client Desktop]# ls
rpms.tar.gz upload upload.tar.gz
[root@client Desktop]# mv upload /var/ftp/pub/ 移动搭配vsftpd的pud目录下
上传到server2/3
[root@server2 html]# lftp 172.25.254.66
lftp 172.25.254.66:~> cd pub/
lftp 172.25.254.66:/pub> ls
drwxr-xr-x 2 0 0 46 Dec 21 07:07 upload
lftp 172.25.254.66:/pub> mirror upload 上传
Total: 1 directory, 2 files, 0 symlinks
New: 2 files, 0 symlinks
1184 bytes transferred
lftp 172.25.254.66:/pub> exit
[root@server2 html]# ls
index.html index.php upload upload_file.php
[root@server2 html]# scp -r index.php upload upload_file.php server3:/var/www/html/
root@server3's password:
index.php 100% 257 235.3KB/s 00:00
index.php 100% 257 298.8KB/s 00:00
upload_file.php 100% 927 1.1MB/s 00:00
upload_file.php
[root@server3 html]# ls 查看
index.html index.php upload upload_file.php
server1(安装haproxy的主机)
[root@server1 ~]# vim /etc/haproxy/haproxy.cfg
[root@server1 ~]# systemctl restart haproxy.service
server2/3两台后台服务器
主机客户端上测试
后端两台服务器验证读写分离