Haproxy

Haproxy

haproxy提供高可用性、负载均衡以及基于TCP(第四层)和HTTP(第七层)应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。
haproxy特别适用于那些负载特别大的web站点,这些站点通常又需要会话保持或七层处理。haproxy运行在时下的硬件上,完全可以支持数以万计的并发连接,并且它的运行模式使得它可以很简单安全的整合进您当前的架构中,同时可以保护你的web服务器不被暴露到网络上。
haproxy实现了一种事件驱动、单一进程模型,此模型支持非常大的并发连接数。多进程或多线程模型受内存限制、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接。
事件驱动模型因为在有更好的资源和时间管理的用户端(User-Space)实现所有这些任务,所以没有这些问题。此模型的弊端是,在多核系统上,这些程序通常扩展性较差。这就是为什么他们必须进行优化以使每个CPU时间片(Cycle)做更多的工作。

图解:
在这里插入图片描述
haproxy配置:
环境:

主机ip
server1(apache服务器)172.25.5.1
server2(apache服务器)172.25.5.2
server3(haproxy服务器)172.25.5.3

rhel6.5 selinux disabled iptables stop

软件包自行下载
配置server3(haproxy服务器):

[root@server3 mnt]# tar zxf haproxy-1.7.3.tar.gz 
[root@server3 mnt]# cd haproxy-1.7.3
[root@server3 haproxy-1.7.3]# find . -name *.spec    ##有.spec的文件才能rpmbuild
./examples/haproxy.spec                     
[root@server3 haproxy-1.7.3]# yum install -y rpm-build   pcre-devel
[root@server3 mnt]# rpmbuild -tb haproxy-1.7.3.tar.gz 
[root@server3 mnt]# cd /root/rpmbuild/RPMS/x86_64/
[root@server3 x86_64]# rpm -ivh haproxy-1.7.3-1.x86_64.rpm 
[root@server3 x86_64]# cd /mnt/haproxy-1.7.3
[root@server3 haproxy-1.7.3]# cd examples/
[root@server3 examples]# cp content-sw-sample.cfg /etc/haproxy/
[root@server3 examples]# cd /etc/haproxy/
[root@server3 haproxy]# mv content-sw-sample.cfg haproxy.cfg   ##修改配置文件名字(为了方便)
[root@server1 haproxy]# useradd -u200 -g200 -s /sbin/nologin -M haproxy  ###建立haproxy用户,uid,gid都是200

轮询后端web服务器和haproxy监控页的实现

编辑haproxy服务器(server3)的配置文件:
[root@server3 haproxy]# vim haproxy.cfg

bal
        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
        stats uri       /admin/stats
        option prefer-last-server
        retries         2
        option redispatch
        timeout connect 5s
        timeout server  5s
        
	stats uri       /admin/stats     ##监控页
	stats auth      admin:westos    ###监控页的用户和密码
	stats refresh   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 dynamic    ###默认静态服务器
# The static backend backend for 'Host: img', /img and /css.
backend dynamic                      ##配置后端的两台服务器,静态  server1和server2
        balance         roundrobin
        server          dynsrv1 172.25.5.1:80  check inter 1000
        server          dynsrv2 172.25.5.2:80  check inter 1000
[root@server3 sbin]# /etc/init.d/haproxy start

测试
在网页上 172.25.5.3 server1和server2轮询
在网页上172.25.5.3/admin/stats 查看监控页此处以查看后端服务器的状态,如果你关闭一台后端服务器,可以看到监控页的变化

172.25.5.3/monitoruri #若返回200 OK 则表示正常

创建指定日志文件

1.vim /etc/rsyslog.conf
取消注释,使UDP端口接收生效.

在这里插入图片描述
添加日志并指定日志保存路径,local0.none表示在/var/log/messages下不保存
在这里插入图片描述
2.重新启动日至服务
在这里插入图片描述
3.可以看到haproxy的日至,在指定位置
在这里插入图片描述

acl权限列表

[root@server3 ~]# vim /etc/haproxy/haproxy.cfg
1)建立acl黑名单,指定ip,更改配置文件
在这里插入图片描述[root@server3 ~]# /etc/init.d/haproxy reload

测试
一号机测试:
在这里插入图片描述
2)错误重定向
此处修改haproxy配置文件将错误重定向到本机的apache服务
为避免与haproxy服务端口发生冲突,将apache端口改为8080

在这里插入图片描述
[root@server3 ~]# /etc/init.d/haproxy reload
[root@server3 ~]# vim /etc/httpd/conf/httpd.conf 修改端口
在这里插入图片描述
写入要给被拉黑用户的回应,并启动apapche服务
在这里插入图片描述
测试
在这里插入图片描述
3)指定ip重定向
修改haproxy配置文件并重启服务(ip不一致,格式相似)

在这里插入图片描述

动静分离

[root@server3 ~]# vim /etc/haproxy/haproxy.cfg
use_backend dynamic if { path_end .php } 表明如果显示访问路径是以.php结尾时,访问动态后端服务器2号,可以看到此处我们访问的是static,
在这里插入图片描述
[root@server3 ~]# /etc/init.d/haproxy reload
在server1上写html静态文本
在这里插入图片描述
在server2上写动态php脚本(要下载php服务,写的文本才能生效)
在这里插入图片描述
测试
在这里插入图片描述
在这里插入图片描述

读写分离

[root@server3 ~]# vim /etc/haproxy/haproxy.cfg
在这里插入图片描述
[root@server3 ~]# /etc/init.d/haproxy reload
在server1和server2/var/www/html/目录下导入可以上传图片的脚本,脚本在文章最后(确保server1和server2有php)
在这里插入图片描述
在这里插入图片描述
测试
在这里插入图片描述
在这里插入图片描述
可以看到server1(static)的upload文件下有上传的东西
在这里插入图片描述

读模块和写模块一样的道理,当后台服务器很多时,我们就可以自定义设置用户可以读到那个服务器,写到那个服务器

acl read method GET  ##添加write模块
        acl read method HEAT
        use_backend static if read  ##此处设置如果读到静态(static)主机

#######

[root@server1 html]# ls
index.php  upload  upload_file.php
[root@server1 html]# cat 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@server1 html]# cat 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@server1 html]# cat upload_file.php 
<?php
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/pjpeg"))
&& ($_FILES["file"]["size"] < 200000000))
  {
  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";
  }
?>

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值