文章目录
- 实验环境
- 一、搭建HAProxy负载均衡
- 二、给haproxy服务器添加日志
- 三、动态静态请求分离
- 四、访问控制和页面重定向
- 1、403错误页面重定向
- 2、黑名单重定向
- 3、301永久重定向
- 五、Haproxy的读写分离
实验环境
主机名 | IP | 服务 |
server1 | 172.25.1.1 | haproxy+httpd,代理服务器 |
server2 | 172.25.1.2 | httpd+php,后端服务器 |
server3 | 172.25.1.3 | httpd+php,后端服务器 |
物理机 | 172.25.1.250 | 客户端,测试 |
一、搭建HAProxy负载均衡
在server1上:
步骤一:安装haproxy
yum install haproxy -y
步骤二:更改配置文件,添加负载均衡信息及监控页面信息
(1)方式一:
vim /etc/haproxy/haproxy.cfg
63 frontend main
64 bind *:80
65 default_backend webserver
70 backend webserver
71 balance roundrobin
72 server web1 172.25.1.2:80 check
73 server web1 172.25.1.3:80 check
(2)方式二:listen:可以理解为frontend和backend的组合体
listen admin *:8080
stats enable
stats uri /status # 监控页面地址
stats auth admin:westos # 管理帐号和密码
stats refresh 5s #刷新频率
listen webserver *:80 #监听的实例名称,地址和端口
balance roundrobin #负载均衡算法
server web1 172.25.1.2:80 check
server web2 172.25.1.3:80 check
步骤三:开启haproxy
systemctl start haproxy
systemctl status haproxy
netstat -antuple
在server2上:
步骤一:安装httpd服务
yum install httpd -y
步骤二:编写默认发布页面,并开启httpd服务
vim /var/www/html/index.html
<h1>server2's page</h1>
systemctl start httpd
systemctl status httpd
在server3上:
步骤一:安装httpd服务
yum install httpd -y
步骤二:编写默认发布页面,并开启httpd服务
vim /var/www/html/index.html
<h1>server3's page</h1>
systemctl start httpd
systemctl status httpd
在物理机上测试:
此时,可以看出实现了负载均衡打开浏览器搜索http://172.25.1.1:8080/status
模拟server3故障:
systemctl stop httpd
在物理机上访问测试:
浏览器上查看集群节点状态:
server3故障恢复:
浏览器上查看集群节点状态:web2恢复正常
二、给haproxy服务器添加日志
在server1上:
步骤一:查看haproxy日志类型
vim /etc/haproxy/haproxy.cfg
步骤二:更改日志监控的配置文件,打开UDP接口,创建haproxy的日志文件
vim /etc/rsyslog.conf
15 $ModLoad imudp
16 $UDPServerRun 514
55 local2.* /var/log/haproxy.log
步骤三:重启haproxy和rsyslog服务,并查看日志
systemctl restart haproxy
systemctl restart rsyslog
cat /var/log/haproxy.log #查看日志
三、动态静态请求分离
在server1上:
步骤一:更改配置文件,添加访问控制策略
frontend:用来匹配接收客户所请求的域名,uri等,并针对不同的匹配,做不同的请求处理
vim /etc/haproxy/haproxy.cfg
frontend main *:80
acl url_static path_beg -i /images #path_beg: 用于测试请求的URL是否以指定的模式开头
acl url_static path_end -i .jpg .gif .png #path_end:用于测试请求的URL是否以指定的模式结尾
use_backend static if url_static #满足上面条件,则为静态请求
default_backend webserver #默认动态
backend static #静态请求
server web2 172.25.1.3:80 check
backend webserver #动态请求
server web1 172.25.1.2:80 check
server local 172.25.1.1:8000 backup #做本机8000端口的一个备错信息,若所有机器都down则启动
listen admin *:8080
stats enable
stats uri /status
stats auth admin:westos
stats refresh 5s
步骤二:重启haproxy服务
systemctl restart haproxy
在server3上:
在httpd默认发布目录下新建images目录,上传一张.jpg的图片。
mkdir /var/www/html/images
在server1上:
步骤一:安装httpd服务
yum install -y httpd
步骤二:更改httpd服务的工作端口为8000,添加web服务的资源
vim /etc/httpd/conf/httpd.conf
42 Listen 8000
vim /var/www/html/index.html
<h1>server1's page</h1>
systemctl start httpd
netstat -antuple
在真机上测试:
打开浏览器搜索http://172.25.1.1/images/
访问到server3服务器上的资源直接搜索http://172.25.1.1/
此时,访问到server2服务器上的资源
模拟server2和server3故障:
在server2上:
systemctl stop httpd
在server3上:
systemctl stop httpd
在真机上测试:
刷新页面
此时server1上线,故障顶替
四、访问控制和页面重定向
1、403错误页面重定向
在server1上:
步骤一:更改配置文件,添加重定向规则
vim /etc/haproxy/haproxy.cfg
frontend main *:80
acl url_static path_beg -i /images
acl url_static path_end -i .jpg .gif .png
acl badhost src 172.25.1.250 #黑名单,设定物理机不能访问server1
block if badhost
errorloc 403 http://172.25.1.1:8000 #注意端口不要冲突,如果是403错误就重定向到 172.25.1.1:8000
use_backend static if url_static
default_backend webserver
backend static
server web2 172.25.1.3:80 check
backend webserver
server web1 172.25.1.2:80 check
listen admin *:8080
stats enable
stats uri /status
stats auth admin:westos
stats refresh 5s
步骤二:修改默认发布页面内容
vim /var/www/html/index.html
sorry!!!
在真机上测试:
打开server2和server3httpd服务:
在真机上测试:
刷新页面
2、黑名单重定向
步骤一:更改配置文件,修改访问控制策略
vim /etc/haproxy/haproxy.cfg
frontend main *:80
acl url_static path_beg -i /images
acl url_static path_end -i .jpg .gif .png
acl badhost src 172.25.1.250
redirect location http://172.25.1.1:8000 if badhost #如果badhost主机访问,就重定向
use_backend static if url_static
default_backend webserver
步骤二:重启haproxy服务
systemctl restart haproxy
在真机上测试:
3、301永久重定向
301 代表永久性转移(Permanently Moved);302 redirect: 302 代表暂时性转移(Temporarily Moved )
301表示旧地址A的资源已经被永久地移除了(这个资源不可访问了),搜索引擎在抓取新内容的同时也将旧的网址交换为重定向之后的网址;302表示旧地址A的资源还在(仍然可以访问),这个重定向只是临时地从旧地址A跳转到地址B,搜索引擎会抓取新的内容而保存旧的网址。
在server1上:
vim /etc/haproxy/haproxy.cfg
frontend xiyou *:80
acl westos.org hdr_beg(host) -i westos.org
acl 172.25.1.1 hdr_beg(host) -i 172.25.1.1
redirect code 301 location http://www.westos.org if westos.org #以westos.org访问 自动重定向 www.westos.org)
redirect code 301 location http://www.westos.org if 172.25.1.1 #以172.25.7.1访问 自动重定向 www.westos.org)
步骤二:重启haproxy服务
systemctl restart haproxy
在物理机测试:
浏览器搜索:http://172.25.1.1
自动跳转:
浏览器搜索:www.org
自动跳转:
五、Haproxy的读写分离
在server2上:
步骤一:下载php
yum install php -y
步骤二:在网上下载upload目录,里面含php文件写好了用户上传页面及上传的文件所在地,将文件和目录放到默认发布目录下。
mv upload /var/www/html/
cd /var/www/html/
mv upload/* .
附: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>
附:upload_file.php文件内容
<?php
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/pjpeg"))
&& ($_FILES["file"]["size"] < 20000))
{
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目录权限,并重启httpd服务
chmod 777 upload
systemctl restart httpd
在server3上:
步骤一:下载php
yum install php -y
步骤二:在网上下载upload目录,里面含php文件写好了用户上传页面及上传的文件所在地,将文件和目录放到默认发布目录下。
mv upload /var/www/html/
cd /var/www/html/
mv upload/* .
步骤三:给upload目录权限,并重启httpd服务
chmod 777 upload
systemctl restart httpd
在server1上:
步骤一:修改配置文件,添加访问策略
vim /etc/haproxy/haproxy.cfg
acl read method GET
acl read method HEAD #两个read write 只用一个就行
acl write method PUT
acl write method POST
use_backend webserver if write
default_backend static
backend static
server web2 172.25.1.3:80 check
backend webserver
server web1 172.25.1.2:80 check #默认会上传到这个real server
server local 172.25.1.1:8000 backup
步骤二:重启haproxy
systemctl restart haproxy
在真机上测试:
在server2上查看:
发现文件提交到server2的upload目录中
在server3上查看:
并没有提交的文件
至此,实现了haproxy读写分离