HAProxy负载均衡——搭建HAProxy负载均衡、 添加日志、动静分离、页面重定向、读写分离

比眉伴天荒 2023-07-07 11:29 83阅读 0赞

文章目录

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

  1. yum install haproxy -y

在这里插入图片描述
步骤二:更改配置文件,添加负载均衡信息及监控页面信息
(1)方式一:

  1. vim /etc/haproxy/haproxy.cfg
  2. 63 frontend main
  3. 64 bind *:80
  4. 65 default_backend webserver
  5. 70 backend webserver
  6. 71 balance roundrobin
  7. 72 server web1 172.25.1.2:80 check
  8. 73 server web1 172.25.1.3:80 check

在这里插入图片描述
(2)方式二:listen:可以理解为frontend和backend的组合体

  1. listen admin *:8080
  2. stats enable
  3. stats uri /status # 监控页面地址
  4. stats auth admin:westos # 管理帐号和密码
  5. stats refresh 5s #刷新频率
  6. listen webserver *:80 #监听的实例名称,地址和端口
  7. balance roundrobin #负载均衡算法
  8. server web1 172.25.1.2:80 check
  9. server web2 172.25.1.3:80 check

步骤三:开启haproxy

  1. systemctl start haproxy
  2. systemctl status haproxy
  3. netstat -antuple

在这里插入图片描述
在这里插入图片描述
在server2上:
步骤一:安装httpd服务

  1. yum install httpd -y

在这里插入图片描述
步骤二:编写默认发布页面,并开启httpd服务

  1. vim /var/www/html/index.html
  2. <h1>server2's page</h1>
  3. systemctl start httpd
  4. systemctl status httpd

在这里插入图片描述
在server3上:
步骤一:安装httpd服务

  1. yum install httpd -y

在这里插入图片描述
步骤二:编写默认发布页面,并开启httpd服务

  1. vim /var/www/html/index.html
  2. <h1>server3's page</h1>
  3. systemctl start httpd
  4. systemctl status httpd

在这里插入图片描述
在物理机上测试:
在这里插入图片描述
此时,可以看出实现了负载均衡

打开浏览器搜索http://172.25.1.1:8080/status
在这里插入图片描述在这里插入图片描述
模拟server3故障:

  1. systemctl stop httpd

在这里插入图片描述
在物理机上访问测试:
在这里插入图片描述浏览器上查看集群节点状态:
在这里插入图片描述server3故障恢复:
在这里插入图片描述浏览器上查看集群节点状态:web2恢复正常
在这里插入图片描述

二、给haproxy服务器添加日志

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

  1. vim /etc/haproxy/haproxy.cfg

在这里插入图片描述
步骤二:更改日志监控的配置文件,打开UDP接口,创建haproxy的日志文件

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

在这里插入图片描述
在这里插入图片描述
步骤三:重启haproxy和rsyslog服务,并查看日志

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

在这里插入图片描述

三、动态静态请求分离

在server1上:
步骤一:更改配置文件,添加访问控制策略

frontend:用来匹配接收客户所请求的域名,uri等,并针对不同的匹配,做不同的请求处理

  1. vim /etc/haproxy/haproxy.cfg
  2. frontend main *:80
  3. acl url_static path_beg -i /images #path_beg: 用于测试请求的URL是否以指定的模式开头
  4. acl url_static path_end -i .jpg .gif .png #path_end:用于测试请求的URL是否以指定的模式结尾
  5. use_backend static if url_static #满足上面条件,则为静态请求
  6. default_backend webserver #默认动态
  7. backend static #静态请求
  8. server web2 172.25.1.3:80 check
  9. backend webserver #动态请求
  10. server web1 172.25.1.2:80 check
  11. server local 172.25.1.1:8000 backup #做本机8000端口的一个备错信息,若所有机器都down则启动
  12. listen admin *:8080
  13. stats enable
  14. stats uri /status
  15. stats auth admin:westos
  16. stats refresh 5s

