varnish负载均衡功能的实现
系统环境
将真机(172.25.21.250)客户端
server1(172.25.21.1)varnish缓存代理服务器,
将server2(172.25.21.2)web后端服务器
server3(172.25.21.3)web后端服务器
实验目的
假如server2比较忙
server3的请求又比较少,
所以我们让server3帮server2来分担一点
Server3可以同时处理两个域名的请求,
一个iP对应两个域名请求:
我们就得server3配置apache的虚拟主机
在server3中
[root@server2 html]# cd /www/
[root@server2 www]# cat index.html
www-server2
[root@server3 html]# vim /etc/httpd/conf.d/vhost.conf
[root@server3 www]# cat /etc/httpd/conf.d/vhost.conf
<VirtualHost *:80>
DocumentRoot /www
ServerName www.westos.org
</VirtualHost>
<Directory "/www">
Require all granted
</Directory>
<VirtualHost *:80>
DocumentRoot /bbs
ServerName bbs.westos.org
</VirtualHost>
<Directory "/bbs">
Require all granted
</Directory>
[root@server3 html]# mkdir /www
[root@server3 html]# mkdir /bbs
[root@server3 html]# cd /www/
[root@server3 www]# cat index.html
www-server3
[root@server3 www]# cat /bbs/index.html
bbs-server3
[root@server3 www]# systemctl restart httpd
后端服务器实现负载均衡(轮询)
修改varnish配置文件修改轮叙模
给varnish配置文件vcl 4.1底下添加导入负载均衡模块
[root@server1 ~]# vim /etc/varnish/default.vcl
vcl 4.1;
import directors from "/usr/lib64/varnish/vmods/libvmod_directors.so";
backend web1 {
.host = "172.25.21.2";
.port = "80";
}
backend web2 {
.host = "172.25.21.3";
.port = "80";
}
sub vcl_init {
new lb = directors.round_robin();
lb.add_backend(web1);
lb.add_backend(web2);
}
sub vcl_recv {
……
if (req.http.host ~ "^(www.)?westos.org") {
set req.http.host = "www.westos.org";
set req.backend_hint = lb.backend();
}
elsif (req.http.host ~ "^bbs.westos.org") {
set req.backend_hint = web2;
}else {
return (synth(405));
}
}
注意:括号{}需对应,每句代码后都有分号;
若varnish服务重启失败,可通过查看/var/log/messages日志排错,
错误多为括号不对应或缺少分号
配置解释
if (req.http.host ~ “^(www.)?westos.org”)
#如果客户端请求www.westos.org
set req.http.host = “www.westos.org”;
set req.backend_hint = lb.backend();
#设置服务由server2和server3轮询提供
elsif (req.http.host ~ “^bbs.westos.org”)
#如果客户端请求bbs.westos.org
set req.backend_hint = web2;
#设置提供服务的是server3
return (synth(405));
#错误返回值
重启varnish服务
[root@server1 ~]# systemctl restart varnish
给真机添加解析
[root@foundation21 kiosk]# vim /etc/hosts
172.25.21.1 www.huige.org bbs.huige.org
负载均衡测试
[root@foundation21 kiosk]# curl www.westos.org
www-server2
[root@foundation21 kiosk]# curl www.westos.org
www-server2
[root@foundation21 kiosk]# curl www.westos.org
www-server2
……
代理服务器server1访问后端服务器
返回server2页面后并没有出现轮询,
原因是varnish服务器缓存了server2的数据信息
需要清除缓存信息
手动清除缓存信息
[root@server1 ~]# varnishadm ban req.url "~" /
再次测试
手动在varnish清空缓存,然后在客户端时访问,
才会轮询
[root@foundation21 kiosk]# curl www.westos.org
www-server2
[root@foundation21 kiosk]# curl www.westos.org
www-server3
varnish负载均衡优化(自动清理varnish)
要不断手动清理varnish服务器的缓存
才能实现后端服务器的轮询,
我们做以下改进
return(pass); #varnish代理缓存服务器不缓存服务器后端资源
修改varnish配置,增加参数
[root@server1 ~]# vim /etc/varnish/default.vcl
……
sub vcl_recv {
……
if (req.http.host ~ "^(www.)?westos.org") {
set req.http.host = "www.westos.org";
set req.backend_hint = lb.backend();
return(pass);
}
elsif (req.http.host ~ "^bbs.westos.org") {
set req.backend_hint = web2;
}else {
return (synth(405));
}
}
清除缓存信息
[root@server1 ~]# varnishadm ban req.url "~" /
重启varnish服务
[root@server1 ~]# systemctl restart varnish
再次测试
[root@foundation21 kiosk]# curl www.westos.org
www-server2
[root@foundation21 kiosk]# curl www.westos.org
www-server3
[root@foundation21 kiosk]# curl www.westos.org
www-server2
[root@foundation21 kiosk]# curl www.westos.org
www-server3
[root@foundation21 kiosk]# curl bbs.westos.org
www-server3
[root@foundation21 kiosk]# curl bbs.westos.org
www-server3
[root@foundation21 kiosk]# curl bbs.westos.org
www-server3
[root@foundation21 kiosk]# curl bbs.westos.org
www-server3
测试成功:
加入return(pass);
varnish自动清理缓存