Haproxy实现负载均衡及相关配置(控制访问,设置自动刷新时间,动静分离,读写分离)

1.概念讲解

1.HAProxy是一个使用C语言编写的自由及开放源代码软件,其提供高可用性、负载均衡,以及基于TCP(第四层)和HTTP(第七层)的应用程序代理。HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。
2.HAProxy 支持连接拒绝:因为维护一个连接的打开的开销是很低的,有时我们很需要限制攻击蠕虫(attack bots),也就是说限制它们的连接打开从而限制它们的危害。 这个已经为一个陷于小型DDoS攻击的网站开发了而且已经拯救了很多站点,这个优点也是其它负载均衡器没有的。

2.Haproxy实现负载均衡的配置过程

实验环境:

主机 ip 服务
server1 172.25.66. 1 haproxy
server2 172.25.66. 2 apache
server3 172.25.66. 3 apache
物理机 172.25.66.250 测试

1.配置haproxy
<1>首先解压haproxy-1.7.3.tar.gz,然后查看能不能把源码包打成rpm包,通过查看是否有.spec文件即可知晓

[root@server1 ~]# tar zxf haproxy-1.7.3.tar.gz 
[root@server1 ~]# ls
[root@server1 ~]# cd haproxy-1.7.3
[root@server1 haproxy-1.7.3]# ls
[root@server1 haproxy-1.7.3]# find . -name *.spec

在这里插入图片描述
注意:
haproxy-1.7.3目录下的Makefile文件中会写个模块之间是如何调用的,以及系统里面用的系统架构(例如:197 ARCH_FLAGS.x86_64 = -m64 -march=x86-64)

<2>安装以下软件

[root@server1 haproxy-1.7.3]# yum install rpm-build -y
#安装gcc的原因是因为在安装rpm-build时,其中依赖性安装的包中有以下包:gdb.x86_64 0:7.2-60.el6_4.1,此包是c语言调试工具,编译需要安装gcc
[root@server1 haproxy-1.7.3]# yum install gcc -y
[root@server1 haproxy-1.7.3]# yum install pcre-devel -ye-devel -y

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
<3>通过查看rpmbuild的帮助日志,可以查看到如果想要将源码包打包成rpm包需要用以下参数:(-tb build binary package only from )

[root@server1 ~]# rpmbuild --help

在这里插入图片描述

<4>将haproxy的源码包打包成rpm包

[root@server1 ~]# rpmbuild --tb haproxy-1.7.3.tar.gz

在这里插入图片描述
<5>使用rpm安装haproxy安装包

[root@server1 ~]# ls
[root@server1 ~]# cd rpmbuild/
[root@server1 rpmbuild]# ls
[root@server1 rpmbuild]# cd RPMS/
[root@server1 RPMS]# ls
[root@server1 RPMS]# cd x86_64/
[root@server1 x86_64]# ls
[root@server1 x86_64]# rpm -ivh haproxy-1.7.3-1.x86_64.rpm 

在这里插入图片描述
<6>将rpm包(haproxy)安装后,发现并没有配置文件

[root@server1 x86_64]# cd /etc/haproxy/
[root@server1 haproxy]# ls

在这里插入图片描述
<7>在之前的源码包中,将haproxy的配置文件拷贝到rpm包(haproxy)的目录下并检查

[root@server1 ~]# cd haproxy-1.7.3
[root@server1 haproxy-1.7.3]# ls
[root@server1 haproxy-1.7.3]# vim examples/
[root@server1 examples]# cp content-sw-sample.cfg /etc/haproxy/haproxy.cfg
[root@server1 examples]# cd /etc/haproxy/
[root@server1 haproxy]# ls

在这里插入图片描述
<8>编辑haproxy的配置文件

[root@server1 haproxy]# vim haproxy.cfg

在这里插入图片描述
配置的内容如下:

# URIs starting with /img or /css to a dedicated group of servers. URIs
# starting with /admin/stats deliver the stats page.
#

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
# The public 'www' address in the DMZ
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
# the application servers go here
backend dynamic
        balance         roundrobin
        server          dynsrv1 172.25.33.2:80 check inter 1000
        server          dynsrv2 172.25.33.3:80 check inter 1000         

在这里插入图片描述
<9>开启haproxy服务

[root@server1 haproxy]# /etc/init.d/haproxy start

在这里插入图片描述

2.在server1和server2上配置测试页
在server1配置测试页:
<1>首先在server2上查看是否有httpd的相关文件,如果没有,说明httpd没有安装,如果有,说明httpd可以安装,同时,查看apache共享目录下的文件内容