在这里插入图片描述
步骤二:重启haproxy服务

  1. systemctl restart haproxy

在这里插入图片描述
在server3上:
在httpd默认发布目录下新建images目录,上传一张.jpg的图片。

  1. mkdir /var/www/html/images

在这里插入图片描述
在server1上:
步骤一:安装httpd服务

  1. yum install -y httpd

在这里插入图片描述
步骤二:更改httpd服务的工作端口为8000,添加web服务的资源

  1. vim /etc/httpd/conf/httpd.conf
  2. 42 Listen 8000
  3. vim /var/www/html/index.html
  4. <h1>server1's page</h1>
  5. systemctl start httpd
  6. netstat -antuple

在这里插入图片描述在这里插入图片描述
在真机上测试:
打开浏览器搜索http://172.25.1.1/images/
在这里插入图片描述
在这里插入图片描述
访问到server3服务器上的资源

直接搜索http://172.25.1.1/
在这里插入图片描述
此时,访问到server2服务器上的资源

模拟server2和server3故障:
在server2上:

  1. systemctl stop httpd

在这里插入图片描述
在server3上:

  1. systemctl stop httpd

在这里插入图片描述
在真机上测试:
刷新页面
在这里插入图片描述
此时server1上线,故障顶替

四、访问控制和页面重定向

1、403错误页面重定向

在server1上:
步骤一:更改配置文件,添加重定向规则

  1. vim /etc/haproxy/haproxy.cfg
  2. frontend main *:80
  3. acl url_static path_beg -i /images
  4. acl url_static path_end -i .jpg .gif .png
  5. acl badhost src 172.25.1.250 #黑名单,设定物理机不能访问server1
  6. block if badhost
  7. errorloc 403 http://172.25.1.1:8000 #注意端口不要冲突,如果是403错误就重定向到 172.25.1.1:8000
  8. use_backend static if url_static
  9. default_backend webserver
  10. backend static
  11. server web2 172.25.1.3:80 check
  12. backend webserver
  13. server web1 172.25.1.2:80 check
  14. listen admin *:8080
  15. stats enable
  16. stats uri /status
  17. stats auth admin:westos
  18. stats refresh 5s

在这里插入图片描述
步骤二:修改默认发布页面内容

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

在这里插入图片描述
在真机上测试:
在这里插入图片描述打开server2和server3httpd服务:
在这里插入图片描述在这里插入图片描述在真机上测试:
刷新页面
在这里插入图片描述

2、黑名单重定向

步骤一:更改配置文件,修改访问控制策略

  1. vim /etc/haproxy/haproxy.cfg
  2. frontend main *:80
  3. acl url_static path_beg -i /images
  4. acl url_static path_end -i .jpg .gif .png
  5. acl badhost src 172.25.1.250
  6. redirect location http://172.25.1.1:8000 if badhost #如果badhost主机访问,就重定向
  7. use_backend static if url_static
  8. default_backend webserver

在这里插入图片描述
步骤二:重启haproxy服务

  1. systemctl restart haproxy

在这里插入图片描述
在真机上测试:
在这里插入图片描述

3、301永久重定向

301 代表永久性转移(Permanently Moved);302 redirect: 302 代表暂时性转移(Temporarily Moved )

301表示旧地址A的资源已经被永久地移除了(这个资源不可访问了),搜索引擎在抓取新内容的同时也将旧的网址交换为重定向之后的网址;302表示旧地址A的资源还在(仍然可以访问),这个重定向只是临时地从旧地址A跳转到地址B,搜索引擎会抓取新的内容而保存旧的网址。

在server1上:

  1. vim /etc/haproxy/haproxy.cfg
  2. frontend xiyou *:80
  3. acl westos.org hdr_beg(host) -i westos.org
  4. acl 172.25.1.1 hdr_beg(host) -i 172.25.1.1
  5. redirect code 301 location http://www.westos.org if westos.org #以westos.org访问 自动重定向 www.westos.org)
  6. redirect code 301 location http://www.westos.org if 172.25.1.1 #以172.25.7.1访问 自动重定向 www.westos.org)

