HAProxy是一个使用C语言编写的自由及开放源代码软件,其提供高可用性、负载均衡,以及基于TCP和HTTP的应用程序代理,HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理,HAProxy运行在当前的硬件上完全可以支持数以万计的并发连接,并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上
HAProxy是TCP / HTTP反向代理服务器,尤其适合于高可用性环境
可以针对HTTP请求添加cookie,进行路由后端服务器
可平衡负载至后端服务器,并支持持久连接
支持基于cookie进行调度
支持所有主服务器故障切换至备用服务器
支持专用端口实现监控服务
支持不影响现有连接情况下停止接受新连接请求
可以在双向添加,修改或删除HTTP报文首部
支持基于pattern实现连接请求的访问控制
通过特定的URI为授权用户提供详细的状态信息
实验环境:
三台虚拟机和一台物理机
虚拟机server1(172.25.254.1)配置haproxy,httpd,做代理服务器
虚拟机server2(172.25.254.2)配置httpd,php,后端服务器
虚拟机server3(172.25.254.3)配置httpd,php,后端服务器
物理机(172.25.254.250)做测试
搭建haproxy服务器
在server1上搭建haproxy服务器
安装haproxy
在系统里有自带的haproxy的安装包,可以安装来使用
查看安装后生成的文件
/etc/haproxy/haproxy.cfg ##主配置文件
/etc/logrotate.d/haproxy ##配置文件
/etc/sysconfig/haproxy ##配置文件
/usr/lib/systemd/system/haproxy.service ##启动脚本
/usr/sbin/haproxy ##命令
(1)在server1上配置
配置haproxy,让haproxy负载均衡服务器去轮询两个后端服务器
编辑主配置文件:vim /etc/haproxy/haproxy.cfg
文件里有4个语句块
global ,全局设定
defaults,默认设定
frontend,前端
backend ,后端
defaults 设定改为下图:
forntend 配置,因为这是对外开放,让用户可以访问,所以端口设为80
backend 后端配置:定义一个负载均衡服务器组,使用轮询的模式循环,配置两台服务器测试
思想:
前端判断你请求的资源是什么,然后把你的请求分配到相应的后端服务器群组里去
(2)在server2和server3上分别配置
安装httpd服务
编写测试页,开启httpd服务,并且检测
(3)配置完成后,开启haproxy服务
(4)测试
在物理机上测试,可以看到通过haproxy实现了负载均衡,轮询访问两个后端web
haproxy自带的功能测试实验
在主配置文件的defauls 语句块里加一些参数
stats uri /admin/stats ##状态查询功能
monitor-uri /monitoruri ##监视器功能
重启haproxy服务测试
使用浏览器访问“172.25.254.1/admin/stats”页面,可以看到服务端服务器web1,web2状态都是up
后台服务器的状态信息,可以看到Total列显示的被访问次数
访问 http://172.25.254.5/monitoruri,监控显示状态码200说明我们的页面没有问题
后台页面只有内部人员才能进来
设置加密访问
stats auth admin:redhat #指定登录的用户和密码
stats refresh 5s #设置自动刷新时间,每5秒刷新一次
配置成功后重启haproxy服务
浏览器上访问 http://172.25.254.1/admin/stats时,需要输入用户名和密码
监控页面自动的每5s刷新一次
(1)查看日志格式(主配置文件中有个模板)
(2)编辑系统日志服务的配置文件,打开UDP接口,创建haproxy的日志文件,重启服务
(4)使用 tail -f /var/log/haproxy.log 监控日志
(1)在haproxy主配置文件设置拒绝物理机访问haproxy服务器,重启服务
(2)测试
物理机去访问出现403报错,其他主机可以访问
说明:
在查看日志时,系统有一个警告:对block这个配置参数不建议使用,建议使用 ‘http-request deny’,block参数对于后续版本可能会失效
对于服务器页面出现403报错,对于用户会很不友好,所以做一个错误页面重定向
(1)如果后端服务器都出现问题,就让客户端访问自己的http页面
(2)安装apache
(3)编辑重定向页面
修改httpd端口,因为haproxy已经使用了80端口
重启服务
(4)测试:客户端输入172.25.254.1自动跳转到172.25.354.1:8080/index.html上
(1)编辑配置文件
如果客户端访问的是以php结尾的动态页面就去找server3,静态页面找server2
(2)重启haproxy服务
(3)配置server3
在server3主机上安装php服务
写一个php页面方便测试
重启httpd服务,将php插件加载进去
(4)测试
客户访问动态资源就去找server3
客户访问静态资源就去找server2
配置读写分离:对于不同的服务器配置,可以读速度快的服务器和写入快的服务器分开使用(一台服务器磁盘配置的比较好,写就在这台服务器上;另外一台磁盘配置的不是那么好,但cpu好一点、内存大一点,读就在这台服务器上)
配置测试文件:
(1)从物理机上给server2和server3传一个测试目录
在后端服务器server2和server3的apache默认发布目录中写入两个php页面和一个upload目录
server2和server3都要安装php
为了使haproxy主机用户对upload目录可写,需要更改文件权限为777
index.php 作为读取使用的页面,upload_file.php 作为上传操作的页面
index.php 页面代码
upload_file.php页面代码
0)
{
echo "Return Code: " . $_FILES["file"]["error"] . "
";
}
else
{
echo "Upload: " . $_FILES["file"]["name"] . "
";
echo "Type: " . $_FILES["file"]["type"] . "
";
echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb
";
echo "Temp file: " . $_FILES["file"]["tmp_name"] . "
";
if (file_exists("upload/" . $_FILES["file"]["name"]))
{
echo $_FILES["file"]["name"] . " already exists. ";
}
else
{
move_uploaded_file($_FILES["file"]["tmp_name"],
"upload/" . $_FILES["file"]["name"]);
echo "Stored in: " . "upload/" . $_FILES["file"]["name"];
}
}
}
else
{
echo "Invalid file";
}
?>
(2)在server2和server3上分别配置
为了效果明显,添加访问服务器的名称
(3)配置server1
如果写就写在server3上,读就在server2上
use_backend dynamic if write ##写访问dynamic服务器组
use_backend static if read ##读访问static服务器组
(4)测试
客户端上传图片
访问172.25.254.1/index.php
点击 “Browse” 上传一张图片,点击 “Submit” 提交,得到一个反馈页面
在接受上传的主机上查看
发现上传到了server3上,server2上没有
访问172.25.254.1/index.php,这是读的访问,是在sever2服务器上