[root@server2 ~]# rpm -qa | grep httpd
[root@server2 ~]# cd /var/www/html
[root@server2 html]# ls
[root@server2 html]# cat index.html

在这里插入图片描述
<2>开启httpd服务

[root@server2 html]# /etc/init.d/httpd start

在这里插入图片描述
在server3上配置测试页:
<3>首先在server3上查看是否有httpd的相关文件,如果没有,说明httpd没有安装,如果有,说明httpd可以安装

[root@server3 ~]# rpm -qa | grep httpd

在这里插入图片描述
注意:
httpd-tools-2.2.15-29.el6_4.x86_64只是一个工具的安装包,并不是httpd软件

<4>安装httpd服务并在其下配置测试页,然后开启httpd服务

[root@server3 ~]# yum install httpd -y
[root@server3 ~]# rpm -qa | grep httpd
[root@server3 ~]# cd /var/www/html
[root@server3 html]# vim index.html
[root@server3 html]# /etc/init.d/httpd start

在这里插入图片描述
在这里插入图片描述
3.测试
<1>首先在物理机上尝试访问172.25.66.1,发现可以正常访问,且实现轮叫

[root@foundation66 ~]# curl 172.25.66.1
[root@foundation66 ~]# curl 172.25.66.1
[root@foundation66 ~]# curl 172.25.66.1
[root@foundation66 ~]# curl 172.25.66.1
[root@foundation66 ~]# curl 172.25.66.1
[root@foundation66 ~]# curl 172.25.66.1

在这里插入图片描述
<2>在浏览器中输入以下网址可以进行监控

http://172.25.66.1/admin/stats

在这里插入图片描述
在网页中按下快捷键F12可以看到控制台,且刷新页面时会进行刷新(再按下F12即可关闭控制台)
在这里插入图片描述
假设将server2中的httpd服务关闭后,可以查看到网页中的web1那一行会出现报错(如上述颜色标示的active or backup DOWN)
在这里插入图片描述
在这里插入图片描述
<3>在浏览器中输入以下网址可以进行监控(用脚本进行监控,显示200OK说明服务正常)

http://172.25.66.1/monitoruri

在这里插入图片描述

注意:
1.makefile:会写个模块之间是如何调用的,里面用的系统架构
2.源码安装(指定的,参数想加就加,参数不想加就不加)和rpm包安装(会把配置文件打乱)
3.能不能把源码包打成rpm包主要看有没有这个文件
4.gdb是c语言调试工具
5.monitoruri可以写在脚本里,如何知道运行是正确的,输出200ok表示服务是正常的

3.Haproxy的相关配置(控制访问,自动刷新,设置黑名单)

1.控制访问
<1>设置在登陆http://172.25.33.1/admin/stats页面时需要输入用户名和密码(用户名为admin,密码为westos)

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

在这里插入图片描述
配置文件新增的内容如下:

stats auth      admin:westos	#设置用户是admin,密码是westos

在这里插入图片描述
<2>测试:
在浏览器中输入http://172.25.33.1/admin/stats网址后,发现需要输入用户名和密码(如果没有显示输入用户名和密码的对话框,清除缓存即可)
再次刷新页面时,会出现输入用户和密码的对话框:
在这里插入图片描述
如果密码输入错误,会再次跳转到未登陆的页面:
在这里插入图片描述
在这里插入图片描述
如果点击取消之后,会出现没有认证的页面:
在这里插入图片描述
输入正确的用户名和密码后,会出现正确的页面:
在这里插入图片描述
在这里插入图片描述
注意:
增加访问控制中的模式使用的是dynamic,default_backend dynamic字段的主机

2.设置自动刷新时间
<1>设置在登陆http://172.25.33.1/admin/stats页面时可以在5s内自动刷新

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

在这里插入图片描述
配置文件新增的内容如下:

stats refresh  5s

在这里插入图片描述
<2>测试(在浏览器中输入网址):
在浏览器中输入http://172.25.33.1/admin/stats网址后,发现页面每过5s后会自动刷新,但是效果并不明显,所以接下来我们将通过查看日志测试刷新
在这里插入图片描述
在这里插入图片描述
<3>测试(在日志中查看):
因为没有的日志,所以需要在日志中查看
1)首先查看haproxy的配置文件中关于log的配置

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

在这里插入图片描述
文件中的关于日志的内容如下:

log             127.0.0.1 local0

