Haproxy实现负载均衡,动静分离,访问控制及读写分离

本文介绍了在RHEL6.5环境下使用Haproxy实现负载均衡、动静分离、访问控制和读写分离的详细步骤。通过配置Haproxy,实现了服务器间的负载均衡轮调,静态内容由一台服务器提供,动态内容如PHP由另一台服务器处理。同时,文章还展示了如何调整日志路径、设置访问控制以及实现读写分离,确保服务的高效稳定运行。
摘要由CSDN通过智能技术生成

Haproxy简介:

  • HAProxy是一个使用C语言编写的自由及开放源代码软件,其提供高可用性、负载均衡,以及基于TCP和HTTP的应用程序代理。
  • HAProxy是一个使用C语言编写的自由及开放源代码软件,其提供高可用性、负载均衡,以及基于TCP和HTTP的应用程序代理。
  • HAProxy实现了一种事件驱动, 单一进程模型,此模型支持非常大的并发连接数。多进程或多线程模型受内存限制 、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接。事件驱动模型因为在有更好的资源和时间管理的用户空间(User-Space) 实现所有这些任务,所以没有这些问题。此模型的弊端是,在多核系统上,这些程序通常扩展性较差。这就是为什么他们必须进行优化以 使每个CPU时间片(Cycle)做更多的工作。

在这里插入图片描述


实验环境(RHEL6.5)

selinux和iptables状态为disabled

主机IP
server1(Haproxy)172.25.254.1
server2(Apache)172.25.254.2
server3(Apache)172.25.254.3

Haproxy相关配置:


一、负载均衡

server1配置:

  1. 官网下载haproxy软件包,并解压,制作rpm包进行安装
[root@server1 ~]# tar zxf haproxy-1.7.3.tar.gz
[root@server1 ~]# cd haproxy-1.7.3
[root@server1 haproxy-1.7.3]# ls
CHANGELOG     doc       include      Makefile  scripts  tests
contrib       ebtree    LICENSE      README    src      VERDATE
CONTRIBUTING  examples  MAINTAINERS  ROADMAP   SUBVERS  VERSION
[root@server1 haproxy-1.7.3]# cd ..
[root@server1 ~]# yum install -y rpm-build pcre-devel gcc
[root@server1 ~]# rpmbuild -tb haproxy-1.7.3.tar.gz 
[root@server1 ~]# ls	##自动成rpmbuild
haproxy-1.7.3  haproxy-1.7.3.tar.gz  rpmbuild
[root@server1 ~]# cd rpmbuild/RPMS/x86_64/
[root@server1 x86_64]# pwd
/root/rpmbuild/RPMS/x86_64
[root@server1 x86_64]# ls
haproxy-1.7.3-1.x86_64.rpm
[root@server1 x86_64]# rpm -ivh haproxy-1.7.3-1.x86_64.rpm 
Preparing...                ########################################### [100%]
   1:haproxy                ########################################### [100%]

==这里涉及到制作rpm包,当解压后的文件中有src这个文件的时候,我们可以通过rpm-build这条命令来制作rpm包,rpm包安装的时候它会把相关配置文件、日志文件等放到相应的目录下 ==

  1. 拷贝配置文件到/etc/haproxy目录下,并进行编辑,
[root@server1 ~]# cp haproxy-1.7.3/examples/content-sw-sample.cfg /etc/haproxy/haproxy.cfg
[root@server1 ~]# vim /etc/haproxy/haproxy.cfg
## 为了使配置文件看起来方便,我删除了没用的字符

global
        maxconn         10000
        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
        option prefer-last-server
        retries         2
        option redispatch
        timeout connect 5s
        timeout server  5s

        stats uri       /admin/stats

frontend public
        bind            *: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   }
        default_backend dynamic

backend dynamic
        balance         roundrobin
        server          statsrv1 172.25.254.2:80 check inter 1000
        server          statsrv2 172.25.254.3:80 check inter 1000

这里注意配置文件是以:cfg结尾的,我第一次该了conf,启动文件的时候它是不会报错的,他读取不到文件的

  1. 创建haproxy用户和组,实现对haproxy服务的控制,开启haproxy服务
[root@server1 ~]# groupadd -g 200 haproxy
[root@server1 ~]# useradd -u 200 -g 200 -s /sbin/nologin -M haproxy
[root@server1 ~]# /etc/init.d/haproxy start
Starting haproxy:                                          [  OK  ]

server2和server3配置(安装apache,默认发布目录下编写发布文件):

[root@server2 ~]# yum install -y httpd
[root@server2 ~]# vim /var/www/html/index.html
[root@server2 ~]# cat /var/www/html/index.html
server2
[root@server2 ~]# /etc/init.d/httpd start

[root@server3 ~]# [root@server2 ~]# yum install -y httpd
[root@server3 ~]# vim /var/www/html/index.html
[root@server3 ~]# cat /var/www/html/index.html
server3
[root@server3 ~]# /etc/init.d/httpd start

测试:

真机访问:curl 172.25.4.1,出现server2与server3的轮调

在这里插入图片描述

网页输入172.25.4.1/admin/stats,对haproxy负载均衡的后端服务器进行监控

在这里插入图片描述

对监控界面加密

