Varnish是一款高性能的开源http加速器,现在计算机系统的内存除了主存外,还包括了CPU内的L1、L2,甚至有L3快取。硬盘上也有自己的快取装置,因此Squid Cache自行处理物件替换的架构不可能得知这些情况而做到最佳化,但操作系统可以得知这些情况,所以这部份的工作应该交给操作系统处理,这就是 Varnish cache设计架构,下面就varnish的相关功能实现做个总结
下载地址:http ://repo.varnish-cache.org 目前最新版本为5.2.0:
本次测试用的是varnish-3.0.5-1版本的rpm包:
直接yum安装即可:
yum install varnish-3.0.5-1.el6.x86_64.rpm varnish-libs-3.0.5-1.el6.x86_64.rpm -y
安装好以后在/etc/varnish/目录下会自动生成varnish主配置文件和密钥,varnish全局配置文件路径为:/etc/sysconfig/varnish
[root@server1 varnish]# ls
default.vcl secret #default.vcl 为varnish主配置文件,secret为密钥
[root@server1 varnish]#
至此vaenish的安装就完成了
环境搭建:
server1:172.25.7.1 #安装varnish
server2:172.25.7.2 #安装httpd
1.编辑varnish主配置文件: vim /etc/varnish/default.vcl
7 backend default {
8 .host = "172.25.7.2"; #意为当客户端访问本机时,本机到ip为172.25.7.2主机去取数据
9 .port = "80"; #端口为80,即httpd服务端口
10 }
vim /etc/sysconfig/varnish #编辑varnish全局配置文件,将默认6081端口修改为80端口,即当客户端访问本机80端口时,本机到172.25.7.2的80端口去找:
VARNISH_LISTEN_PORT=80 #将文件中此处默认的6081端口修改为80
如不修改默认端口,客户端在访问时,在ip后加上默认端口也行,即:
curl 172.25.7.1:6081
/etc/init.d/varnish start #启动varnish服务
2.在172.25.7.2主机的安装httpd,
yum install httpd -y
并在默认发布目录下新建并编辑测试页:
vim /var/www/html/index.html
<h1>www.hc.com-server2h1>
/etc/init.d/httpd start #启动httpd服务
3.测试:
在客户端访问安装了varnish的主机ip,这里直接在客户机终端进行访问:
[root@hguan07 ~]# curl 172.25.7.1 #修改端口后访问方式
www.hc.com-server2
未修改varnish默认端口访问方式:
[root@hguan07 ~]# curl 172.25.7.1:6081
www.hc.com-server2
反向代理测试成功,但如果服务端(172.25.7.2)修改了测试页中的内容,客户端访问的内容并不会第一时间改变,这是因为varnish主机中缓存没有过期,为了第一时间让客户端访问到服务端更新后的内容,需要做cdn推送,这里用varnishadm ban.url .*$命令来手动清除缓存,然后客户端再访问的时候,就可以看到服务端更新后的内容:
清除缓存测试:
首先将172.25.7.2主机中的httpd测试页内容做如下修改:
<h1>www.hc.com-server2h1>
<h1>www.hc.com-server2h1>
查看客户端访问效果:
[root@hguan07 ~]# curl 172.25.7.1 #依然访问的是之前的页面,因为缓存还没有用完
www.hc.com-server2
[root@hguan07 ~]# curl 172.25.7.1
www.hc.com-server2
[root@hguan07 ~]# curl 172.25.7.1
www.hc.com-server2
在安装了varnish的172.25.7.1主机手动清除缓存:
[root@server1 ~]# varnishadm ban.url .*$
客户端再次访问效果:
[root@hguan07 ~]# curl 172.25.7.1
www.hc.com-server2
www.hc.com-server2
[root@hguan07 ~]# curl 172.25.7.1
www.hc.com-server2
www.hc.com-server2
在这个过程中,客户端只和安装了varnish的主机进行交互,而实际访问的内容则是在(172.25.7.2)上
varnish的主机就是做了代理的服务,当客户端访问时,先查看缓存(cache)中是否有数据,如果没有,就去后端服务器中取,如果有,就直接反馈给客户端,这样比客户端直接访问服务器速度更快,而且也减轻了后端服务器的压力
增加一台主机server3:
server3:172.25.7.3 #安装httpd
1.同样是编辑varnish主配置文件: vim /etc/varnish/default.vcl
backend server2 {
.host = "172.25.7.2"; #定义一个后端服务器地址和端口
.port = "80";
}
backend server3 {
.host = "172.25.7.3"; #定义另一个后端服务器地址和端口
.port = "80";
}
sub vcl_recv {
if (req.http.host ~ "^(www.)?hc.com") { #客户端访问www.hc.com到server2去取,看到的是server2主机上的内容
set req.http.host = "www.hc.com";
set req.backend = server2;
} elsif (req.http.host ~ "^bbs.hc.com") { #客户端访问bbs.hc.com时到server3去取
set req.backend = server3;
} else {
error 404 "hc cache";
} #客户端访问其他时直接报错
}
[root@server1 ~]# /etc/init.d/varnish restart #重启varnish
Stopping Varnish Cache: [ OK ]
Starting Varnish Cache: [ OK ]
2.在server3主机下载httpd:
yum install httpd -y
新建并编辑默认发布文件测试页:vim /var/www/html/index.html
<h1>www.hc.com-server3h1>
[root@server3 ~]# /etc/init.d/httpd start #启动httpd
3.在客户端做本地解析,因为没有做DNS,所以需要做本地解析:
vim /etc/hosts #本地解析文件
172.25.7.1 server1 www.hc.com bbs.hc.com
测试:
在客户端进行访问,测试也是在终端进行:
[root@hguan07 ~]# curl www.hc.com
www.hc.com-server2
www.hc.com-server2
[root@hguan07 ~]# curl bbs.hc.com
www.hc.com-server3
1.编辑配置文件: vim /etc/varnish/default.vcl
director lb round-robin { #负载均衡方式为轮询
{ .backend = server2; }
{ .backend = server3; }
}
sub vcl_recv {
if (req.http.host ~ "^(www.)?hc.com") {
set req.http.host = "www.hc.com";
set req.backend = lb;
return (pass); #为了测试方便,不进行缓存
}
elsif (req.http.host ~ "^bbs.hc.com") {
set req.backend = server3;
}
else {
error 404 "hc cache";
}
}
刷新varnish:
[root@server1 ~]# /etc/init.d/varnish reload
Loading vcl from /etc/varnish/default.vcl
Current running config name is boot
Using new config name reload_2017-10-02T21:58:51
VCL compiled.
available 2 boot
active 0 reload_2017-10-02T21:58:51
Done
2.将server2上的测试页内容修改为以下,便于测试:
vim /var/www/html/index.html
<h1>www.hc.com-server2h1>
测试:
为了便于观察负载均衡情况,使用for循环语句:
[root@hguan07 ~]# for i in {1..6}; do curl www.hc.com ; done
www.hc.com-server2
www.hc.com-server3
www.hc.com-server2
www.hc.com-server3
www.hc.com-server2
www.hc.com-server3
负载均衡实现