HAproxy的负载均衡,以及基于TCP和HTTP的应用程序代理

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

一.Haproxy实现负载均衡

配置过程及测试:
1.解压haproxy压缩包,安装源码编译软件,源码编译haproxy软件

tar zxf haproxy-1.6.11.tar.gz
yum install rpm-build -y
rpmbuild -tb haproxy-1.6.11.tar.gz

2.找到haproxty的配置文件

cd haproxy-1.6.11/examples
cp content-sw-sample.cfg /etc/haproxy/haproxy.cfg

3.建立haproxy用户和组。利用linux对haporxy用户的访问控制实现对haporxy服务的控制

grep 20 /etc/passwd
groupadd -g 200 haproxy     # 建立一个haproxy组
useradd -u 200 -g 200 -M haproxy
id haproxy

4.修改配置文件,添加后端真实服务器和负载均衡算法

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
        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.3.2:80 check inter 1000 # 后端服务器server2
        server          statsrv2 172.25.3.3:80 check inter 1000 # 后端服务器servr3

5.打开server1的haproxy服务和后端服务器的httpd服务:

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

测试结果:在浏览器输入172.25.1.1,出现server2与server3的轮调….

二.基于TCP和HTTP的应用程序代理

(一)动态页面和静态页面的分离
1.在server1中的httpd默认发布目录写index.html(server2)
在server3中的httpd默认发布目录写index.php(php测试页面)
写完后重启httpd服务…
2.在haproxy的配置文件中修改访问动态页面和静态页面的路径

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   }     
        use_backend     static2 if { path_end -i .php   }  # 访问路径以.php结尾,认为是动态页面
        default_backend static1   # 静态页面,采用默认访问路径

# The static backend backend for 'Host: img', /img and /css.
backend static1   # 静态页面的后端服务器群组
        balance         roundrobin
        server          statsrv1 172.25.1.2:80 check inter 1000
backend static2   # 动态页面的后端服务器群组
        balance         roundrobin
        server          statsrv2 172.25.1.3:80 check inter

HAproxy的负载均衡,以及基于TCP和HTTP的应用程序代理_第1张图片
3.在物理机做访问解析:
4.在浏览器测试页测试
动态访问到server3的php页面
HAproxy的负载均衡,以及基于TCP和HTTP的应用程序代理_第2张图片
静态访问到server2的httpd默认发布文件
HAproxy的负载均衡,以及基于TCP和HTTP的应用程序代理_第3张图片

(二)修改haproxy的日志路径:
1.修改日志服务配置文件从而修改日志存储位置

*.info;mail.none;authpriv.none;cron.none;local0.none   #                 /var/log/messages

# The authpriv file has restricted access.
authpriv.*                                              /var/log/secure

# Log all the mail messages in one place.
mail.*                                                  -/var/log/maillog


# Log cron stuff
cron.*                                                  /var/log/cron

# Everybody gets emergency messages
*.emerg                                                 *

# Save news errors of level crit and higher in a special file.
uucp,news.crit                                          /var/log/spooler

# Save boot messages also to boot.log
local7.*                                                /var/log/boot.log
local0.*                                                /var/log/haporxy.log  # local0的日志放在/var/log/haporxy.log

HAproxy的负载均衡,以及基于TCP和HTTP的应用程序代理_第4张图片
HAproxy的负载均衡,以及基于TCP和HTTP的应用程序代理_第5张图片
2.重启日志服务

/etc/init.d/rsyslog restart

3.在浏览器访问后,查看日志内容
HAproxy的负载均衡,以及基于TCP和HTTP的应用程序代理_第6张图片

(三)访问控制
1.不允许172.25.1.250访问(实现对黑名单主机的访问)
在配置文件的frontend public部分写:
acl blacklist src 172.25.1.250
http-request deny if blacklist
172.25.1.250主机的浏览器中访问出现下面情况:
HAproxy的负载均衡,以及基于TCP和HTTP的应用程序代理_第7张图片
而在别的主机中可以访问:
HAproxy的负载均衡,以及基于TCP和HTTP的应用程序代理_第8张图片
(1)出现错误403,不想将“拒绝”表现的这么直接,可以重定向到某台主机,显示错误提示页面,比如,我们重定向到夲机的8080端口。

errorloc 403 http://172.25.1.1:8080

HAproxy的负载均衡,以及基于TCP和HTTP的应用程序代理_第9张图片

2.直接重定向

访问www.westos.org直接重定向到www.baidu.com
在物理机做解析  172.25.1.1   www.westos.org

HAproxy的负载均衡,以及基于TCP和HTTP的应用程序代理_第10张图片

(四)读写分离:
1.修改配置文件(截取改动部分)

acl write method POST   # POST是写的动作
acl write method PUT    # PUT也是写的动作
#http-request deny if blacklist   # 黑名单直接deny
#errorloc 403 http://172.25.1.1:8080  # 403报错的拒绝重定向到夲机80端口

#redirect  location  http://www.baidu.com   # 直接重定向

#use_backend     static2 if { path_end -i .php   }  # 访问路径是以i.php结尾直接去static2服务器集群
use_backend     static2 if write   # write部分中的两种情况直接去static2的服务器集群
default_backend static1  # 默认去static服务器集群

HAproxy的负载均衡,以及基于TCP和HTTP的应用程序代理_第11张图片
2.重新加载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:

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"] . "
"
; } else { # 上传成功显示的信息(所以上传图片是个动态的过程) echo "Upload: " . $_FILES["file"]["name"] . "
"
; echo "Type: " . $_FILES["file"]["type"] . "
"
; echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb
"
; echo "Temp file: " . $_FILES["file"]["tmp_name"] . "
"
; 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.在浏览器测试172.25.1.1
HAproxy的负载均衡,以及基于TCP和HTTP的应用程序代理_第12张图片
HAproxy的负载均衡,以及基于TCP和HTTP的应用程序代理_第13张图片
上传成功的图片保存在server3中/var/www/html/upload中
HAproxy的负载均衡,以及基于TCP和HTTP的应用程序代理_第14张图片

你可能感兴趣的:(HAproxy的负载均衡,以及基于TCP和HTTP的应用程序代理)