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

本文详细介绍了如何使用HAproxy实现负载均衡,包括配置过程、测试以及基于TCP和HTTP的应用程序代理。在负载均衡部分,通过配置后端服务器和负载均衡算法,实现了服务器间的轮调。在应用程序代理部分,讨论了动态页面与静态页面的分离、日志路径修改、访问控制以及读写分离的实现,确保了服务的高效稳定运行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

一.Haproxy实现负载均衡

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

[root@server1 ~]# ls
haproxy-1.7.3.tar.gz
[root@server1 ~]# tar zxf haproxy-1.7.3.tar.gz 
[root@server1 ~]# cd haproxy-1.7.3
[root@server1 haproxy-1.7.3]# find . -name *.spec
./examples/haproxy.spec
[root@server1 haproxy-1.7.3]# yum install -y rpm-build
[root@server1 ~]# rpmbuild -tb haproxy-1.7.3.tar.gz 

2.找到haproxty的配置文件

[root@server1 ~]# ls
haproxy-1.7.3  haproxy-1.7.3.tar.gz  rpmbuild
[root@server1 ~]# cd 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   安装
Preparing...                ########################################### [100%]
   1:haproxy                ########################################### [100%]
[root@server1 x86_64]# rpm -qa | grep haproxy
haproxy-1.7.3-1.x86_64
[root@server1 x86_64]# rpm -ql haproxy-1.7.3-1.x86_64
/etc/haproxy
/etc/rc.d/init.d/haproxy
/usr/sbin/haproxy
/usr/share/doc/haproxy-1.7.3
/usr/share/doc/haproxy-1.7.3/CHANGELOG
/usr/share/doc/haproxy-1.7.3/README
/usr/share/doc/haproxy-1.7.3/architecture.txt
/usr/share/doc/haproxy-1.7.3/configuration.txt
/usr/share/doc/haproxy-1.7.3/intro.txt
/usr/share/doc/haproxy-1.7.3/management.txt
/usr/share/doc/haproxy-1.7.3/proxy-protocol.txt
/usr/share/man/man1/haproxy.1.gz
[root@server1 x86_64]# cd
[root@server1 ~]# cd haproxy-1.7.3 
[root@server1 haproxy-1.7.3]# cd examples/
[root@server1 examples]# ls
acl-content-sw.cfg     debug2ansi    haproxy.spec           ssl.cfg
auth.cfg               debug2html    haproxy.vim            stats_haproxy.sh
check                  debugfind     init.haproxy           transparent_proxy.cfg
check.conf             errorfiles    option-http_proxy.cfg  wurfl-example.cfg
content-sw-sample.cfg  haproxy.init  seamless_reload.txt
[root@server1 examples]# cp content-sw-sample.cfg /etc/haproxy/  将配置文件拷贝到/etc/haproxy
[root@server1 examples]# cd /etc/haproxy/
[root@server1 haproxy]# ls
content-sw-sample.cfg
[root@server1 haproxy]# mv content-sw-sample.cfg haproxy.cfg 给配置文件重新命名
[root@server1 haproxy]# ls
haproxy.cfg

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

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

[root@server1 haproxy]# vim haproxy.cfg 
#
# This is a sample configuration. It illustrates how to separate static objects
# traffic from dynamic traffic, and how to dynamically regulate the server load.
#
# It listens on 192.168.1.10:80, and directs all requests for Host 'img' or
# 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                # 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
        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     # 负载均衡算法rr
        server          dynsrv1 172.25.254.2:80 check inter 1000 # 后端服务器server2
        server          dynsrv2 172.25.254.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.254.1,出现server2与server3的轮调….

浏览器输入172.25.254.1/monitoruri

浏览器输入172.25.254.1/admin/stats 监控页面

编辑配置文件对监控页面进行加密,并制定页面5s刷新一次

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

(一)动态页面和静态页面的分离
1.在server2中的httpd默认发布目录写index.html(server2)
在server3中的httpd默认发布目录写index.php(php测试页面)

server3中安装php

[root@server3 html]# vim index.php
<?php
phpinfo()
?>
[root@server3 html]# yum install -y php
[root@server3 html]# /etc/init.d/httpd restart

写完后重启httpd服务…

2.在haproxy的配置文件中修改访问动态页面和静态页面的路径

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

