HAproxy七层负载均衡——访问控制、动静分离、读写分离实现过程详解
实验环境
主机名 | IP | 服务 |
---|---|---|
虚拟机server1 | 172.25.6.1 | haproxy,httpd,服务端 |
虚拟机server2 | 172.25.6.2 | httpd,php,客户端 |
虚拟机server3 | 172.25.6.3 | httpd,php,客户端 |
物理机 | 172.25.6.250 | 测试端 |
一、访问控制
1.用户密码访问
(1)编辑配置文件
设置用户和密码以及刷新时间
vim haproxy.cfg
/etc/init.d/rsyslog restart
stats auth admin:peng ##用户名为admin,密码为peng
stats refresh 5s ##刷新时间为5s
修改内容如下
(2)测试:浏览器访问需要输入密码,密码输入正确后可以访问
(3)查看日志看刷新时间
<1>编辑日志服务的配置文件,打开UDP接口,创建haproxy的日志文件,重启服务
vim /etc/rsyslog.conf
/etc/init.d/rsyslog restart
<2>查看日志文件,可以看到5秒刷新一次
cat /var/log/haproxy.log
2.黑名单
(1)编辑配置文件,重启服务
vim haproxy.cfg
/etc/init.d/haproxy reload
(2)物理机访问:出现403报错
curl 172.25.6.1
3.错误页面重定向
(1)编辑配置文件,重启服务
vim haproxy.cfg
/etc/init.d/haproxy reload
(2)编辑httpd配置文件修改httpd端口,编辑测试页。开启服务
yum install -y httpd
vim /etc/httpd/conf/httpd.conf
(3)物理机测试:物理机访问没有结果,浏览器访问错误页面重定向到server1
二、动静分离
在下面的实验中我们将server2设置为动态资源的服务器,server3设置为静态资源的服务器
(1)编辑配置文件
vim /etc/haproxy/haproxy.cfg
/etc/init.d/haproxy restart
(2)编辑配置文件,设置动静分离,退出保存后重启服务
vim /etc/haproxy/haproxy.cfg
/etc/init.d/haproxy restart
(3)server3安装php,编辑php默认测试页,重启httpd
yum install php -y
(4)打开浏览器测试:
三、读写分离
(1)编辑配置文件,部分内容如下:
vim /etc/haproxy/haproxy.cfg
/etc/init.d/haproxy restart
(2)server2在/var/www/html目录下创建两个文件和一个upload目录(因为我们在设置时,规定写如static服务器,即server2),给他们满权限
chmod 777 upload
(3)在server2上重写发布文件
vim 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>
vim 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"] . "<br />";
}
else
{
echo "Upload: " . $_FILES["file"]["name"] . "<br />";
echo "Type: " . $_FILES["file"]["type"] . "<br />";
echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br />";
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";
}
?>
(4)server2安装php,并重启httpd服务
yum install -y php
/etc/init.d/httpd restart
(5)将这三个文件和目录传给server3
scp -r /var/www/html/* server3:/var/www/html/
(6)server3查看,并将其他的文件删除
(7)编辑index.php文件,方便观察给submit前添加内容,重启服务
vim index.php
/etc/init.d/httpd restart
(8)打开浏览器测试:
访问172.25.22.1出现的页面中出现【server3 172.25.6.3】,说明读到的是server3,上传图片,可以在server2的uopload目录下看到。
上传成功
在server3的upload目录里查看
在server2的upload目录里查看
通过上述的实验证实了,用户在访问时访问了server3(读操作),当进行资源上传时,内容上传到了server2(写操作),由此实现了读写分离