企业——HAproxy实现负载均衡及其常见配置
一.HAproxy的基础以及相应的原理
HAProxy是一款提供高可用性、负载均衡以及基于TCP(第四层)和HTTP(第七层)应用的代理软件,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。HAProxy特别适用于那些负载特别大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在时下的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中,同事可以保护你的web服务器不被暴露到网络上。
HAproxy和LVS的区别:
lvs的是通过vrrp协议进行数据包转发的,因为是用的IP地址转发的,因此提供的是4层的负载均衡。特点是效率高,只要你机器网卡抗的住就不是问题。haproxy可以提供4层或7层的数据转发服务,能做到7层的好处是可以根据服务所处的状态等进行负载。以上两者只是实现了负载均衡,但是他们本身具有明显的单点故障(也可以说是没有健康检查),因此需要使用双机软件做热备,来保证高可用性。keepalived可以通过检测vrrp数据包来切换,因此更适合与lvs搭配。而heartbeat更适于和haproxy搭配。这样就出现了这两个应用比较多也比较经典的负载均衡的高可用性方案了。但是HAproxy却可以进行除了负载均衡以外的,如:读写分离、动静分离、ACL权限设置等。
二.实验的环境
rhel6.5的linux 关闭selinux and iptables
server1 HAproxy 172.25.254.1
server2 apache 172.25.254.2
server3 apache 172.25.254.3
server4 client 172.25.254.4 用于服务的测试
三.HAproxy实现负载均衡的配置过程
1.解压HAproxy的安装包
[root@server1 ~]# tar zxf haproxy-1.7.3.tar.gz
[root@server1 ~]# cd haproxy-1.7.3 ##利用命令 find -name *.spec 有这个文件表示可以用源码软件包安装
[root@server1 haproxy-1.7.3]# find -name *.spec
./examples/haproxy.spec
2.安装编译软件(rpm包编译)
源码安装三部曲:./config -> make -> make install 第一步是为了加入不同的功能模块。生成makefile文件。
源码编译的好处是:方便管理,可以自己选择需要的参数,灵活性高。
rpmbuild 将压缩包打包成rpm包,方便安装。而且yum能解决依赖,rpm命令不能。在删除的时候有可能会删除一些连带文件。但是yum 安装的就不会发生这样的情况,因为yum 安装可以指定存放的目录路径,因此某一个软件不需要了以后就直接删除目录即可。不会发生连带,因此生产环境中比较推荐源码编译。
[root@server1 ~]# yum install rpm-build -y ##安装需要的安装包,否则会显示编译失败
[root@server1 ~]# yum install pcre-devel -y
[root@server1 ~]# yum install gcc -y
[root@server1 ~]# rpmbuild -tb haproxy-1.7.3.tar.gz
[root@server1 ~]# cd /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
3.建立haproxy用户和组。利用linux对haporxy用户的访问控制实现对haporxy服务的控制
[root@server1 ~]# groupadd -g 200 haproxy
[root@server1 ~]# useradd -u 200 -g 200 -M haproxy ##-M参数表示不自动建立用户的登陆目录
[root@server1 ~]# id haproxy
uid=200(haproxy) gid=200(haproxy) groups=200(haproxy)
4.找到haproxy的配置文件,并复制到/etc/haproxy目录下
[root@server1 ~]# cd haproxy-1.7.3/examples/
[root@server1 examples]# cp content-sw-sample.cfg /etc/haproxy/haproxy.cfg
5.编译配置文件
[root@server1 examples]# cd /etc/haproxy/
[root@server1 haproxy]# vim haproxy.cfg
global # 全局定义
maxconn 10000 ## 最大连接数
stats socket /var/run/haproxy.stat mode 600 level admin
log 127.0.0.1 local0 ##夲机日志
uid 200 ## haproxy用户的uid
gid 200 ## haproxy用户的gid
chroot /var/empty
daemon
defaults # 默认条件
mode http ##默认使用 http 的 7 层模式 tcp是4 层
log global
option httplog
option dontlognull
monitor-uri /monitoruri
maxconn 8000
timeout client 30s
stats uri /admin/stats
option prefer-last-server
retries 2
option redispatch
timeout connect 5s
timeout server 5s
# 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 static # 默认使用static后端服务器集群
# The static backend backend for 'Host: img', /img and /css.
backend static
balance roundrobin ## 负载均衡算法rr
server statsrv1 172.25.254.2:80 check inter 1000 ## 后端服务器server2
server statsrv2 172.25.254.3:80 check inter 1000 ## 后端服务器server3
6.server2和server3安装httpd,开启httpd,再编写默认发布内容
[root@server2 ~]# yum install httpd -y
[root@server2 ~]# /etc/init.d/httpd start
[root@server2 ~]# cd /var/www/html/
[root@server2 html]# vim index.html
<h1>server2`page<h1>
[root@server3 ~]# yum install httpd -y
[root@server3 ~]# /etc/init.d/httpd start
[root@server3 ~]# cd /var/www/html
[root@server3 html]# vim index.html
<h1>server3`page<h1>
7.测试
(1)在shell界面内测试:
[root@server1 haproxy]# curl 172.25.79.1
<h1>server2`page<h1>
[root@server1 haproxy]# curl 172.25.79.1
<h1>server3`page<h1>
[root@server1 haproxy]# curl 172.25.79.1
<h1>server2`page<h1>
[root@server1 haproxy]# curl 172.25.79.1
<h1>server3`page<h1>
(2)在网页页面上测试:【在浏览器输入http://172.25.254.1/monitoruri(查看)】
(3)在浏览器输入http://172.25.254.1/admin/stats(看其stats状态页)
四.给网页页面定义用户和密码,以及刷新次数
用户为admin,密码是westos,刷新次数为5s刷新一次
重启服务 /etc/init.d/haproxy restart
测试:
五.基于TCP和HTTP的应用程序代理
1.修改日志服务配置文件从而修改日志存储位置
[root@server1 haproxy]# vim /etc/rsyslog.conf ##打开13,14行的注释
13 $ModLoad imudp
14 $UDPServerRun 514 ##打开UDP的端口
63 local0.* /var/log/haproxy.log ##添加日志存储位置
[root@server1 haproxy]# /etc/init.d/rsyslog restart 重启日志服务
2.ACl权限列表
(1)建立acl黑名单,指定ip,更改配置文件
vim /etc/haproxy/haproxy.cfg ## 添加47-48行内容
47 acl blacklist src 172.25.254.4 ##黑名单,禁止172.25.254.4用户访问
48 http-request deny if blacklist
/etc/init.d/haproxy reload
测试:
在client端:curl 172.25.254.1 ##访问会出现403报错,禁止访问
(2)错误重定向
vim /etc/haproxy/haproxy.cfg ## 已经添加47-48行内容,接着添加如果黑名单中的用户访问时,重定向的页面显示。
47 acl blacklist src 172.25.254.4 ##黑名单,禁止172.25.254.4用户访问
48 http-request deny if blacklist
49 errrloc 403 http://172.25.254.1:8080/index.html ##此处修改haproxy配置文件将错误重定向到本机的apache服务为避免与haproxy服务端口发生冲突,将apache端口改为8080
/etc/init.d/haproxy reload
给server端(haproxy)安装httpd,并配置相应的配置文件:
vim /etc/httpd/conf/httpd.conf
Listen 8080 ##修改本机的http的端口号,防止和haproxy相互冲突。
vim /var/www/html/index.html
<h1>您已经被禁止访问该页面<h1>
测试:
curl 172.25.254.1
您已经被禁止访问该页面
3.动静分离
(1)给后端的服务器任意一台添加php(我是在server3上安装)
yum install -y php
vim /var/www/html/index.php ##添加php的测试页面,如果测试页面显示成功的话,就表明php可以运行
<?php
phpinfo()
?>
/etc/init.d/httpd restart
(2)编辑配置文件,如果访问以.php结尾的动态界面,实际访问的主机为server3;静态页面访问server2(默认访问server2)
vim /etc/haproxy/haproxy.cfg
(3)在另一个后台服务器上写入静态页面访问
vim /var/www/html/index.html
<h1>这里访问的是静态的页面<h1>
(4)测试
在客户端的浏览器上输入:172.25.254.1 ## 显示的是静态的页面
在客户端的浏览器上输入:172.25.254.1/index.php ## 显示的是php的测试的页面
4.读写分离
(1)在配置文件中添加读写的模块
vim /etc/haproxy/haproxy.cfg
(2)在server3中的httpd默认发布目录,放进去index.php(选择图片的静态页面)和upload_file.php(上传图片的动态页面),存放上传图片的目录upload目录。
cd /var/www/html/upload/ ##此处upload可以新建
ls ##两个文件的内容在下面可以看到
index.php upload_file.php
chmod 644 *
mv * ..
cd ..
chmod 777 upload
ls
index.html index.php upload upload_file.php
===========================================================================
index.php 文件内容 ( 选择图片的静态页面 )
===========================================================================
upload_file.php 文件内容(上传图片的动态页面)
===========================================================================
(3)测试:
在页面上:172.25.254.1/index.php
上传成功显示如下:
可以看到上传的图片上传到了server2上:
而server3上没有: