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