负载均衡之haproxy配置以及基于TCP和HTTP的应用程序代理

一、haproxy的概念

HAProxy是一个使用C语言编写的*及开放源代码软件,其提供高可用性、负载均衡,以及基于TCP和HTTP的应用程序代理。HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。

二、haproxy的安装及配置

1、安装

(1)解压haproxy压缩包,安装源码编译软件,源码编译haproxy软件

[[email protected] ~]#yum install -y rpm-build	#源码编译软件
[[email protected] ~]#rpmbuild -tb haproxy-1.6.11.tar.gz (可能回报错,因为没有安装依赖包prce-devel)
[[email protected] ~]#yum install pcre-devel -y
[[email protected] ~]#cd rpmbuild/RPMS/x86_64
[[email protected] x86_64]#rpm -qpl haproxy-1.6.11-1.x86_64.rpm 
[[email protected] x86_64]# rpm -ivh haproxy-1.6.11-1.x86_64.rpm	#安装haproxy
[[email protected] x86_64]#cd ~
[[email protected] ~]# tar zxf haproxy-1.6.11.tar.gz

负载均衡之haproxy配置以及基于TCP和HTTP的应用程序代理
负载均衡之haproxy配置以及基于TCP和HTTP的应用程序代理
(2)更改文件名字,因为haproxy启动脚本中读取的配置文件时/etc/haproxy/haproxy.cfg

[[email protected] ~]# cd haproxy-1.6.11/examples/
[[email protected]]#cp content-sw-sample.cfg  /etc/haproxy/haproxy.cfg
[[email protected] examples]# cd /etc/haproxy/

(3)建立haproxy用户和组

[[email protected] haproxy]# grep 20 /etc/passwd
[[email protected] haproxy]# groupadd -g 200 haproxy
[[email protected] haproxy]# useradd -u 200 -g 200 -M haproxy
[[email protected] haproxy]# id haproxy
uid=200(haproxy) gid=200(haproxy) groups=200(haproxy)

负载均衡之haproxy配置以及基于TCP和HTTP的应用程序代理
(4)更改最大文件大小

[[email protected] haproxy]# vim /etc/security/limits.conf
文件末尾添加:haproxy 	-	nofile		10000

负载均衡之haproxy配置以及基于TCP和HTTP的应用程序代理

2、配置haproxy

HAProxy配置中分五大部分:

global:全局配置参数,进程级的,用来控制Haproxy启动前的一些进程及系统设置
defaults:配置一些默认的参数,可以被frontend,backend,listen段继承使用
frontend:用来匹配接收客户所请求的域名,uri等,并针对不同的匹配,做不同的请求处理
backend:定义后端服务器集群,以及对后端服务器的一些权重、队列、连接数等选项的设置,我将其理解为Nginx中的upstream块
listen:我将其理解为frontend和backend

配置文件更改如下: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	#所属运行的用户uid
        gid             200	#所属运行的用户组
        chroot          /var/empty	#chroot运行的路径
        Daemon			#以后台形式运行haproxy
Defaults	#默认的全局设置
        retries		 2	#3次连接失败就认为服务不可用,也可以通过后面设置 
        option 		redispatch		#serverId对应的服务器挂掉后,强制定向到其他健康的服务器 
        timeout connect 5s	#连接超时 
        timeout server  30s	#服务器超时 
        timeout queue   30s
        option httpchk  HEAD /login.php
        mode            http		#所处理的类别(7层 http;4层tcp)
        log             global	
        option          httplog	#日志类别http日志格式
        option          dontlognull		#不记录健康检查的日志信息 
        monitor-uri     /monitoruri
        maxconn         8000	#最大连接数
        timeout client  30s		#客户端超时 

        stats uri       /admin/stats
# The public 'www' address in the DMZ
frontend public
        bind            172.25.66.2:80 name clear	#监听端口,即haproxy提供web服务的端口,和lvs的vip端口类似 
        #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	# 负载均衡算法rr
        server          dynsrv1 172.25.66.3:80 check inter 1000		 # 后端服务器server3
        server          dynsrv2 172.25.66.4:80 check inter 1000		 # 后端服务器server4

3、测试

打开server2的haproxy服务,打开server3和server4的httpd,还要记得在server2中关闭httpd服务

[[email protected] haproxy]# /etc/init.d/haproxy start   ##打开服务
在server2和server3中分别打开httpd
[[email protected] ~]# /etc/init.d/httpd  start

测试结果:server3和server4轮调
负载均衡之haproxy配置以及基于TCP和HTTP的应用程序代理
负载均衡之haproxy配置以及基于TCP和HTTP的应用程序代理

二、添加haproxy的监控界面

健康检查:
负载均衡之haproxy配置以及基于TCP和HTTP的应用程序代理
监控:
当server3和server4上的服务是开着的,会出现绿色的界面
负载均衡之haproxy配置以及基于TCP和HTTP的应用程序代理
当server3服务关闭之后,会出现红色
负载均衡之haproxy配置以及基于TCP和HTTP的应用程序代理