在这里插入图片描述
步骤二:重启haproxy服务

  1. systemctl restart haproxy

在这里插入图片描述
在物理机测试:
浏览器搜索:http://172.25.1.1
在这里插入图片描述
自动跳转:

在这里插入图片描述浏览器搜索:www.org
在这里插入图片描述

自动跳转:

在这里插入图片描述

五、Haproxy的读写分离

在server2上:
步骤一:下载php

  1. yum install php -y

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

  1. mv upload /var/www/html/
  2. cd /var/www/html/
  3. mv upload/* .

在这里插入图片描述
附:index.php文件内容

  1. <html>
  2. <body>
  3. <form action="upload_file.php" method="post"
  4. enctype="multipart/form-data">
  5. <label for="file">Filename:</label>
  6. <input type="file" name="file" id="file" />
  7. <br />
  8. <input type="submit" name="submit" value="Submit" />
  9. </form>
  10. </body>
  11. </html>

附:upload_file.php文件内容

  1. <?php
  2. if ((($_FILES["file"]["type"] == "image/gif")
  3. || ($_FILES["file"]["type"] == "image/jpeg")
  4. || ($_FILES["file"]["type"] == "image/pjpeg"))
  5. && ($_FILES["file"]["size"] < 20000))
  6. {
  7. if ($_FILES["file"]["error"] > 0)
  8. {
  9. echo "Return Code: " . $_FILES["file"]["error"] . "<br />";
  10. }
  11. else
  12. {
  13. echo "Upload: " . $_FILES["file"]["name"] . "<br />";
  14. echo "Type: " . $_FILES["file"]["type"] . "<br />";
  15. echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
  16. echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br />";
  17. if (file_exists("upload/" . $_FILES["file"]["name"]))
  18. {
  19. echo $_FILES["file"]["name"] . " already exists. ";
  20. }
  21. else
  22. {
  23. move_uploaded_file($_FILES["file"]["tmp_name"],
  24. "upload/" . $_FILES["file"]["name"]);
  25. echo "Stored in: " . "upload/" . $_FILES["file"]["name"];
  26. }
  27. }
  28. }
  29. else
  30. {
  31. echo "Invalid file";
  32. }
  33. ?>

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

  1. chmod 777 upload
  2. systemctl restart httpd

在这里插入图片描述在这里插入图片描述
在server3上:
步骤一:下载php

  1. yum install php -y

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

  1. mv upload /var/www/html/
  2. cd /var/www/html/
  3. mv upload/* .

在这里插入图片描述
步骤三:给upload目录权限,并重启httpd服务

  1. chmod 777 upload
  2. systemctl restart httpd

在这里插入图片描述在这里插入图片描述
在server1上:
步骤一:修改配置文件,添加访问策略

  1. vim /etc/haproxy/haproxy.cfg
  2. acl read method GET
  3. acl read method HEAD #两个read write 只用一个就行
  4. acl write method PUT
  5. acl write method POST
  6. use_backend webserver if write
  7. default_backend static
  8. backend static
  9. server web2 172.25.1.3:80 check
  10. backend webserver
  11. server web1 172.25.1.2:80 check #默认会上传到这个real server
  12. server local 172.25.1.1:8000 backup

在这里插入图片描述
步骤二:重启haproxy

  1. systemctl restart haproxy

在这里插入图片描述在真机上测试:
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在server2上查看:
在这里插入图片描述
发现文件提交到server2的upload目录中
在server3上查看:
在这里插入图片描述
并没有提交的文件

至此,实现了haproxy读写分离

发表评论

表情:
评论列表 (有 0 条评论,83人围观)

还没有评论,来说两句吧...

相关阅读