一、Haproxy
1. Haproxy的介绍
Haproxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。Haproxy特别适用于那些负载特大的web站点,这些站点通常又需要会保持或七层处理。Haproxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中,同时可以保护你的web服务器不被暴露到网络上。
HAProxy 实现了一种事件驱动、单一进程模型,此模型支持非常大的并发连接数。多进程或多线程模型受内存限制 、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接。事件驱动模型因为在有更好的资源和时间管理的用户端(User-Space) 实现所有这些任务,所以没有这些问题。此模型的弊端是,在多核系统上,这些程序通常扩展性较差。这就是为什么他们必须进行优化以 使每个CPU时间片(Cycle)做更多的工作。
2. Haproxy配置文件中各模块的含义
- global参数是进程级的,通常和操作系统(OS)相关。这些参数一般只设置一次,如果配置无误,就不需要再次配置进行修改;
- defaults段用于为所有其它配置段提供默认参数;
- frontend段用于定义一系列监听的套接字,这些套接字可接受客户端请求并与之建立连接;
- backend段用于定义一系列“后端”服务器,代理将会将对应客户端的请求转发至这些服务器;
- listen段通过同时指定监听参数与后端服务器简要的定义了一个完整的代理
二、Haproxy的负载均衡
实验准备
- server1:172.25.65.1(haproxy)
- server2:172.25.65.2(httpd)
- server3:172.25.65.3(httpd)
- 测试机用于测试
1. yum安装软件
yum install -y haproxy
2. 编辑配置文件设置负载均衡策略(server1)
vim /etc/haproxy/haproxy.cfg
frontend main
bind *:80
default_backend webserver
backend webserver
balance roundrobin
server web1 172.25.65.2:80 check
server web2 172.25.65.3:80 check
systemctl start haproxy.service
systemctl status haproxy.service
3. server2和server3中同时操作
安装httpd,编写默认发布文件index.html,由于步骤都是一样的,这里以server2为例
yum install -y httpd
vim /var/www/html/index.html
server2
vim /var/www/html/index.html
server3
systemctl start httpd
4. 测试机进行测试,观察是否是轮询策略
curl 172.25.65.1
三、设置haproxy日志
server1中编辑日志文件,开启端口,设置日志采集策略
vim /etc/rsyslog.conf
$ModLoad imudp #使用udp模式
$UDPServerRun 514
local2.* /var/log/haproxy.log
systemctl restart rsyslog.service
测试机进行页面的请求(curl 172.25.65.1),观察日志信息存储文件中是否有请求信息
curl 172.25.65.1
四、haproxy状态码的设置
server1中设置haproxy的状态码参数
vim /etc/haproxy/haproxy.cfg
stats uri /admin/stats #haproxy和后端服务器的状态
monitor-uri /monitoruri #返回状态码
systemctl restart haproxy.service
注意状态信息应该写在defaults模块中,如果在全局变量的模块中,服务会开启失败,开启时不会报错,但是查看haproxy的状态则是inactive
测试机进行测试
在浏览器中输入网址进行查看
http://172.25.65.1/admin/stats
http://172.25.65.1/monitoruri
五、haproxy的认证及刷新时间设置
vim /etc/haproxy/haproxy.cfg
stats auth admin:westos #haproxy用户及密码
stats refresh 5s #刷新时间
systemctl restart haproxy.service
测试机进行测试
在浏览器中输入网址
http://172.25.65.1/admin/stats
六、haproxy的acl名单设置
在server1中进行acl名单的设置
vim /etc/haproxy/haproxy.cfg
acl blacklist src 172.25.65.250
http-request deny if blacklist
errorloc 403 http://172.25.65.1:8080/index.html
systemctl restart haproxy
安装httpd,编写默认发布文件index.html
yum install -y httpd
vim /var/www/html/index.html
页面走丢了
vim /etc/httpd/conf/httpd.conf #修改端口
Listen 8080
systemctl start httpd
使用主机172.25.65.250进行测试,测试结果为该主机禁止访问该状态信息页面,页面重定向为server1中httpd下的默认发布页面
http://172.25.65.1/admin/stats
七、haproxy的动静分离
server1中操作
将之前的名单设置修改(acl blacklist src 172.25.65.250),只需要将ip改为其他的
vim /etc/haproxy/haproxy.cfg
acl blacklist src 172.25.65.100
use_backend dynamic if { path_end .php }
default_backend static
backend dynamic
balance roundrobin
server web1 172.25.65.2:80 check
backend static
balance roundrobin
server web2 172.25.65.3:80 check
systemctl restart haproxy.service
server2
yum install -y php
vim /var/www/html/index.php
<?php
phpinfo()
?>
systemctl restart httpd
server3
vim /var/www/html/index.php
this is server3
systemctl restart httpd
测试机进行测试
http://172.25.65.1/index.php #访问server2动态页面
http://172.25.65.1 #访问server3静态页面
访问动态页面
访问静态页面
八、haproxy的读写分离
server1中进行设置
vim /etc/haproxy/haproxy.cfg
acl read method HEAD
acl read method GET
acl write method POST
acl write method PUT
use_backend dynamic if write
use_backend static if read
default_backend static
systemctl restart haproxy.service
server2和server3中同时操作
其中upload中的文件是用来测试读写分离的
cd /var/www/html
chmod 777 upload
rm -fr index.php
mv upload/* /var/www/html
下载之前写好的测试页面,添加权限后,对index.php文件中的文件名进行修改,以便于区分,在upload_file.php中将最大文件大小调大,设置步骤一致,这里以server2为例
测试机中进行测试
http://172.25.31.1/index.php #读server3的页面
通过访问,我们看到的server3中的页面(读),上传文件后,是server2(写操作),可以再server2中的/var/www/html/upload中看到上传的图片,提交后的页面链接变为 http://172.25.31.1/upload_file.php
我们通过server3进行读,上传文件属于写过程,则上传的文件会出现在server2中