# the application servers go here
backend static           # 静态页面的后端服务器群组
        balance         roundrobin
        server          dynsrv3 172.25.254.2:80 check inter 1000

backend dynamic         # 动态页面的后端服务器群组
        balance         roundrobin
        server          dynsrv4 172.25.254.3:80 check inter 1000

3.在物理机做访问解析:

4.在浏览器测试页测试
动态访问到server3的php页面

静态访问到server2的httpd默认发布文件

(二)修改haproxy的日志路径:

1.修改日志服务配置文件从而修改日志存储位置

[root@server1 haproxy]# vim /etc/rsyslog.conf
*.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

2.重启日志服务

[root@server1 haproxy]# /etc/init.d/rsyslog restart   重新启动服务
Shutting down system logger:                               [  OK  ]
Starting system logger:                                    [  OK  ]

3.在浏览器访问后,查看日志内容 (主机ip)

(三)访问控制

1.不允许172.25.254.70访问(实现对黑名单主机的访问)
在配置文件的frontend public部分写:

[root@server1 haproxy]# vim haproxy.cfg 

acl blacklist src 172.25.254.70

http-request deny if blacklist

[root@server1 haproxy]# /etc/init.d/haproxy reload

172.25.254.70主机的浏览器中访问出现下面情况:  

而在别的主机中可以访问:

(1)出现错误403,不想将“拒绝”表现的这么直接,可以重定向到某台主机,显示错误提示页面,比如,我们重定向到夲机的8080端口。

编辑配置文件[root@server1 haproxy]# vim haproxy.cfg

server1安装httpd,并修改端口,在默认发布目录下写发布文件

[root@server1 haproxy]# yum install -y httpd
[root@server1 haproxy]# vim /etc/httpd/conf/httpd.conf 
Listen 8080
[root@server1 haproxy]# vim /var/www/html/index.html
您已被拉黑
[root@server1 haproxy]# /etc/init.d/httpd restart

查看:

(四)读写分离:

1.修改配置文件(截取改动部分)

# 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   }
         
        #acl blacklist src 172.25.254.70    注释掉之前的访问控制
         
        #http-request deny if blacklist
      
        #errorloc 403 http://172.25.254.1:8080/index.html
        
        acl blacklist src 172.25.254.70
        acl write method POST  #写的动作
        acl write method PUT   #也是写的动作

        #use_backend      dynamic if { path_end .php } 
      
        use_backend       dynamic if write    # write部分中的两种情况直接去dynamic的服务器集群 写的动作调用server3
        
        default_backend  static  默认去static服务器集群
       
# the application servers go here
backend static
        balance         roundrobin
        server          dynsrv3 172.25.254.2:80 check inter 1000

backend dynamic
        balance         roundrobin
        server          dynsrv4 172.25.254.3:80 check inter 1000

 

2.重新加载haproxy服务

[root@server1 haproxy]# /etc/init.d/haproxy reload

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

[kiosk@foundation150 20190219]$ scp -r upload root@172.25.254.3:/var/www/html/ 真实物理机导入

[root@server3 html]# cd upload/
[root@server3 upload]# ls
index.php  upload_file.php
[root@server3 upload]# chmod 644 *  给文件权限
[root@server3 upload]# ls
index.php  upload_file.php
[root@server3 upload]# mv * ..
mv: overwrite `../index.php'? y
[root@server3 upload]# cd ..
[root@server3 html]# ls
index.html  index.php  upload  upload_file.php
[root@server3 html]# ll
total 16
-rw-r--r-- 1 root root    8 Feb 20 11:34 index.html
-rw-r--r-- 1 root root  257 Feb 20 15:38 index.php
drwx------ 2 root root 4096 Feb 20 15:39 upload
-rw-r--r-- 1 root root  927 Feb 20 15:38 upload_file.php
[root@server3 html]# chmod 777 upload   给upload目录权限

[root@server3 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@server3 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"] < 20000))
  {
  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";
  }
?>

在测试之前给server2同样配置的和server3相同

[root@server2 html]# yum install -y php

[root@server3 html]# scp -r upload upload_file.php index.php root@server2:/var/www/html/

server2和server3都重新启动httpd

上传图片之前修改server2和server3的upload_file.php文件的图片大小,使其尽量大

[root@server3 html]# vim upload_file.php 

4.在浏览器测试172.25.254.1

上传成功的图片保存在server3中/var/www/html/upload中

server2中没有

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值