一、Varnish简介
1、Varnish的作者Poul-Henning Kamp是FreeBSD的内核开发者之一,他认为现在的计算机比起1975年已经复杂许多。在1975年时,储存媒介只有两种:内存与硬盘。但现在计算机系统的内存除了主存外,还包括了CPU内的L1、L2,甚至有L3快取。硬盘上也有自己的快取装置,因此Squid Cache自行处理物件替换的架构不可能得知这些情况而做到最佳化,但操作系统可以得知这些情况,所以这部份的工作应该交给操作系统处理,这就是 Varnish cache设计架构。
2、varnish项目是2006年发布的第一个版本0.9.距今已经有十多年了,此文档之前也提过varnish还不稳定,那是2007年时候编写的,经过varnish开发团队和网友们的辛苦耕耘,现在的varnish已经很健壮。很多门户网站已经部署了varnish,并且反应都很好,甚至反应比squid还稳定,且效率更高,资源占用更少。相信在反向代理,web加速方面,varnish已经有足够能力代替squid。
二、Varnish安装
1、yum进行安装
本机操作系统:redhat6.5
网盘下载链接:https://pan.baidu.com/s/1AaxNGWDGE-axZNuqi1p_zQ 密码: kwcu
yum install -y varnish-3.0.5-1.el6.x86_64.rpm varnish-libs-3.0.5-1.el6.x86_64.rpm
2、配置limits.conf
虚拟机IP:10.10.10.1(服务器)
[root@server1 mnt]# ulimit -n ###ulimit用来限制系统用户对shell资源的访问,-n:文件打开的数量
1024
[root@server1 mnt]# sysctl -a |grep file
fs.file-nr = 448 0 98865
fs.file-max = 98865
vim /etc/security/limits.conf ###nofile打开的最多的文件数量,noproc最大进程数
varnish - nofile 65535
三、CDN缓存测试
1、配置varnish
vim /etc/sysconfig/varnish ###改变端口为80
# VARNISH_LISTEN_ADDRESS=
VARNISH_LISTEN_PORT=80
2、配置default.vcl
vim /etc/varnish/default.vcl
backend web1 {
.host = "10.10.10.2";
.port = "80";
}
sub vcl_deliver {
if (obj.hits > 0) {
set resp.http.X-Cache = "HIT cache";
}
else {
set resp.http.X-Cache = "MISS cache";
}
return(deliver);
}
3、测试
(1)server2:10.10.10.2中搭建httpd服务
echo server2 >/var/www/html/index.html
(2)真机中测试
curl -I 10.10.10.1
(3)第一次结果:
(4)第二次结果:
不难可以看出,当client访问服务器时,当第一次时由于没有缓存,所以访问server2(10.10.10.2),当二次访问时,直接访问的时server1(10.10.10.1)cache。
(5)可以在服务器手动清除缓存
varnishadm ban.url .*$ ###清除所有
varnishadm ban.url /index.html ###清除index.html页面缓存
varnishadm ban.url /dream/$ ###清除dream目录缓存
四、负载均衡
1、配置default.vcl
虚拟机IP:10.10.10.1(服务器)
vim /etc/varnish/default.vcl
backend web1 {
.host = "10.10.10.2";
.port = "80";
}
backend web2 {
.host = "10.10.10.3";
.port = "80";
}
director lb round-robin { ###轮询
{ .backend = web1; }
{ .backend = web2; }
}
sub vcl_recv {
if (req.http.host ~ "^(www.)?dream.com") {
set req.http.host = "www.dream.com";
set req.backend = lb;
return (pass); ###用于测试,不缓存
} elsif (req.http.host ~ "^bbs.dream.com") {
set req.backend = web2;
return (pass);
} else {
error 404 "dream cache";
}
}
/etc/init.d/varnish restart
2、配置httpd.conf
server3:10.10.10.3
vim /etc/httpd/conf/httpd.conf
990 NameVirtualHost *:80
1003 <VirtualHost *:80>
1004 DocumentRoot /www1
1005 ServerName www.dream.com
1006 </VirtualHost>
1007
1008 <VirtualHost *:80>
1009 DocumentRoot /www2
1010 ServerName bbs.dream.com
1011 </VirtualHost>
mkdir /www1
mkdir /www2
echo www1.www.dream.com >/www1/index.html
echo www2.bbs.dream.com >/www2/index.html
/etc/init.d/httpd restart
3、测试:
(1)真机加入host解析
vim /etc/hosts
10.10.10.1 www.dream.com bbs.dream.com
可以看出当我们访问www.dream.com时会发生轮询,而且可以访问bbs.dream.com形成域名匹配
五、varnish cdn 推送平台
1、安装推送平台
虚拟机IP:10.10.10.1(服务器)
yum install -y php httpd
unzip bansys.zip
mv bansys/* /var/www/html
2、配置config.php
vim /var/www/html/config.php
<?php
//varnish主机列表
//可定义多个主机列表
$var_group1 = array(
'host' => array('10.10.10.1'),
'port' => '80',
);
//varnish群组定义
//对主机列表进行绑定
$VAR_CLUSTER = array(
'www.dream.com' => $var_group1,
'bbs.dream.com' => $var_group1,
);
//varnish版本
//2.x和3.x推送命令不一样
$VAR_VERSION = "3";
?>
3、配置httpd.conf
vim /etc/httpd/conf/httpd.conf
#Listen 12.34.56.78:80
Listen 8080
vim /etc/varnish/default.vcl
acl dream {
"127.0.0.1";
"10.10.10.0"/24;
}
backend web1 {
.host = "10.10.10.2";
.port = "80";
}
backend web2 {
.host = "10.10.10.3";
.port = "80";
}
director lb round-robin {
{ .backend = web1; }
{ .backend = web2; }
}
sub vcl_recv {
if (req.request == "BAN") {
if (!client.ip ~ dream) {
error 405 "Not allowed.";
}
ban("req.url ~ " + req.url);
error 200 "ban added";
}
if (req.http.host ~ "^(www.)?dream.com") {
set req.http.host = "www.dream.com";
set req.backend = lb;
} elsif (req.http.host ~ "^bbs.dream.com") {
set req.backend = web2;
} else {
error 404 "dream cache";
}
}
sub vcl_deliver {
if (obj.hits > 0) {
set resp.http.X-Cache = "HIT cache";
}
else {
set resp.http.X-Cache = "MISS cache";
}
return(deliver);
}
/etc/init.d/varnish restart
/etc/init.d/httpd restart
4、测试
(1)浏览器登陆界面
http://10.10.10.1:8080
(2)界面操作
选择为http,在里面输入/index.html清除此页面缓存,/dream/:清除目录下缓存,.清除所有缓存