三、定义haproxy日志

操作步骤:

[[email protected] ~]# cd /var/log
[[email protected] log]# vim /etc/rsyslog.conf 
[[email protected] log]# /etc/init.d/rsyslog restart
Shutting down system logger:                               [  OK  ]
Starting system logger:                                    [  OK  ]
[[email protected] log]# /etc/init.d/haproxy restart
Stopping haproxy:                                          [  OK  ]
Starting haproxy:                                          [  OK  ]
[[email protected] log]# cat haproxy.log
Oct  2 00:11:44 localhost haproxy[2044]: 172.25.66.250:35166 [02/Oct/2018:00:11:44.128] public public/<STATS> 0/-1/-1/-1/0 200 15625 - - PR-- 0/0/0/0/0 0/0 "GET /admin/stats HTTP/1.1"
Oct  2 00:12:14 localhost haproxy[2044]: 172.25.66.250:35170 [02/Oct/2018:00:12:14.183] public public/<STATS> 0/-1/-1/-1/0 200 15641 - - PR-- 0/0/0/0/0 0/0 "GET /admin/stats HTTP/1.1"
  • 修改rsyslog服务的配置文件 vim /etc/rsyslog.conf
    负载均衡之haproxy配置以及基于TCP和HTTP的应用程序代理
    负载均衡之haproxy配置以及基于TCP和HTTP的应用程序代理
    负载均衡之haproxy配置以及基于TCP和HTTP的应用程序代理
  • 查看结果
    第一次查看没有结果,当在浏览器中刷新几次,就可以看到
    负载均衡之haproxy配置以及基于TCP和HTTP的应用程序代理

四、访问控制

不允许172.25.66.250访问
在配置文件中加入
负载均衡之haproxy配置以及基于TCP和HTTP的应用程序代理

  • 当再次访问主机浏览器时,会出现下面情况
    负载均衡之haproxy配置以及基于TCP和HTTP的应用程序代理
  • 在其他主机中测试时,就可以访问
    负载均衡之haproxy配置以及基于TCP和HTTP的应用程序代理
  • 当把个别主机加入黑名单时,访问浏览器会出现403报错,当然,我们不希望访问时会出现这个界面,所以可以重定向到某台主机,显示错误提示页面
    • 方式一:
acl blacklist src 172.25.66.250
http-request deny if blacklist
errorloc 403 http://172.25.66.2:8080/index.html 

负载均衡之haproxy配置以及基于TCP和HTTP的应用程序代理
负载均衡之haproxy配置以及基于TCP和HTTP的应用程序代理

  • 方式二:
acl blacklist src 172.25.14.250   ##重定向
redirect location http://172.25.14.1:8080/index.html  if blacklist

负载均衡之haproxy配置以及基于TCP和HTTP的应用程序代理
负载均衡之haproxy配置以及基于TCP和HTTP的应用程序代理

五、动静分离

1、修改配置文件

 35 frontend public
 36         bind            *:80 name clear
 42         use_backend     dynamic if { path_end -i *.php   }
 43         default_backend dynamic
 44 
 45 # the application servers go here
 46 backend dynamic
 47         balance         roundrobin
 48         server          dynsrv1 172.25.66.3:80 check inter 1000
 49 backend static
 50         balance roundrobin
 51         server           dynsrv2 172.25.66.4:80 check inter 1000

默认是动态,在动态ip(172.25.66.3)上写入/var/www/html/index.php
负载均衡之haproxy配置以及基于TCP和HTTP的应用程序代理

2、测试:在主机浏览器中输入172.25.66.2,就可以看见动静轮询

负载均衡之haproxy配置以及基于TCP和HTTP的应用程序代理

六、读写分离

1、修改配置文件

35 frontend public
 36         bind            *:80 name clear
 37 
 38         acl write method POST
 39         acl write method        put
 45         use_backend     dynamic if write
 46         default_backend static

2、重新加载haproxy服务

[[email protected] haproxy]# /etc/init.d/haproxy reload

3、在server3中的httpd默认发布目录,放进去index.php(选择图片的静态页面)和upload_file.php(上传图片的动态页面),存放上传图片的目录upload目录。

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>
upload_file.php:
<?php
if ((($_FILES["file"]["type"] == "image/gif")  
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/pjpeg"))  # 图片的三种格式(只能上传着三种)
&& ($_FILES["file"]["size"] < 2000000))   # 上传图片的大小(k为单位),可以自己调节大小
  {
  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";  # 不符合上传条件显示Invalid file
  }
?>

4、在浏览器中测试

负载均衡之haproxy配置以及基于TCP和HTTP的应用程序代理
负载均衡之haproxy配置以及基于TCP和HTTP的应用程序代理
上传成功的照片保存在server3的/var/www/html/upload中
负载均衡之haproxy配置以及基于TCP和HTTP的应用程序代理