Linux运维之HAProxy实现web页面的动静分离、读写分离
程序员文章站
2024-03-21 18:19:58
...
前言:
本章的内容环境承接上一篇博客:
Linux运维之HAProxy实现负载均衡(日志、监控、acl访问控制的配置)
一、实验环境
实验环境: rhel6.5 selinux and iptables disabled
实验主机:
172.25.75.1 (server1) haproxy
172.25.75.2 (server2) web1
172.25.75.3(server3) web2
172.25.75.250 客户端
二、动静分离
1、动静分离的实用性
实际应用环境中,往往需要根据业务请求将相关不同请求跳转到指定的后端server,比如客户静态资源请求交给静态资源server处理,php请求交给php server处理,jsp请求交给tomcat处理,即业务上的应用请求分离,而haproxy完全可以利用acl匹配规则实现这一目的
2、更改haproxy服务端的配置文件,并重启服务
vim /etc/haproxy/haproxy.cfg
global
maxconn 65535
stats socket /var/run/haproxy.stat mode 600 level admin
log 127.0.0.1 local0
uid 200
gid 200
chroot /var/empty
daemon
defaults
mode http
log global
option httplog
option dontlognull
monitor-uri /monitoruri
maxconn 8000
timeout client 30s
retries 2
option redispatch
timeout connect 5s
timeout server 5s
stats uri /admin/stats
# The public 'www' address in the DMZ
frontend public
bind 172.25.75.1:80 name clear
#bind 192.168.1.10:443 ssl crt /etc/haproxy/haproxy.pem
#use_backend static if { hdr_beg(host) -i img }
#use_backend static if { path_beg /img /css }
use_backend dynamic if { path_end .php }
default_backend static
# The static backend backend for 'Host: img', /img and /css.
backend static
balance roundrobin
server web1 172.25.75.2:80 check inter 1000
backend dynamic
balance roundrobin
server web2 172.25.75.3:80 check inter 1000
重启服务:
/etc/init.d/haproxy restart
3、在server3上删除默认发布页,编辑index.php发布页,下载php插件
cd /var/www/html/
rm -rf index.html
vim index.php
<?php
phpinfo();
?>
yum install php -y
4、server3上重启httpd服务
/etc/init.d/httpd restart
5、测试
静态:
在客户端浏览器输入:
172.25.75.1/index.html
动态:
在客户端浏览器输入:
172.25.75.1/index.php
三、读写分离
1、server1修改haproxy配置文件,并重启服务
vim /etc/haproxy/haproxy.cfg
更改:
34 frontend public
35 bind 172.25.75.1:80 name clear
36 #bind 192.168.1.10:443 ssl crt /etc/haproxy/haproxy.pem
37 #use_backend static if { hdr_beg(host) -i img }
38 #use_backend static if { path_beg /img /css }
39
40 acl write method POST
41 acl write method PUT
42
43 acl read method GET
44 acl read method HEAD
45
46 use_backend static if write
47 default_backend dynamic
48
49 # The static backend backend for 'Host: img', /img and /css.
50 backend static
51 balance roundrobin
52 server web1 172.25.75.2:80 check inter 1000
53
54 backend dynamic
55 balance roundrobin
56 server web2 172.25.75.3:80 check inter 1000
/etc/init.d/haproxy restart
此配置文件的目的为:默认进入web2的发布页面,也就是web2为读的服务器,write时为static服务,也就是web1写服务器,实现网页的读写分离。
2、在server3上发布网页内容,此文件为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>
/etc/init.d/httpd restart
3、在server2上编写write时的web1发布内容,创建上传目录upload,重启服务
vim upload_file.php
<?php
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/pjpeg"))
&& ($_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";
}
?>
创建upload目录,并重启服务:
mkdir upload
chmod 777 upload
/etc/init.d/httpd restart
4、测试
在客户端浏览器输入:172.25.75.1
分析:网页所展示的内容为web2(server3)的httpd服务发布的内容。
点击Browse,选择一张图片上传。
点击:Submit
分析:上传图片后显示的页面为web1(server2)httpd发布的内容。
查看server2的upload目录:
图片在web1(server2)的服务器中!实现了web页面的读写分离!!!