其他分享
首页 > 其他分享> > 2.19 haproxy -------负载均衡,添加日志,访问控制,动静分离,读写分离

2.19 haproxy -------负载均衡,添加日志,访问控制,动静分离,读写分离

作者:互联网

一、haproxy的简介

HAProxy是一个使用C语言编写的自由及开放源代码软件[1],其提供高可用性负载均衡,以及基于TCPHTTP的应用程序代理

HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上。

HAProxy实现了一种事件驱动, 单一进程模型,此模型支持非常大的并发连接数。多进程或多线程模型受内存限制 、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接。事件驱动模型因为在有更好的资源和时间管理的用户空间(User-Space) 实现所有这些任务,所以没有这些问题。此模型的弊端是,在多核系统上,这些程序通常扩展性较差。这就是为什么他们必须进行优化以 使每个CPU时间片(Cycle)做更多的工作。

二、haproxy实现负载均衡

1、解压haproxy安装包,生成rpm包

cd
tar zxf haproxy-1.7.3.tar.gz
ls
cd haproxy-1.7.3
ls
yum install -y rpm-build        ##生成rpm包所需要的工具
rpmbuild -tb haproxy-1.7.3.tar.gz     ##生成rpm包

2、haproxy的安装

cd rpmbuild/RPMS/x86_64/
ls
rpm -ivh haproxy-1.7.3-1.x86_64.rpm

3、查询

rpm -qa | grep haproxy
rpm -ql | grep haproxy
rpm -ql haproxy-1.7.3-1.x86_64

4、复制配置文件,修改名称

cd
cd haproxy-1.7.3/examples/
cp content-sw-sample.cfg /etc/haproxy/
cd /etc/haproxy/
ls
mv content-sw-sample.cfg haproxy.cfg
ls


5、添加haproxy用户

useradd -s /sbin/nologin -M haproxy
vim /etc/passwd

haproxy:x:200:200::/home/haproxy:/sbin/nologin

vim /etc/group

haproxy:x:200:

[root@server1 x86_64]# id haproxy
uid=200(haproxy) gid=200(haproxy) groups=200(haproxy)

6、修改配置文件

vim /etc/haproxy/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
        gid             200
        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        ##对所有的IP进行操作
        #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
        server          dynsrv1 172.25.38.2:80 check inter 1000
        server          dynsrv2 172.25.38.3:80 check inter 1000


7、启动haproxy,查看端口号

/etc/init.d/haproxy start
netstat -tlnp    ##默认端口为80,与httpd冲突,如果使用httpd,需要修改端口为8080

结果

tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      1806/haproxy


测试:外部机器

server2和server2的apache服务开启

[root@foundation38 kiosk]# curl 172.25.38.1
server3
[root@foundation38 kiosk]# curl 172.25.38.1
<h2>server2</h2>


访问http://172.25.38.1/monitoruri


访问http://172.25.38.1/admin/stats   ##监控页面

 

8、修改监控参数

vim /etc/haproxy/haproxy.cfg

 34         stats auth      admin:westos    ##添加用户名和密码
 35
 36         stats refresh   5s            ##每5秒刷线一次

/etc/init.d/haproxy reload


三、给haproxy添加日志

1、查看haproxy的配置文件,查看日志位置

vim /etc/haproxy/haproxy.cfg

        log             127.0.0.1 local0

2、编辑日志配置文件

vim /etc/rsyslog.conf

 63 local0.*                                                /var/log/haproxy.log
##日志目录


 13 $ModLoad imudp    打开端口
 14 $UDPServerRun 514


3、重启日志服务

/etc/init.d/rsyslog restart

测试:重启haproxy并查看日志

/etc/init.d/haproxy restart
cat /var/log/haproxy.log

结果

Feb 19 17:27:08 localhost haproxy[1859]: Proxy dynamic stopped (FE: 0 conns, BE: 0 conns).
Feb 19 17:27:08 localhost haproxy[1884]: Proxy public started.
Feb 19 17:27:08 localhost haproxy[1884]: Proxy dynamic started.

 


四、haproxy添加访问控制

 

1、编辑haproxy配置文件,并加载

vim /etc/haproxy/haproxy.cfg

 44
 45         acl blacklist src 172.25.38.250    ##黑名单
 46
 47         http-request deny if blacklist
 48
 49         default_backend dynamic        ##默认访问dynamic的回应
 50
 51

 
/etc/init.d/haproxy reload

测试:

1、使用172.25.38.2访问,可以访问

[root@server2 bin]# curl 172.25.38.1
<h2>server2</h2>
[root@server2 bin]# curl 172.25.38.1
server3

2、使用172.25.38.250访问,被禁止

[root@foundation38 kiosk]# curl 172.25.38.1
<html><body><h1>403 Forbidden</h1>
Request forbidden by administrative rules.
</body></html>

2、添加被禁止后访问的页面

vim /etc/haproxy/haproxy.cfg
 45         acl blacklist src 172.25.38.250
 46
 47         http-request deny if blacklist
 48
 49         errorloc 403 http://172.25.38.1:8080/index.html    ##错误后,访问本地
 50
 51         default_backend dynamic

###redirect location http://172.25.0.1:8080/index.html if blackist


/etc/init.d/haproxy reload


3、server1,开启apache服务,并修改默认发布目录

vim /etc/httpd/conf/httpd.conf     ##修改端口为8080

 136 Listen 8080

vim /var/www/html/index.html

您已经被拉黑

