server1:搭载varnish服务
server2:搭载http服务
server3:搭载http服务
station(宿主机):客户端
一个varnish服务的完整过程
首先在server2主机上发布一个http服务,内容为www.vaon.com 然后将server1主机配置成为一个varnish缓存服务器,server1可以自动从server2上取http服务的数据。然后宿主机(客户端)访问server1就可以看到server1里面缓存的内容了,相当于间接看到了server2主机http服务里面的内容
server1(172.25.254.11):
1.下载varnish安装包(3.0.5版本)
链接:https://pan.baidu.com/s/1caio96T6hCEuYFt7P04-RQ
提取码:ed4d
2.使用yum安装可以自动解决依赖性
yum localinstall -y varnish-3.0.5-1.el6.x86_64.rpm varnish-libs-3.0.5-1.el6.x86_64.rpm
安装过程会自动创建varnish用户(varnish:x:498:499:Varnish Cache:/var/lib/varnish:/sbin/nologin)
3.修改配置文件
vim /etc/sysconfig/varnish
#将监听端口改为80
66 VARNISH_LISTEN_PORT=80
vim /etc/varnish/default.vcl
#将这里的ip改为发布服务的主机ip(server2),端口号为发布的服务所属的端口号
7 backend default { 8 .host = "172.25.254.12"; 9 .port = "80"; 10 }
在server2(172.25.254.12)主机上发布一个http服务(使用默认配置即可),在/var/www/html/index.html里写上<h1>www.vaon.com</h1>
4.开启服务
/etc/init.d/varnish start
测试:
将宿主机器(172.25.254.10)作为客户端,访问服务
1).在宿主机上做本地解析
[root@station ~]# vim /etc/hosts
172.25.254.11 server1 www.vaon.org
2).访问网址:www.vaon.org
查看缓存命中情况
[root@server1 ~]# vim /etc/varnish/default.vcl
12 sub vcl_deliver { 13 if (obj.hits > 0) { 14 set resp.http.X-Cache = "HIT from vaon cache"; 15 } 16 else { 17 set resp.http.X-Cache = "MISS from vaon cache"; 18 } 19 return (deliver); 20 }
[root@server1 ~]# /etc/init.d/varnish reload
测试:
[root@station ~]# curl -I www.vaon.org
HTTP/1.1 200 OK
Server: Apache/2.2.15 (Red Hat)
Last-Modified: Sat, 20 Jan 2018 15:53:07 GMT
ETag: "2021b-16-56337316d9e9c"
Content-Type: text/html; charset=UTF-8
Content-Length: 22
Accept-Ranges: bytes
Date: Sat, 20 Jan 2018 16:17:40 GMT
X-Varnish: 1519431570
Age: 0
Via: 1.1 varnish
Connection: keep-alive
X-Cache: MISS from vaon cache #未命中
[root@station ~]# curl -I www.vaon.org
HTTP/1.1 200 OK
Server: Apache/2.2.15 (Red Hat)
Last-Modified: Sat, 20 Jan 2018 15:53:07 GMT
ETag: "2021b-16-56337316d9e9c"
Content-Type: text/html; charset=UTF-8
Content-Length: 22
Accept-Ranges: bytes
Date: Sat, 20 Jan 2018 16:17:42 GMT
X-Varnish: 1519431571 1519431570
Age: 2
Via: 1.1 varnish
Connection: keep-alive
X-Cache: HIT from vaon cache #命中
#每过一秒,Age加1,到120秒为一个轮回,在0秒的时候X-Cacheh会出现miss,然后server1会再次从server2主机取网页缓存,并且Age从1开始重新计时。这个秒数取决于/etc/sysconfig/varnish文件里的95行VARNISH_TTL=120等于多少就缓存多少秒
#varnishadm ban.url .*$ #可以清除所有缓存,使Age从0重新开始
通过 varnishadm 手动清除缓存方法:
varnishadm ban.url .*$
#清除所有
varnishadm ban.url /index.html
#清除 index.html 页面缓存
varnishadm ban.url /admin/$
#清除 admin 目录缓存
增加一台http服务器
在server3(172.25.254.13)主机上搭建一个http服务,/var/www/html/index.html内容为<h1>bbs.vaon.com</h1>
修改配置文件:
[root@server1 ~]# vim /etc/varnish/default.vcl
backend web1 { .host = "172.25.254.12"; .port = "80"; } backend web2 { .host = "172.25.254.13"; .port = "80"; } sub vcl_recv { if (req.http.host ~ "^(www.)?vaon.org") { #表示用户输入网址时只识别vaon.org结尾的域名,(www)表示可要可不要 set req.http.host = "www.vaon.org"; set req.backend = web1; #表示访问www.vaon.org实际调用web1函数 } elsif (req.http.host ~ "^bbs.vaon.org") { set req.backend = web2; } else {error 404 "vaon cache"; #如果用户输入的网址也不是bbs.vaon.org的话就输出404错误 } }
[root@server1 ~]# /etc/init.d/varnish reload
客户端增加hosts本地解析
[root@station ~]# vim /etc/hosts
172.25.254.11 server1 www.vaon.org bbs.vaon.org
负载均衡
在server3上增加一个虚拟主机,并发布一个和server1一样的http网页
[root@server3 ~]# vim /etc/httpd/conf/httpd.conf
#在990行打开这个注释
NameVirtualHost *:80
#在末尾增加如下配置
<VirtualHost *:80>
DocumentRoot /var/www/html
ServerName bbs.vaon.org
</VirtualHost>
<VirtualHost *:80>
DocumentRoot /www
ServerName www.vaon.org
</VirtualHost>
[root@server3 ~]# mkdir /www
[root@server3 ~]# vim /www/index.html
#写上和server1一样的内容,再加一条--from server3作为标记,后面做测试比较方便识别
<h1>www.vaon.com--from server3</h1>
[root@server3 ~]# /etc/init.d/httpd restart
server1:
[root@server1 ~]# vim /etc/varnish/default.vcl
backend web1 {
.host = "172.25.254.12";
.port = "80";
}
backend web2 {
.host = "172.25.254.13";
.port = "80";
}
director lb round-robin {
{ .backend = web1; }
{ .backend = web2; }
}
sub vcl_recv {
if (req.http.host ~ "^(www.)?vaon.org") {
set req.http.host = "www.vaon.org";
set req.backend = lb; #访问vaon.org时候lb去均衡调度web1和web2
return (pass);
#加上pass这一条只是为了方便测试,可以不进行缓存,不用等120秒才能轮叫(负载均衡)一次。但是不缓存就相当于varnish失去了它的价值,正常情况下没有这一行。
} elsif (req.http.host ~ "^bbs.vaon.org") {
set req.backend = web2;
} else {error 404 "vaon cache";
}
}
[root@server1 ~]# /etc/init.d/varnish reload
测试:两个页面每刷新一次就换着出现一次
cdn推送
为了节省资源,将cdn推送软件安装到varnish服务器上(server1),实际环境可以安装到一台新主机上。
推送的本质就是执行一条清除缓存的命令将varnish服务器中的缓存清除。
1.安装http,用来发布cdn推送软件(cdn推送软件本身是php写的,需要发布到web上去使用)
[root@server1 ~]# yum install httpd -y
[root@server1 ~]# vim /etc/httpd/conf/httpd.conf
Listen 8080 #为了不与varnish服务的80端口冲突,将http的端口改为8080
[root@server1 ~]# /etc/init.d/httpd start
2.下载软件
链接:https://pan.baidu.com/s/18xSgL6ObDCoqIu3aHeiUBg
提取码:i65w
3.安装
由于是zip包,安装unzip解压工具:
[root@server1 mnt]# yum install unzip -y
[root@server1 mnt]# unzip -x bansys.zip
将解压出的文件放到http默认发布目录下:
[root@server1 mnt]# cd bansys
[root@server1 bansys]# mv * /var/www/html/
bansys包需要php支持:
[root@server1 bansys]# yum install php -y
修改bansys配置文件:
[root@server1 bansys]# cd /var/www/html/
[root@server1 html]# vim config.php #修改保留下面的内容,其余删除
<?php //varnish主机列表 //可定义多个主机列表 $var_group1 = array( 'host' => array('172.25.254.11'), 'port' => '80', ); //varnish群组定义 //对主机列表进行绑定 $VAR_CLUSTER = array( 'www.vaon.org' => $var_group1, ); //varnish版本 //2.x和3.x推送命令不一样 $VAR_VERSION = "3"; ?>
在varnish服务里做一些限制,只让特定的用户可以推送,提高安全性:
[root@server1 html]# vim /etc/varnish/default.vcl #增加黄色部分
acl vaon {
"127.0.0.1";
"172.25.254.0"/24;
}
#将本地和172.25.254网段加入vaon列表
backend web1 {
.host = "172.25.254.12";
.port = "80";
}
backend web2 {
.host = "172.25.254.13";
.port = "80";
}
director lb round-robin {
{ .backend = web1; }
{ .backend = web2; }
}
sub vcl_recv {
if (req.request == "BAN") {
if (!client.ip ~ vaon) { #表示如果主机不在vaon列表中就返回405错误
error 405 "Not allowed.";
}
ban("req.url ~ " + req.url);
error 200 "ban added";
}
if (req.http.host ~ "^(www.)?vaon.org") {
set req.http.host = "www.vaon.org";
set req.backend = lb;
#return (pass); #记得这个一定要注释了,上一个实验只是为了实验效果,varnish运行是不能有这个配置的
} elsif (req.http.host ~ "^bbs.vaon.org") {
set req.backend = web2;
} else {error 404 "vaon cache";
}
}
sub vcl_deliver {
if (obj.hits > 0) {
set resp.http.X-Cache = "HIT from vaon cache";
}
else {
set resp.http.X-Cache = "MISS from vaon cache";
}
return (deliver);
}
4.测试
先查看一下客户端访问www.vaon.org的结果:
[vaon@station ~]$ curl www.vaon.org
<h1>www.vaon.com</h1>
#可见是server2的http发布内容
访问bansys软件:
确认提交 :
客户端查看现在访问www.vaon.org返回的页面:
[vaon@station ~]$ curl www.vaon.org
<h1>www.vaon.com--from server3</h1>
#可见推送成功,缓存已经被清空了,现在访问的是server3的http中的内容。