实验环境:
物理机 用于测试访问 172.25.254.67
haproxy服务器 172.25.254.1
后端 server2 172.25.254.2
后端 server3 172.25.254.3

haproxy的部署

rhel 7.6的系统中有自带的haproxy,我们也可以去官网下载:

yum install haproxy -y
 [root@server1 ~]# id haproxy
uid=188(haproxy) gid=188(haproxy) groups=188(haproxy)
会自动生成haproxy用户。

它的配置文件在 /etc/haproxy/haproxy.cfg
大致有一下几个模块,global,defaults,frontend main *:5000,backend。

我们做一下更改:

含有最新版本haproxy的yum源 haproxy -f_含有最新版本haproxy的yum源


将请求转发给两台后端。

物理机测试访问:

含有最新版本haproxy的yum源 haproxy -f_php_02


实现了反向代理和负载均衡。

haproxy的配置

查看状态和监控;

[root@server1 ~]# vim /etc/haproxy/haproxy.cfg

含有最新版本haproxy的yum源 haproxy -f_负载均衡器_03


访问:

含有最新版本haproxy的yum源 haproxy -f_haproxy_04


可以看到我们两台后端的状态,相当于我们的后台。

含有最新版本haproxy的yum源 haproxy -f_负载均衡器_05


200OK 可以知道这个服务是正常的,用于监控。

后台访问权限控制

stats auth          admin:westos               用户认证,帐号为admin  密码为westos
    stats refresh       5s						页面刷新间隔 5s

含有最新版本haproxy的yum源 haproxy -f_php_06


含有最新版本haproxy的yum源 haproxy -f_php_07


这样的话就会需要输入密码才能登陆,且5s刷新一次。

日志

[root@server1 ~]# vim /etc/haproxy/haproxy.cfg

含有最新版本haproxy的yum源 haproxy -f_haproxy_08


每个应用都有自己的日志.我们配置haproxy时它告诉我们要去配置系统的日志。

[root@server1 ~]# vim /etc/rsyslog.conf

打开udp模式:

含有最新版本haproxy的yum源 haproxy -f_haproxy_09


设置地址:

含有最新版本haproxy的yum源 haproxy -f_含有最新版本haproxy的yum源_10


重启rsyslog服务.

含有最新版本haproxy的yum源 haproxy -f_haproxy_11


发现里面已经记录了访问的信息,系统就会把haproxy的日志信息记录到 /var/log/haproxy.log 。

黑名单

含有最新版本haproxy的yum源 haproxy -f_负载均衡器_12

含有最新版本haproxy的yum源 haproxy -f_负载均衡器_13


含有最新版本haproxy的yum源 haproxy -f_负载均衡器_14


含有最新版本haproxy的yum源 haproxy -f_负载均衡器_15


可见我们的物理机被拒绝,用其他的ip地址访问可以。

我们也可以把 block 替换为 http-request deny,效果相同:

含有最新版本haproxy的yum源 haproxy -f_php_16


我们还可以将403错误页面转接至本机的8080端口:

安装apache,修改配置文件端口为8080端口,启动httpd,并配置一个index.html页面:

含有最新版本haproxy的yum源 haproxy -f_php_17


重启haproxy,测试访问:

含有最新版本haproxy的yum源 haproxy -f_linux_18


刚才的403页面就变成了8080端口的页面。

请求分发

设置一个动态页面的资源组,上面的static为静态组:

vim /etc/haproxy/haproxy.cfg

含有最新版本haproxy的yum源 haproxy -f_haproxy_19


当访问以php结尾的页面使用dynamic 资源组,默认使用static资源组.

在server3 主机安装php,并配置一个php页面

yum install php -y

含有最新版本haproxy的yum源 haproxy -f_haproxy_20


测试访问:

含有最新版本haproxy的yum源 haproxy -f_haproxy_21


含有最新版本haproxy的yum源 haproxy -f_php_22


可见默认访问到了server2上,当访问以php结尾的页面时访问的时dynamic 的主机组,就是server3.

读写分离

给server2 页安装php。

在server2 和server3 的/var/ww/html 目录下建立两个php页面.

含有最新版本haproxy的yum源 haproxy -f_负载均衡器_23


upload 的权限为777 不然 haproxy 用户不可写。index.php:

含有最新版本haproxy的yum源 haproxy -f_负载均衡器_24


upload_file.php:

含有最新版本haproxy的yum源 haproxy -f_负载均衡器_25


index.php 会读取upload_file.php的动作,会把上传的文件上传到 upload目录下。

更改server1 的haproxy 配置:

vim /etc/haproxy/haproxy.cfg
#---------------------------------------------------------------------
# main frontend which proxys to the backends
#---------------------------------------------------------------------
frontend  main *:80
    acl read method HEAD
    acl read method GET                定义读的两种方法
    acl write method POST
    acl write method PUT				定义写的两种方法,都可以。

#    acl url_static       path_beg       -i /static /images /javascript /stylesheets
#    acl url_static       path_end       -i .jpg .gif .png .css .js
#
#    use_backend static          if url_static
    #acl blacklist src 172.25.254.99
    #http-request deny if blacklist 
    #errorloc 403 http://172.25.254.1:8080/index.html

    use_backend dynamic if write            写的时候使用dynamic资源组
    use_backend static if read				读的时候使用static资源组
    default_backend             static

含有最新版本haproxy的yum源 haproxy -f_含有最新版本haproxy的yum源_26


读的时候读的是 static 组。

我们可以测试该server2的index.php;

含有最新版本haproxy的yum源 haproxy -f_含有最新版本haproxy的yum源_27


在测试访问:

含有最新版本haproxy的yum源 haproxy -f_haproxy_28


可见读取的就是server2 主机。我们选择上传daolian.jpg ,然后点击submit提交,

含有最新版本haproxy的yum源 haproxy -f_linux_29


这时 server3 的upload目录下出现了图片,而server2 没有

含有最新版本haproxy的yum源 haproxy -f_haproxy_30


含有最新版本haproxy的yum源 haproxy -f_负载均衡器_31

这样就实现了读写分离。