HAProxy是一个使用C语言编写的自由及开放源代码软件,其提供高可用性、负载均衡,以及基于TCP和HTTP的应用程序代理。
HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。
haproxy 的官网:https://www.haproxy.org/,需要新版本的话可以在这里下载,但是官网上的包都是源码包需要自行编译
在系统里也有自带的haproxy的安装包,不是最新版而已,也可以去使用
执行yum install 安装,查看一下安装出的文件
/etc/haproxy/haproxy.cfg #主配置文件
/etc/logrotate.d/haproxy #配置文件
/etc/sysconfig/haproxy #配置文件
/usr/lib/systemd/system/haproxy.service #启动脚本
/usr/sbin/haproxy #命令
vim /etc/haproxy/haproxy.cfg ,编辑主配置文件
进入可以看到里面4个大块
global ,全局设定
defaults,默认设定
frontend,前端
backend ,后端
更改配置:
global 我们暂时不做更改
forntend 配置,要将前端的端口设为80,因为这是对外开放到,需要让用户访问到,
backend 后端的配置可以自行定义,这里是定义一个负载均衡服务器组,使用轮询的方式,配置两台服务器测试,这样就可以了
测试:
打开配置的两台服务器主机,并安装打开apache服务,开启80端口,主机配置火墙服务
在两天的主机的默认发布页面分别写入不同的内容方便区分
配置完成后访问测试,就实现了负载均衡
这里了可以在defauls 配置里写一些参数,这写功能都是haproxy自带的
stats uri /admin/stats #状态查询功能
monitor-uri /monitoruri #监视器功能
然后重启haproxy服务测试,使用浏览器访问“域名下的/admin/stats”页面
这里有我们后台服务器的状态信息,并且可以看到Total列显示的被访问次数
访问另一个功能 http://172.25.254.5/monitoruri,监控显示的200就是我们的页面是没有问题的
这里我们配置监控、状态查询等功能目前看来对谁都是可见的,这就很不安全,会暴露我们的服务器信息,所以需要配置访问权限让只有内部人员可以看到这些信息
编辑主配置文件:
stats auth admin:redhat #指定登录的用户和密码
stats refresh 3s #设置自动刷新时间
配置完重启服务,再去访问 http://172.25.254.5/admin/stats,发现需要输入用户名密码,输入进去后,自动的每3s刷新一次页面
这样我们就完成haproxy的反向代理和负载均衡的搭建和测试
对于haproxy的服务,我们可以重定向它的日志存放路径方便我们查看,因为在启动或重启服务时发现它如果配置文件出错也是不会报错的,需要手动查看状态才知道启动是否成功,如果失败去查看 /var/log/message s 也是比较麻烦的
在主配置文件里的global 设定里也是给了一个示例
这样可以去编辑 rsyslog 重定向日志: vim /etc/rsyslog.conf
在里面开启UDP功能
在 RULES 下写入日志路径,就是用主配置文件中给定的示例
重启 rsyslog 后,我们测试重启haproxy服务,就可以看到日志被记录在新定义的文件里
也可以使用 tail -f /var/log/haproxy.log 监控日志
编辑主配置文件
acl blacklist src 172.25.254.2 #设置黑名单里的主机
bloack if blacklist #读取黑名单
写完配置重启服务,使用172.25.254.2主机访问,访问错误被拒绝
使用其他主机去访问就没有问题
这里有一个需要说明的是,查看日志系统又给一个警告对block这个配置参数的说明,不推荐使用block ,推荐去使用 ‘http-request deny’
所以可以将参数改为
acl blacklist src 172.25.254.2
http-request deny if blacklist
如果用户访问页面时出现403这类的报错我们可以配置错误代码的页面重定向,可以配图片或详细说明,对用户有更好的体验
配置参数,编辑主配置文件
errorloc 403 http://172.25.254.5:8080/index.html #遇到403报错时请求8080端口的index.html页面
这个8080端口可以去安装apache或nginx配置一个index.html页面
编辑主配置文件
use_backend dynamic if { path_end .php } #如果访问页面时php结尾的类型,访问dynamic服务器组
backend dynamic #定义服务器组
balance roundrobin
server web2 172.25.254.3:80 check
然后重启服务,这里我们定义的172.25.254.3为动态php的服务器,为了测试需要在该主机上安装php服务,并写一个php页面方便测试
[root@sever3 ~]# yum install -y php
[root@sever3 ~]# cat /var/www/html/index.php
<?php
phpinfo()
?>
配置完成重启httpd服务,访问测试php默认页面是成功的
php的配置没有问题后,我们访问haproxy主机
这样就完成了7层负载均衡的配置,动态请求和静态请求分离处理
读写分离是haproxy中的独特功能
为何要配置读写分离,因为对于不同的服务器配置,可以读速度快的服务器和写入快的服务器分开使用,这样对服务器的性能最大化使用
配置测试文件:
首先在后端服务器server4和server3的apache默认发布目录中写入两个php页面和一个upload目录,并都要安装php,为了使haproxy主机用户对upload目录可写,需要更改文件权限为777
index.php 作为读取使用的页面,upload_file.php 作为上传操作的页面
php页面的内容如下:
[root@sever3 html]# cat index.php
<html>
<body>
<form action="upload_file.php" method="post"
enctype="multipart/form-data">
<label for="file">Filename:</label>
<input type="file" name="file" id="file" />
<br />
<input type="submit" name="submit" value="Submit" />
</form>
</body>
</html>
[root@sever3 html]# cat index.php
<html>
<body>
<form action="upload_file.php" method="post"
enctype="multipart/form-data">
<label for="file">Filename:</label>
<input type="file" name="file" id="file" />
<br />
<input type="submit" name="submit" value="Submit" />
</form>
</body>
</html>
[root@sever3 html]# cat upload_file.php
<?php
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/pjpeg"))
&& ($_FILES["file"]["size"] < 20000000))
{
if ($_FILES["file"]["error"] > 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";
}
?>
编辑haproxy主配置文件
配置读和写的方式:
acl read method HEAD
acl read method GET
acl write method POST
acl write method PUT
use_backend dynamic if read #读访问dynamic服务器组
use_backend static if write #写访问static服务器组
测试
访问172.25.254.5/index.php,这是读的访问,是在sever3服务端上
点击 “Browse” 上传一个文件测试
这里我上传了一张图片,点击 “Submit” 提交,得到一个反馈页面
这时我们去在接受上传的主机上查看到刚才上传的图片