在这里插入图片描述
2)因为没有haproxy的日志文件,所以我们将创建一个关于的日志haproxy,更改rsyslog日志配置中的内容并重启日志服务

[root@server1 ~]# vim /etc/rsyslog.conf 
[root@server1 ~]# /etc/init.d/rsyslog restartonf

在这里插入图片描述
配置文件中更改的内容如下:

$ModLoad imudp
$UDPServerRun 514
……
local0.*               var/log/haproxy.log

在这里插入图片描述
在这里插入图片描述
3)查看日志中定义的haproxy.log文件,可以使用tail -f命令实时监控haproxy.log文件的变化(即5s刷新一次)
静态查看haproxy刷新时间的变化:

[root@server1 haproxy]# cat /var/log/haproxy.log 

在这里插入图片描述
动态查看haproxy刷新时间的变化:

[root@server1 haproxy]# tail -f /var/log/haproxy.log 

在这里插入图片描述
3.设置黑名单
1.设置物理机为黑名单,访问时页面出现403报错
<1>编辑haproxy.cfg的配置文件

[root@server1 haproxy]# vim haproxy.cfg 
[root@server1 haproxy]# /etc/init.d/haproxy restart

在这里插入图片描述
配置文件中更改的内容如下:

 acl blacklist src 172.25.33.250
    http-request deny if blacklist

在这里插入图片描述
<2>测试在物理机的浏览器中访问172.25.66.1,会发现出现403Forbidden报错
在这里插入图片描述

总结:
1.查看刷新的最直接的是看日志
2.local0(数字)表示的是自定义的日志
3.日志服务是/etc/rsyconfig
4.info是高级的日志,只会显示重要的信息,debug是低级的日志
5.什么类型的什么级别的日志
6.日志有时会挂,所以有时候要重启服务

3.访问时页面出现指定的页面
<1>为了使浏览器中显示特定的报错,而不是唐突的出现403报错,故在server1中建立一个显示页

[root@server1 ~]# cd /var/www/html
[root@server1 html]# vim index.html
[root@server1 html]# cat index.html 
[root@server1 html]# /etc/init.d/httpd start	#出现报错的原因是因为80端口已经被haproxy服务占用,更改apache服务的端口后,就不会出现报错了
[root@server1 html]# vim /etc/httpd/
[root@server1 html]# vim /etc/httpd/conf/httpd.conf #更改httpd服务的端口为8080
[root@server1 html]# /etc/init.d/httpd start	

在这里插入图片描述
httpd配置文件/etc/httpd/conf/httpd.conf更改的内容如下:

Listen 8080

在这里插入图片描述
<2>更改haproxy中的配置文件并使服务重新开启

[root@server1 haproxy]# vim haproxy.cfg 
[root@server1 haproxy]# /etc/init.d/haproxy restart

在这里插入图片描述
配置文件中更改的内容如下:

errorloc 403 http://172.25.33.1:8080/index.html if blacklist

在这里插入图片描述
<3>在物理机的浏览器中访问172.25.66.1,会自动跳转到http://172.25.66.1:8080/index.html,并显示当物理机访问172.25.0.1时的页面
在这里插入图片描述

注意:
1.acl访问控制 设置黑名单 来源 = acl blacklist src 172.25.33.250,即将172.25.33.250此主机设置成访问控制的黑名单
2.errorloc 403 http://172.25.33.1:8080/index.html if blacklist表示如果是黑名单的话,则将错误页面443重定向到172.25.33.1:8080/index.html

补充:
如果在重启haproxy服务时,出现以下报错,说明server2和server3的httpd服务没有开启,开启后就不会出现报错了
[root@server1 haproxy]# /etc/init.d/haproxy restart
Shutting down haproxy: [ OK ]
Starting haproxy: [ OK ]
[root@server1 haproxy]#
Message from syslogd@localhost at Apr 21 23:03:15 …
haproxy[1153]: backend dynamic has no server available!
在这里插入图片描述

4.Haproxy的动态页面和静态页面分离

我们将server设置为静态页面,将server3设置为动态页面
1.在server3上安装php,编辑测试页后开启httpd服务

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

在这里插入图片描述
在这里插入图片描述
2.在server2中查看测试页并开启httpd服务(sever2之前配置过)

[root@server2 ~]# cd /var/www/html
[root@server2 html]# ls
[root@server2 html]# cat index.html 
[root@server2 html]# /etc/init.d/httpd start

在这里插入图片描述
3.在server1中编辑配置文件

