实验环境:
物理机 用于测试访问 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的配置
查看状态和监控;
[root@server1 ~]# vim /etc/haproxy/haproxy.cfg
访问:
可以看到我们两台后端的状态,相当于我们的后台。
200OK 可以知道这个服务是正常的,用于监控。
后台访问权限控制
stats auth admin:westos 用户认证,帐号为admin 密码为westos
stats refresh 5s 页面刷新间隔 5s
这样的话就会需要输入密码才能登陆,且5s刷新一次。
日志
[root@server1 ~]# vim /etc/haproxy/haproxy.cfg
每个应用都有自己的日志.我们配置haproxy时它告诉我们要去配置系统的日志。
[root@server1 ~]# vim /etc/rsyslog.conf
打开udp模式:
设置地址:
重启rsyslog服务.
发现里面已经记录了访问的信息,系统就会把haproxy的日志信息记录到 /var/log/haproxy.log 。
黑名单
可见我们的物理机被拒绝,用其他的ip地址访问可以。
我们也可以把 block 替换为 http-request deny,效果相同:
我们还可以将403错误页面转接至本机的8080端口:
安装apache,修改配置文件端口为8080端口,启动httpd,并配置一个index.html页面:
重启haproxy,测试访问:
刚才的403页面就变成了8080端口的页面。
请求分发
设置一个动态页面的资源组,上面的static为静态组:
vim /etc/haproxy/haproxy.cfg
当访问以php结尾的页面使用dynamic 资源组,默认使用static资源组.
在server3 主机安装php,并配置一个php页面
yum install php -y
测试访问:
可见默认访问到了server2上,当访问以php结尾的页面时访问的时dynamic 的主机组,就是server3.
读写分离
给server2 页安装php。
在server2 和server3 的/var/ww/html 目录下建立两个php页面.
upload 的权限为777 不然 haproxy 用户不可写。index.php:
upload_file.php:
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
读的时候读的是 static 组。
我们可以测试该server2的index.php;
在测试访问:
可见读取的就是server2 主机。我们选择上传daolian.jpg ,然后点击submit提交,
这时 server3 的upload目录下出现了图片,而server2 没有
这样就实现了读写分离。