文章目录

  • 实验环境
  • 一、搭建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

haproxy权限配置 haproxy send-proxy_vim


步骤二:更改配置文件,添加负载均衡信息及监控页面信息

(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

haproxy权限配置 haproxy send-proxy_html_02


(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

haproxy权限配置 haproxy send-proxy_haproxy权限配置_03


haproxy权限配置 haproxy send-proxy_html_04


在server2上

步骤一:安装httpd服务

yum install httpd -y

haproxy权限配置 haproxy send-proxy_html_05


步骤二:编写默认发布页面,并开启httpd服务

vim /var/www/html/index.html
<h1>server2's page</h1>

systemctl start httpd
systemctl status httpd

haproxy权限配置 haproxy send-proxy_vim_06


在server3上

步骤一:安装httpd服务

yum install httpd -y

haproxy权限配置 haproxy send-proxy_html_07


步骤二:编写默认发布页面,并开启httpd服务

vim /var/www/html/index.html
<h1>server3's page</h1>

systemctl start httpd
systemctl status httpd

haproxy权限配置 haproxy send-proxy_html_08


在物理机上测试

haproxy权限配置 haproxy send-proxy_haproxy权限配置_09


此时,可以看出实现了负载均衡打开浏览器搜索http://172.25.1.1:8080/status

haproxy权限配置 haproxy send-proxy_vim_10

haproxy权限配置 haproxy send-proxy_重定向_11


模拟server3故障

systemctl stop httpd

haproxy权限配置 haproxy send-proxy_haproxy权限配置_12


在物理机上访问测试

haproxy权限配置 haproxy send-proxy_html_13

浏览器上查看集群节点状态:

haproxy权限配置 haproxy send-proxy_haproxy权限配置_14

server3故障恢复

haproxy权限配置 haproxy send-proxy_html_15

浏览器上查看集群节点状态:web2恢复正常

haproxy权限配置 haproxy send-proxy_haproxy权限配置_16

二、给haproxy服务器添加日志

在server1上
步骤一:查看haproxy日志类型

vim /etc/haproxy/haproxy.cfg

haproxy权限配置 haproxy send-proxy_html_17


步骤二:更改日志监控的配置文件,打开UDP接口,创建haproxy的日志文件

vim /etc/rsyslog.conf
 15 $ModLoad imudp
 16 $UDPServerRun 514
 55 local2.*                                             /var/log/haproxy.log

haproxy权限配置 haproxy send-proxy_重定向_18


haproxy权限配置 haproxy send-proxy_haproxy权限配置_19


步骤三:重启haproxy和rsyslog服务,并查看日志

systemctl restart haproxy
systemctl restart rsyslog
cat /var/log/haproxy.log  #查看日志

haproxy权限配置 haproxy send-proxy_html_20

三、动态静态请求分离

在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权限配置 haproxy send-proxy_重定向_21


步骤二:重启haproxy服务

systemctl restart haproxy

haproxy权限配置 haproxy send-proxy_vim_22


在server3上

在httpd默认发布目录下新建images目录,上传一张.jpg的图片。

mkdir /var/www/html/images

haproxy权限配置 haproxy send-proxy_html_23


在server1上

步骤一:安装httpd服务

yum install -y httpd

haproxy权限配置 haproxy send-proxy_vim_24


步骤二:更改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

haproxy权限配置 haproxy send-proxy_html_25

haproxy权限配置 haproxy send-proxy_重定向_26


在真机上测试

打开浏览器搜索http://172.25.1.1/images/

haproxy权限配置 haproxy send-proxy_vim_27


haproxy权限配置 haproxy send-proxy_html_28


访问到server3服务器上的资源直接搜索http://172.25.1.1/

haproxy权限配置 haproxy send-proxy_html_29


此时,访问到server2服务器上的资源

模拟server2和server3故障
在server2上:

systemctl stop httpd

haproxy权限配置 haproxy send-proxy_haproxy权限配置_30


在server3上:

systemctl stop httpd

haproxy权限配置 haproxy send-proxy_vim_31


在真机上测试

刷新页面

haproxy权限配置 haproxy send-proxy_html_32


此时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

haproxy权限配置 haproxy send-proxy_重定向_33


步骤二:修改默认发布页面内容

vim /var/www/html/index.html 
sorry!!!

haproxy权限配置 haproxy send-proxy_html_34


在真机上测试

haproxy权限配置 haproxy send-proxy_重定向_35

打开server2和server3httpd服务

haproxy权限配置 haproxy send-proxy_vim_36

haproxy权限配置 haproxy send-proxy_vim_37

在真机上测试

刷新页面

haproxy权限配置 haproxy send-proxy_html_38

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权限配置 haproxy send-proxy_html_39


步骤二:重启haproxy服务

systemctl restart haproxy

haproxy权限配置 haproxy send-proxy_html_40


在真机上测试

haproxy权限配置 haproxy send-proxy_vim_41

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权限配置 haproxy send-proxy_vim_42


步骤二:重启haproxy服务

systemctl restart haproxy

haproxy权限配置 haproxy send-proxy_重定向_43


在物理机测试

浏览器搜索:http://172.25.1.1

haproxy权限配置 haproxy send-proxy_vim_44


自动跳转:

haproxy权限配置 haproxy send-proxy_haproxy权限配置_45

浏览器搜索:www.org

haproxy权限配置 haproxy send-proxy_haproxy权限配置_46

自动跳转:

haproxy权限配置 haproxy send-proxy_重定向_47

五、Haproxy的读写分离

在server2上
步骤一:下载php

yum install php -y

haproxy权限配置 haproxy send-proxy_haproxy权限配置_48


步骤二:在网上下载upload目录,里面含php文件写好了用户上传页面及上传的文件所在地,将文件和目录放到默认发布目录下。

mv upload /var/www/html/
cd /var/www/html/
mv upload/* .

haproxy权限配置 haproxy send-proxy_html_49


附: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

haproxy权限配置 haproxy send-proxy_haproxy权限配置_50

haproxy权限配置 haproxy send-proxy_html_51


在server3上

步骤一:下载php

yum install php -y

haproxy权限配置 haproxy send-proxy_html_52


步骤二:在网上下载upload目录,里面含php文件写好了用户上传页面及上传的文件所在地,将文件和目录放到默认发布目录下。

mv upload /var/www/html/
cd /var/www/html/
mv upload/* .

haproxy权限配置 haproxy send-proxy_重定向_53


步骤三:给upload目录权限,并重启httpd服务

chmod 777 upload
systemctl restart httpd

haproxy权限配置 haproxy send-proxy_haproxy权限配置_54

haproxy权限配置 haproxy send-proxy_html_55


在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权限配置 haproxy send-proxy_haproxy权限配置_56


步骤二:重启haproxy

systemctl restart haproxy

haproxy权限配置 haproxy send-proxy_haproxy权限配置_57

在真机上测试

haproxy权限配置 haproxy send-proxy_haproxy权限配置_58

haproxy权限配置 haproxy send-proxy_haproxy权限配置_59

haproxy权限配置 haproxy send-proxy_haproxy权限配置_60

haproxy权限配置 haproxy send-proxy_haproxy权限配置_61

在server2上查看

haproxy权限配置 haproxy send-proxy_重定向_62


发现文件提交到server2的upload目录中

在server3上查看

haproxy权限配置 haproxy send-proxy_haproxy权限配置_63


并没有提交的文件

至此,实现了haproxy读写分离