一.Haproxy简介
HAProxy是一个使用C语言编写的自由及开放源代码软件[1],其提供高可用性、负载均衡,以及基于TCP和HTTP的应用程序代理。
HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中,同时可以保护你的web服务器不被暴露到网络上。
HAProxy实现了一种事件驱动,单一进程模型,此模型支持非常大的并发连接数。多进程或多线程模型受内存限制 、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接。事件驱动模型因为在有更好的资源和时间管理的用户空间(User-Space) 实现所有这些任务,所以没有这些问题。此模型的弊端是,在多核系统上,这些程序通常扩展性较差。这就是为什么他们必须进行优化以使每个CPU时间片(Cycle)做更多的工作。 包括 GitHub、Bitbucket[3]、StackOverflow、Reddit、Tumblr、Twitter和 Tuenti在内的知名网站,及亚马逊网络服务系统都使用了HAProxy。
二.HAProxy实验
实验环境:rhel7.5
主机名 | 作用 |
---|---|
server1(172.25.16.1) | Haproxy |
server2(172.25.16.2) | 后端httpd |
server3(172.25.16.3) | 后端httpd |
1.haproxy实现反向代理
1.server1安装haproxy
yum install -y haproxy.x86_64
rpm -qa | grep haproxy
haproxy-1.5.18-7.el7.x86_64
rpm -ql haproxy-1.5.18-7.el7.x86_64 ##查看相关文件
2.修改haproxy的配置文件
vim /etc/haproxy/haproxy.cfg
3.在server2和server3上安装httpd,并编写测试文件
yum install httpd -y
vim /var/www/html/index.html
systemctl start httpd
curl localhost
4.开启server1的haproxy的服务
5.在物理机上测试:
访问server1实现轮询访问
6.为haproxy添加访问日志
vim /etc/rsyslog.conf
systemctl restart rsyslog.service
7.再次在物理机上测试:访问server1
发现生成日志
8.配置文件中添加下面参数,可以实现web监控,和返回状态码。
返回状态码:
9.haproxy设置黑名单,实现访问控制。
yum install httpd -y
vim /var/www/html/index.html
systemctl restart haproxy
vim /etc/http/conf/http.conf
systemctl start httpd
systemctl restart httpd
测试:
2.haproxy实现动静分离
- 在server3上安装php,编辑动态页面,完成后重启服务
2.编辑haproxy的配置文件
测试:
静态访问
动态访问
3.读写分离
sever1的配置:
vim /etc/haproxy/haproxy.cfg ##修改配置文件
systemctl restart haproxy.service ##重启服务
server2和server3的配置:
yum install php -y ##安装php图形化服务
systemctl restart httpd ##重启服务
mkdir /var/www/html/upload ##建立一个目录用来写入文件
chmod 777 /var/www/html/upload ##给这个存储目录可写的权限
再编写两个文件,一个用配置读页面,一个用来设置存储路径
vim index.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";
}
?>
测试:在浏览器输入172.25.16.1/index.php来查看