Table of Contents
四层负载均衡:lvs
七层负载均衡:nginx | haproxy | apache,将请求分发到具体应用的服务器上。例如:请求搜索,分发到搜索服务器。布置在应用服务器前
1. Haproxy
官方文档:https://www.haproxy.org/#docs
下载地址:https://www.haproxy.org/#down
1.1 Haproxy定义
HAProxy 是一款提供高可用性、负载均衡以及基于TCP(第四层)和HTTP(第七层)应用的代理软件。适用于负载特大的web站点,这些站点通常又需要会话保持或七层处理
1.2 实验环境
node1:192.168.1.11 安装haproxy服务器
node2:192.168.1.12
node3:192.168.1.13
1.3 Haproxy实现反向代理 + 负载均衡
1.3.1 安装haproxy
yum list haproxy # 查找系统中是否含有haproxy安装包
yum install -y haproxy.x86_64 # 安装haproxy
rpm -qa | grep haproxy # 获得haproxy软件包的文件全名
rpm -ql haproxy-1.5.18-8.el7.x86_64 # 列出haproxy-1.5.18-8.el7.x86_64.rpm包安装的文件
1.3.2 编辑配置文件
vim /etc/haproxy/haproxy.cfg
- 全局设置
安装之后,系统会创建haproxy用户和用户组,在我们使用haproxy时使用该用户和用户组
- 默认设置
- 前端设置【判断请求类型或请求资源,然后分发给对应的后端集群组】
- 后台设置
1.3.3 测试
- 安装httpd【node2和node3均安装】
yum install -y httpd
- 编辑默认发布页面【node2和node3均添加】
echo This is node2 page > /var/www/html/index.html
- 开启httpd服务【node2和node3】
systemctl start httpd.service
- 开启haproxy【node1】
- 访问
没错,反向代理+负载均衡已经实现了。
那么除了这些默认的设置,我们能不能添加一些别的模块,来,我们试试~
1.4 模块管理
1.4.1 页面管理
- 编辑配置文件
在这里我们添加查看后端状态、 监控路径模块
- 重启haproxy
- 访问
但是这里我们要注意:服务器状态信息不能让所有人都可以访问,否则会泄漏信息,我们必须要设置只有管理员访问才可以保证安全性~
1.4.2 访问权限控制
- 编辑配置文件
- 重启haproxy
- 访问
可以看到,登录控制已经实现,且页面每5秒自动刷新一次
1.4.3 配置日志
vim /etc/rsyslog.conf # 编辑系统日志
###
*.* 第一个*代表日志类型,第二个*代表日志级别
日志级别[由高到低]:
critical
error
warning
info
debug
###
- 日志是UDP的,打开UDP
- 根据配置文件日志路径定义系统日志
- 重启系统日志
1.5 设置用户访问权限
1.5.1 增加黑名单
- 编辑配置文件
- 重启服务
- 测试结果
192.168.1.250主机访问被拒绝,为了验证不是所有主机均无法访问,这里我们由192.168.1.13访问测试
正常访问~~
1.5.2 重定向
当访问出现403时,重定向到192.168.1.11:8080/index.html
- 编辑haproxy配置文件
- 安装Apache【node1】,并启用
yum install -y httpd
systemctl start httpd.service
- 编辑默认发布页面
echo 'This access is denied' > /var/www/html/index.html
- 编辑Apache配置文件,修改端口
vim /etc/httpd/conf/httpd.conf # 编辑配置文件
###
将端口修改为8080,因为80端口已经被Haproxy占用
###
image widget
- 启动Apache,并重启haproxy
- 访问
可以看到,当我们通过192.168.1.250访问192.168.1.11时,因为在黑名单的原因,403被拒绝,因此重定向到index.html页面 。
1.6 Haproxy实现动态页面和静态页面分离
- 编辑配置页面
- 重启haproxy
由于我们node3分发的是动态资源,这里我们需要安装php
- 安装php【node3】,并编辑index.php
- 测试
默认访问的是node2
php页面访问的是node3
上面完成的操作是不是有些眼熟,是的,上面的操作我们通过nginx也可以实现,我们访问nginx自己就可以了,为什么要使用Haproxy呢?Haproxy的优势在哪?
Haproxy可以实现读写分离,读从其中一台服务器读取,写则写入另一台服务器上。
1.7 Haproxy实现读写分离
node2安装php,步骤就不赘余了
- 编辑haproxy配置文件
这里我们配置node2读,node3写,默认访问node2
node2:
- 给upload目录权限
能够让Haproxy有写的权限,完成上传操作
重启httpd
node3:
vim dsd2333.php
###
<?php
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/pjpeg"))
&& ($_FILES["file"]["size"] < 30000000))
{
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";
}
?>
###
- 测试
上传
可以看到,上传成功,已经写入upload目录下。
可以看到,已经写到node3的upload目录下