实验环境:
实验环境: rhel7.3
实验主机:
172.25.7.1(server1) haproxy
172.25.7.2(server2) web1
172.25.7.3(server3) web2
172.25.7.250 客户端
动静分离
根据实际情况和客户方访问请求,将不同类型的访问请求调转到不同的后端服务器。php请求交给php server处理,jsp请求交给tomcat处理,即业务上的应用请求分离,而haproxy完全可以利用acl匹配规则实现这一目的
实验:访问 http://172.25.7.1 和 http://172.25.7.1/images 将被定义到不同的后端服务器
1 修改haproxy主机配置文件
global # 全局变量
log 127.0.0.1 local2
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
stats socket /var/lib/haproxy/stats
defaults # 默认参数
mode http
log global
option httplog
option dontlognull
option http-server-close
option forwardfor except 127.0.0.0/8
option redispatch
retries 3
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s
maxconn 3000
listen admin *:8080 # 监控页面
stats enable
stats uri /status
stats auth admin:redhat
stats refresh
#设置接收请求的前端虚拟节点,Frontend可以增加规则直接指定具体使用后端的backend
frontend main *:80
acl url_static path_beg -i /images
acl url_static path_end -i .jpg .gif .png .css .js # 增加规则
use_backend static if url_static
default_backend app # 不同的条件对应不同的后端服务器
backend static # 定义后端服务器
server web1 172.25.7.2:80 check
backend app # 定义后端服务器
server web2 172.25.7.3:80 check
systemctl restart haproxy # 重新启动服务
2 后端服务器设置:
当访问 http://172.25.7.1/images 时候,请求会被调转到 172.25.13.120 。需要在该主机中创建:/var/www/html/images 目录 ,提前在该目录中放置一张图片
3 测试:
使用客户端访问 http://172.25.7.1。访问指定的后端服务器 172.25.7.3
使用客户端访问 http://172.25.7.1/images 。访问指定的后端服务器 172.25.7.2
至此web页面的动静分离实现,主要是根据不同的请求将其指定到不同后端服务器
重定向(acl访问控制)
当客户访问某一域名的时候,由于需要服务器将其重新定向到另一个域名。
比如:
[root@foundation7 ~]# curl -I taobao.com #访问taobao,com
HTTP/1.1 302 Found # 被临时重定向
Server: Tengine
Date: Wed, 26 Jun 2019 16:22:36 GMT
Content-Type: text/html
Content-Length: 258
Connection: keep-alive
Location: http://www.taobao.com/ #被重定向到 http://www.taobao.com/
重定向的两种:
301:永久重定向
302:临时重定向
acl访问控制(指定主机不能访问,将该指定主机的访问指向固定的位置)
haproxy主机设置:
修改配置文件:在上一个实验的配置文件基础上修改Frontend段落
由于设置将限制访问的请求指向本机的。本机安装httpd服务,并将端口改为8000,由于80端口被占用。
yum install httpd -y
echo 限制访问 > /var/www/html/index.html
vim /etc/httpd/conf/httpd.conf # 修改端口为8000
systemctl start httpd
其他主机进行访问:正常访问,并没由限制
重定向
目标:当访问toto.com 或者172.25.13.110 的时候,全部被重定向到 www.toto.com
haproxy主机设置:
修改配置文件:在上一个实验的配置文件基础上修改Frontend段落
frontend main *:80
acl url_static path_beg -i /images
acl url_static path_end -i .jpg .gif .png .css .js
acl toto.com hdr_beg(host) -i westos.com # 添加规则
acl 172.25.7.1 hdr_beg(host) -i 172.25.7.1 #添加规则
redirect code 301 location http://www.westos.com if toto.com
redirect code 301 location http://www.westos.com if 172.25.7.1 # 指定重定向
use_backend static if url_static
default_backend app
客户主机上做好解析:
[root@foundation7 ~]# vim /etc/hosts
172.25.7.1 toto.com www.westos.com
测试:
使用客户主机访问172.25.7.1
都被成功的重定向到 www.westos.com
读写分离
当客户写入内容和读取内容的请求会被调转到不同的后端服务器
haproxy主机设置:
修改配置文件:在上一个实验的配置文件基础上修改Frontend段落
frontend main *:80
acl url_static path_beg -i /images
acl url_static path_end -i .jpg .gif .png .css .js
acl read method HEAD
acl read method GET
acl write method PUT
acl write method POST
use_backend app if write
default_backend static
backend static
server web1 172.25.7.2:80 check
backend app
server web2 172.25.7.3:80 check
systemctl restart haproxy # 重启服务
安装php插件,由于下面需要解析php编写的页面
[root@server1 ~]# yum install php -y
此配置文件的目的为:默认进入web1的发布页面,也就是web1为读的服务器,write时为app服务,也就是web2写服务器,实现网页的读写分离。
在 web1:172.25.7.2上发布网页内容,并重启httpd服务
[root@server2 html]# vim /var/www/html/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>
systemctl restart httpd #重启服务
在web2:172.25.7.3 上编写write时的web2发布内容,创建上传目录upload,重启httpd服务
[root@server3 html]# vim /var/www/html/upload_file.php
<?php
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/pjpeg"))
&& ($_FILES["file"]["size"] < 200000000))
{
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
[root@server3 html]# mkdir /var/www/html/upload
[root@server3 html]# chmod 777 /var/www/html/upload
systemctl restart httpd #重启服务
注意:upload_file.php、index.php两个文件的均要有写权限。(若无写权限,则会出现网页空白的现象)
测试:客户端访问 http://172.25.7.1/index.php
读: 读取的是主机 172.25.7.2
写:写入主机 172.25.7.3
[root@server3 html]# ls upload
haha.jpg # 图片上传成功
[root@server3 html]#
读写分离成功!