[root@server1 haproxy]# cd
[root@server1 ~]# cd /etc/haproxy/
[root@server1 haproxy]# vim haproxy.cfg 
[root@server1 haproxy]# /etc/init.d/haproxy start

配置文件haproxy.cfg的更改内容如下:

 40         acl blacklist src 172.25.66.5
 44        use_backend     dynamic if { path_end .php }
 45         default_backend static
 46 backend static
 47         balance         roundrobin
 48         server          web1 172.25.66.2:80 check inter 1000
 49 backend dynamic     
 50         balance         roundrobin
 51         server          web2 172.25.66.3:80 check inter 1000

在这里插入图片描述
4.测试
在物理机的浏览器中访问server1的ip,会发现默认显示的是server2中的测试页
在这里插入图片描述
在物理机的浏览器中访问静态页面,会发现显示的是server2中的测试页
在这里插入图片描述
在物理机的浏览器中访问动态页面,会发现显示的是server3中的测试页
在这里插入图片描述

5.haproxy的动态页面和读写分离

1.在server1中修改配置文件,使server2进行读操作,server3进行写操作,并重启服务

[root@server1 haproxy]# vim haproxy.cfg 
[root@server1 haproxy]# /etc/init.d/haproxy start

在这里插入图片描述
配置文件haproxy.cfg下更改的内容如下:

 36         acl write method PUT
 37         acl write method POST
 38         acl read method GET
 39         acl read method HEAD
 44 	acl blacklist src 172.25.66.5	#更改黑名单,否则物理机无法查看sevrer1的ip
 48         use_backend     static if write	#如果是写的话则访问静态的页面(即下方配置的172.25.66.2中的内容)
 50         default_backend dynamic	#默认是动态的

在这里插入图片描述
也可以在配置文件中加入以下内容:

redirect location http://172.25.66.1:8080/index.html if blacklist	#下载的一个页面

2.在server2上编写测试页
<1>在server2中编写脚本(之前已经编写好,这里直接使用)

[root@server2 html]# ls
[root@server2 html]# cd upload/
[root@server2 upload]# ls
[root@server2 upload]# mv * ..
[root@server2 upload]# cd ..
[root@server2 html]# chmod 777 upload
[root@server2 html]# ls

在这里插入图片描述
<2>查看脚本的内容并将其传到server3的共享目录下

[root@server2 html]# vim index.php 
[root@server2 html]# vim upload_file.php 
[root@server2 html]# scp -rp upload upload_file.php index.php [email protected]:/var/www/html

在这里插入图片描述
配置文件upload_file.php中需要将其大小限制扩充的更大一些,更改的内容如下:

&& ($_FILES["file"]["size"] < 2000000))

在这里插入图片描述
配置文件index.php下的内容如下:
在这里插入图片描述
<3>安装php并重启httpd服务

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

在这里插入图片描述
在这里插入图片描述
3.在server上查看是否有测试也并重新启动服务

[root@server3 html]# ls
[root@server3 html]# /etc/init.d/httpd start

在这里插入图片描述
4.测试
<1>首先测试读操作
在浏览器中访问server1,点击Browse导入一张图片,之后点击Submit,会看到图片已经成功上传
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
<2>查看图片上传到哪个主机中(图片是放在真机中的)
在server2中查看,发现图片上传到了server2主机,说明读操作成功:

[root@server2 html]# cd upload
[root@server2 upload]# ls

在这里插入图片描述
在server3中查看,发现图片上传到了server1主机,说明读操作不成功:

[root@server3 html]# cd upload
[root@server3 upload]# ls

在这里插入图片描述
<3>进行写操作
在server3中进行写操作:

[root@server3 html]# vim index.php 
[root@server3 html]# /etc/init.d/httpd restart

在这里插入图片描述
文件index.php中更改的内容如下:

<input type="submit" name="submit" value="westos_Submit" />

在这里插入图片描述
在server2中进行写操作:

[root@server2 html]# vim index.php 
[root@server2 html]# /etc/init.d/httpd restart

在这里插入图片描述
文件index.php中更改的内容如下:

<input type="submit" name="submit" value="haha_Submit" />

在这里插入图片描述
<4>在浏览器中访问server1,发现此时更改的内容便是server3中更改的内容,所以说server3写操作成功
在这里插入图片描述
注意:

  • 写是POST和PUT
  • 读是GET和HEAD

猜你喜欢

转载自blog.csdn.net/qq_39376481/article/details/89462734