[root@server1 ~]# vim /etc/haproxy/haproxy.cfg 

        stats uri       /admin/stats
        stats auth      admin:westos
        stats refresh   5s

[root@server1 ~]# /etc/init.d/haproxy restart
Shutting down haproxy:                                     [  OK  ]
Starting haproxy:                                          [  OK  ]

加的这三行,意思分别是,启动超级用户登录,以及登录密码,刷新间隔5s,添加的这三句话在frontend public模块中,不要添加错了

测试:

在这里插入图片描述


二、动静分离
  1. server2就是上面的配置不用动,在server3上编辑默认发布目录下的index.php文件,并安装php,server3编辑完后重启apache服务
[root@server3 ~]# vim /var/www/html/index.php
[root@server3 ~]# cat /var/www/html/index.php
<?php
phpinfo()
?>
[root@server3 ~]# yum install -y php
[root@server3 ~]# /etc/init.d/httpd restart
  1. server1上haproxy配置文件中添加动静分离配置
[root@server1 ~]# vim /etc/haproxy/haproxy.cfg 

frontend public
        bind            *: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   }
        default_backend dynamic
        stats uri       /admin/stats
        stats auth      admin:westos
        stats refresh   5s

        use_backend      dynamic if { path_end .php }		# 访问路径以.php结尾,认为是动态页

        default_backend static		# 静态页面,采用默认访问路径

backend static		# 静态页面的后端服务器群组
        balance         roundrobin
        server          statsrv1 172.25.254.2:80 check inter 1000

backend dynamic		# 动态页面的后端服务器群组
        balance         roundrobin
        server          statsrv2 172.25.254.3:80 check inter 1000

[root@server1 ~]# /etc/init.d/haproxy restart
Shutting down haproxy:                                     [  OK  ]
Starting haproxy:                                          [  OK  ]

测试:

网页访问,静态访问到server2的页面内容

在这里插入图片描述

动态访问到server3的php动态页面

在这里插入图片描述

第一遍可能访问到的是nginx的默认发布目录,刷新一下就好了


三、修改haproxy日志路径
  1. 修改日志配置文件(存储位置),并重启
[root@server1 ~]# vim /etc/rsyslog.conf 
 13 $ModLoad imudp   ##打开注释
 14 $UDPServerRun 514   ##打开注释
 42 *.info;mail.none;authpriv.none;cron.none;local0.none                /var/log    /messages
 62 local0.*                                                /var/log/haproxy.log    ##将日志放在haproxy日志文件
 [root@server1 ~]# /etc/init.d/rsyslog restart

测试:

网页访问server1后查看日志:

在这里插入图片描述


四、访问控制
  1. 修改haproxy配置文件
[root@server1 ~]# vim /etc/haproxy/haproxy.cfg 

# 在 frontend public 模块下添加
acl blacklist src 172.25.254.60
http-request deny if blacklist
errorloc 403 http://172.25.4.1:8080/index.html

[root@server1 ~]# /etc/init.d/haproxy restart
  1. server1安装apache,修改端口为8080,编辑默认发布文件
[root@server1 ~]# yum install -y httpd
[root@server1 ~]# vim /etc/httpd/conf/httpd.conf
Listen 8080 
[root@server1 ~]# vim /var/www/html/index.html
???
[root@server1 ~]# /etc/init.d/httpd start
Starting httpd: httpd: Could not reliably determine the server's fully qualified domain name, using 172.25.254.1 for ServerName
                                                           [  OK  ]

测试:

在这里插入图片描述

在这里插入图片描述

做完之后删除访问控制,接下来还要用真机测试读写分离


五、读写分离
  1. 编辑haproxy配置文件
[root@server1 ~]# vim /etc/haproxy/haproxy.cfg

        acl write method POST
        acl write method PUT

        acl read method GET
        acl read method HEAD

        use_backend   static if write
        default_backend dynamic
 [root@server1 ~]# /etc/init.d/haproxy restart
Shutting down haproxy:                                     [  OK  ]
Starting haproxy:                                          [  OK  ]

在这里插入图片描述

  1. 在server2中的httpd默认发布目录,放进去index.php(选择图片的静态页面)和upload_file.php(上传图片的动态页面),存放上传图片的目录upload
[root@server2 ~]# ll /var/www/html/
total 12
-rw-r--r-- 1 root root   8 Mar 13 17:02 index.html
-rw-r--r-- 1 root root 257 Mar 13 18:05 index.php
-rw-r--r-- 1 root root 927 Mar 13 18:05 upload_file.php
[root@server2 ~]# cat /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"] < 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";
  }
?>

[root@server2 ~]# cat /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>

[root@server2 ~]# mkdir /var/www/html/upload
[root@server2 ~]# chomd 777 /var/www/html/upload
  1. 修改上传的大小限制
[root@server2 ~]# vim /var/www/html/upload_file.php
&& ($_FILES["file"]["size"] < 200000000000))
  1. 将编写好的upload目录及相关文件传到server3上

  2. 在server2上安装php,并重启httpd

[root@server2 ~]# yum install -y php
[root@server2 ~]# /etc/init.d/httpd restart

测试:

浏览器输入:172.25.4.1/index.php

选择文件并上传:
在这里插入图片描述

在这里插入图片描述

查看,上传图片保存在server2上的/var/www/html/upload目录下,server3没有
在这里插入图片描述

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值