Haproxy
haproxy提供高可用性、负载均衡以及基于TCP(第四层)和HTTP(第七层)应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。
haproxy特别适用于那些负载特别大的web站点,这些站点通常又需要会话保持或七层处理。haproxy运行在时下的硬件上,完全可以支持数以万计的并发连接,并且它的运行模式使得它可以很简单安全的整合进您当前的架构中,同时可以保护你的web服务器不被暴露到网络上。
haproxy实现了一种事件驱动、单一进程模型,此模型支持非常大的并发连接数。多进程或多线程模型受内存限制、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接。
事件驱动模型因为在有更好的资源和时间管理的用户端(User-Space)实现所有这些任务,所以没有这些问题。此模型的弊端是,在多核系统上,这些程序通常扩展性较差。这就是为什么他们必须进行优化以使每个CPU时间片(Cycle)做更多的工作。
图解:
本篇博客中涉及的所有软件包下载可参考此博客:https://blog.youkuaiyun.com/qq657886445/article/details/83662696
haproxy配置
server1
rpmbuild -tb haproxy-1.4.24.tar.gz #需安装 rpm-build 和 pcre-devel
rpm -qpl haproxy-1.4.24-1.x86_64.rpm --scripts #查看rpm包隐藏的脚本
rpm -ivh haproxy-1.4.24-1.x86_64.rpm
groupadd -g 200 haproxy
useradd -g 200 -u 200 -M haproxy
vim /etc/security/limits.conf
最后一行添加
haproxy - nofile 65535
tar zxf haproxy-1.4.24.tar.gz
cp haproxy-1.4.24/examples/content-sw-sample.cfg /etc/haproxy/haproxy.cfg
vim /etc/haproxy/haproxy.cfg #修改配置文件
/etc/init.d/haproxy start #开启服务
物理机测试
浏览器访问172.25.254.1 访问轮询
172.25.254.1/status #haproxy 监控页面
172.25.254.1/monitoruri #若返回200 OK 则表示正常
创建指定日志文件
vim /etc/rsyslog.conf
取消注释,使UDP端口接收生效.
添加日志并指定日志保存路径,local0.none表示在/var/log/messages下不保存
acl权限列表
1)建立acl黑名单,指定ip,更改配置文件
/etc/init.d/haproxy restart #重启服务
测试查看:提示403错误
2)错误重定向
修改haproxy配置文件将错误重定向到本机的apache服务
为避免与haproxy服务端口发生冲突,将apache端口改为8080
重启服务
测试:
3)指定ip重定向
修改haproxy配置文件并重启服务
测试:
动静分离
server1:
修改配置文件/etc/haproxy/haproxy.cfg,并重启服务
server2:
写一个简单的.php文件
测试:
访问Server1 ip 默认访问server3页面
访问server1 ip/index.php 访问server2页面 # server2安装php并重启apache
读写分离
Server1:
修改配置文件/etc/haproxy/haproxy.cfg,如果有写入操作,访问动态主机server3,并重启服务
Sever2:
cd /var/www/html/
mkdir upload
# 编写php页面
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"]["type"] == "image/png")
|| ($_FILES["file"]["type"] == "image/jpg"))
&& ($_FILES["file"]["size"] < 2000000))
{
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";
}
?>
scp -r /var/www/html/* server3:/var/www/html/
Server3:
安装php并重启httpd
测试:
访问server1 ip/index.php
上传一个图片
server2实现写 图片实际保存在server2上 读的时候访问的是server3;server2查看可以看到图片保存在server2上
实现了读写分离