linux运维——haproxy(读写分离,动静分离,)

实验环境

实验环境 rhel7.3

实验主机:
172.25.5.1(server)          haproxy
172.25.5.2(server2)        web1
172.25.5.3(server3)	  web2
172.25.5.250                 客户端主机
动静分离

根据实际情况客户方访问请求,将不同类型的访问请求调转到不同的后端服务器。php请求交给php server处理,jsp请求交给tomcat处理,即业务上的应用请求分离,而haproxy完全可以利用acl匹配规则实现这一目的
实验:访问 http://172.25.5.1http://172.25.5.1/images 将被定义到不同的后端服务器。

修改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.5.2:80 check    后端服务器

backend app
    server  web2 172.25.5.3:80 check    后端服务器
    server  local 172.25.5.1:8000         backup     当两台后端服务器同时宕机,haproxy主机就会替代上去

[root@server1 haproxy]# vim /etc/httpd/conf/httpd.conf ##更改端口为8000
systemctl restart httpd
systemctl restart haproxy # 重新启动服务
2 后端服务器设置
当访问 http://172.25.5.1/images 时候,请求会被调转到 172.25.5.2 。需要在该主机中创建:/var/www/html/images 目录 ,提前在该目录中放置一张图片。
3 测试:
使用客户端访问 http://172.25.5.1 。访问指定的后端服务器 172.25.5.3
在这里插入图片描述

使用客户端访问 http://172.25.5.1/images 。访问指定的后端服务器 172.25.5.2

在这里插入图片描述
至此web页面的动静分离实现,主要是根据不同的请求将其指定到不同后端服务器

重定向(acl访问控制)

当客户访问某一域名的时候,由于需要服务器将其重新定向到另一个域名。
比如:

[root@foundation13 ~]# 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段落

frontend  main *:80
    acl url_static       path_beg       -i /images
    acl url_static       path_end       -i .jpg .gif .png .css .js
        acl blacklist src 172.25.5.250 				 # 指定限制访问的ip
        redirect location http:172.25.5.1:8000/index.html if badhost
        # 如果被限制之后,将其访问指向 http://172.25.5.1:8000/index.html
    use_backend static          if url_static
    default_backend             app

systemctl restart haproxy # 重新启动服务
使用172.25.5.250 访问:访问被限制,并且重定向到指定的位置
在这里插入图片描述
其他主机进行访问:正常访问,并没由限制
在这里插入图片描述

重定向

目标:当访问pp.com 或者172.25.5.1 的时候,全部被重定向到 www.pp.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 pp.com          hdr_beg(host)   -i pp.com       添加规则
    acl 172.25.5.1      hdr_beg(host)   -i 172.25.5.1		添加规则
    redirect code 301 location http://www.pp.com if pp.com  
    redirect code 301 location http://www.pp.com if 172.25.5.1  	# 指定重定向
    use_backend static          if url_static
    default_backend             app

客机写好解析

[root@foundation5 ~]# vim /etc/hosts
172.25.5.1 server pp.com  www.pp.com

测试:
客户主机上访问pp.com

在这里插入图片描述
在客户主机上访问172.25.5.1

在这里插入图片描述
都被成功定向到www.pp.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 static          if write
    default_backend             static
    
   backend static
    server    web1 172.25.5.2:80 check
backend app
    server  web2 172.25.5.3:80 check

systemctl restart haproxy # 重启服务

安装php插件,由于下面需要解析php编写的页面
[root@toto1 ~]# yum install php -y

此配置文件的目的为:默认进入web1的发布页面,也就是web1为读的服务器,write时为app服务,也就是web2写服务器,实现网页的读写分离。

在 web1:172.25.5.2 上发布网页内容,并重启httpd服务

[root@server2 html]# vim index.php
[root@server2 html]# systemctl restart httpd
配置文件
<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.5.3 上编写write时的web2发布内容,创建上传目录upload,重启httpd服务

[root@server3 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"] < 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
[root@server3 html]# systemctl restart httpd

注意:upload_file.php、index.php两个文件的均要有写权限。(若无写权限,则会出现网页空白的现象)
测试:客户端访问 http://172.25.5.1/index.php
读: 读取的是主机 172.25.5.2

在这里插入图片描述
在这里插入图片描述

[root@server3 html]# ls upload
haha.jpg   # 图片上传成功
[root@server3 html]# 

读写分离成功!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值