/etc/init.d/httpd start


测试

[root@foundation38 kiosk]# curl 172.25.38.1:8080
您已经被拉黑

 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

五、haproxy动静分离

使得动态页面和静态页面分离开。本实验,默认静态页面,只有以.php结尾访问会进入动态页面
server2为静态页面,server3为动态页面

1、编写haproxy的配置文件,并重新加载

vim /etc/haproxy/haproxy.cfg
修改如下

    acl blacklist src 172.25.38.44    ##黑名单

    http-request deny if blacklist

    errorloc 403 http://172.25.38.1:8080/index.html ##黑名单访问

    use_backend    dynamic if { path_end .php }    ##如果以.php结尾访问,显示动态界面
    
        default_backend static    ##默认静态


# the application servers go here
backend static        ##server2为静态
        balance         roundrobin
        server          dynsrv1 172.25.38.2:80 check inter 1000

backend dynamic        ##server1为动态
    balance        roundrobin
        server          dynsrv2 172.25.38.3:80 check inter 1000

 

/etc/init.d/haproxy reload    ##重新加载


2、server3安装php,并编写默认发布目录,完成后,重启apache

yum install -y php
vim /var/www/html/index.php
编写如下
<?php
phpinfo()
?>

/etc/init.d/httpd restart


测试

访问http://172.25.38.1,显示结果为server2的静态界面

访问http://172.25.38.1/index.php,显示结果为server3的动态界面


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

六、haproxy读写分离

读取数据和写入数据在不同的服务器实现(一般写的服务器为高性能服务器),server2为写的服务器,server3为读服务器。

1、下载上传页面(upload),放到server2和server3的apache目录下

(外部主机)scp -r upload root@172.25.38.2:/var/www/html/

server2

cd /var/www/html/upload/
mv * ..
cd ..
ls
chmod 777 upload    ##修改权限使得,可以上传文件
scp -rp upload upload_file.php index.php root@172.25.38.3:/var/www/html/  ##复制到server3

2、修改server1的haproxy的配置文件,并加载

vim /etc/haproxy/haproxy.cfg
编辑如下

        acl blacklist src 172.25.38.44
        acl write method POST        ##重定向,write为 POST和PUT
        acl write method PUT

        #http-request deny if blacklist

        #errorloc 403 http://172.25.38.1:8080/index.html

        use_backend     static if write        ##如果写就访问static(server2)

        default_backend dynamic            ##默认访问dynamic(server3)
# the application servers go here
backend static
        balance         roundrobin
        server          dynsrv1 172.25.38.2:80 check inter 1000

backend dynamic
        balance         roundrobin
        server          dynsrv2 172.25.38.3:80 check inter 1000

/etc/init.d/haproxy reload

3、server2和server3都必须安装php,安装完后需要重新启动apache

yum install -y php

/etc/init.d/httpd restart


4、修改server2和server3的文件上传大小

vim /var/www/html/upload_file.php
修改如下
  5 && ($_FILES["file"]["size"] < 2000000))

测试:

访问:http://172.25.38.1/

上传文件成功后,在server2查看文件存在

Upload: redhat.jpg
Type: image/jpeg
Size: 52.8876953125 Kb
Temp file: /tmp/phpsVEI3I
Stored in: upload/redhat.jpg

[root@server2 upload]# ls
redhat.jpg


5、安装一个虚拟服务器server4

6、复制server1,haproxy的rpm包到server4

cd rpmbuild/RPMS/x86_64/
ls
scp haproxy-1.7.3-1.x86_64.rpm root@172.25.38.4:

7、server4安装haproxy,httpd(别写发布目录),添加haproxy用户

rpm -ivh haproxy-1.7.3-1.x86_64.rpm
yum install -y httpd
vim /var/www/html/index.html
/etc/init.d/httpd start
groupadd -g 200 haproxy
useradd -u 200 -g 200 -s /sbin/nologin -M haproxy


8、server1给server4发送配置文件

scp /etc/haproxy/haproxy.cfg root@172.25.38.4:/etc/haproxy/


9、server4开启服务,首先修改http的端口为8080(因为haproxy的端口为80)

 

vim /etc/httpd/conf/httpd.conf
 136 Listen 8080

/etc/init.d/httpd restart
/etc/init.d/haproxy start

10、编辑haproxy的配置文件,并加载


vim /etc/haproxy/haproxy.cfg

修改如下
        acl blacklist src 172.25.38.44
        acl read method PUT    ##重定向 read为PUT和HEAD
        acl read method HEAD

        #http-request deny if blacklist

        #errorloc 403 http://172.25.38.1:8080/index.html

        use_backend     dynamic if read  ##如果read,那么访问server3(dynamic)

        default_backend static  ##默认访问static(server2)


# the application servers go here
backend static
        balance         roundrobin
        server          dynsrv1 172.25.38.2:80 check inter 1000

backend dynamic
        balance         roundrobin
        server          dynsrv2 172.25.38.3:80 check inter 1000

 /etc/init.d/haproxy reload


测试:

访问 172.25.38.4

上传文件成功后,在server2查看文件存在

Upload: redhat.jpg
Type: image/jpeg
Size: 52.8876953125 Kb
Temp file: /tmp/phpsVEI3I
Stored in: upload/redhat.jpg

[root@server2 upload]# ls
redhat.jpg

 

标签:haproxy,##,分离,server2,etc,2.19,172.25,backend
来源: https://blog.csdn.net/qq_41627390/article/details/87803512