一、varinish简介
Varnish是一款高性能的开源HTTP加速器,他的作者Poul-Henning Kamp是FreeBSD的内核开发者之一。挪威最大的在线报纸 Verdens Gang 使用3台Varnish代替了原来的12台Squid,性能比以前更好。
Varnish与一般服务器软件类似,就是一个web缓存代理服务器,分为master(management)进程和child(worker,主要做cache的工作)进程。master进程读入命令,进行一些初始化,然后fork并监控child进程。child进程分配若干线程进行工作,主要包括一些管理线程和很多woker线程。
Management进程主要实现应用新的配置、编译VCL、监控varnish、初始化varnish以及提供一个命令行接口等。 Management进程会每隔几秒钟探测一下Child进程以判断其是否正常运行,如果在指定的时长内未得到Child进程的回 应,Management将会重启此Child进程。
Child进程包含多种类型的线程,常见的如:
Acceptor线程:接收新的连接请求并响应;
Worker线程:child进程会为每个会话启动一个worker线程,因此,在高并发的场景中可能会出现数百个worker线程甚至更多;
Expiry线程:从缓存中清理过期内容;
Varnish依赖“工作区(workspace)”以降低线程在申请或修改内存时出现竞争的可能性。在varnish内部有多种不同的工作区,其中最关键的当属用于管理会话数据的session工作区。
二、VCL简介
Varnish Configuration Language (VCL)是varnish配置缓存策略的工具,它是一种基于“域”(domain specific)的简单编程语言,它支持有限的算术运算和逻辑运算操作、允许使用正则表达式进行字符串匹配、允许用户使用set自定义变量、支持if判 断语句,也有内置的函数和变量等。使用VCL编写的缓存策略通常保存至.vcl文件中,其需要编译成二进制的格式后才能由varnish调用。
VCL处理过程大致分为如下几个步骤:
(1)Receive 状态,也就是请求处理的入口状态,根据 VCL 规则判断该请求应该是 Pass 或
Pipe,或者进入 Lookup(本地查询)。
(2)Lookup 状态,进入此状态后,会在 hash 表中查找数据,若找到,则进入 Hit 状态,否则进
入 miss 状态。
(3)Pass 状态,在此状态下,会进入后端请求,即进入 fetch 状态。
(4)Fetch 状态,在 Fetch 状态下,对请求进行后端的获取,发送请求,获得数据,并进行本地
的存储。
(5)Deliver 状态, 将获取到的数据发送给客户端,然后完成本次请求。
三、varnish的安装
1、server1中:
1.安装varnish
yum install varnish-3.0.5-1.el6.x86_64.rpm varnish-libs-3.0.5-1.el6.x86_64.rpm -y
2.更改varnish全局配置
vim /etc/sysconfig/varnish
VARNISH_LISTEN_PORT=80 #更改varnish服务端口为80
3.更改varnish配置文件
vim /etc/varnish/default.vcl
backend default { #配置一个后端服务器
.host = "172.25.4.2"; #更改访问IP为172.25.4.2
.port = "80";
}
4.重新加载服务
/etc/init.d/varnish reload
2、server2中:
1.安装apache
yum install httpd -y
/etc/init.d/httpd start
2.制作index.html
cd /var/www/html
vim index.html
server2
3.重新加载服务
/etc/init.d/httpd reload
3、测试:
物理机中打开firefox,访问172.25.4.1,看到server2即配置成功
四、测试缓存命中情况
1、server1中:
1.更改配置文件
vim /etc/varnish/default.vcl
添加
sub vcl_deliver { #查看缓存命中情况
if (obj.hits > 0) {
set resp.http.X-Cache = "HIT from westos cache";
}
else {
set resp.http.X-Cache = "MISS from westos cache";
}
return (deliver);
}
2.重新加载服务
/etc/init.d/varnish reload
2、测试:
物理机中:
curl -I 172.25.4.1 第一次显示 MISS from westos cache 缓存中没有,前往后端获取
curl -I 172.25.4.1 第二次显示 HIT from westos cache 缓存中直接获取
3、通过 varnishadm 手动清除缓存
varnishadm ban.url .*$ #清除所有缓存
varnishadm ban.url /index.html #清除 index.html 页面缓存
varnishadm ban.url /admin/$ #清除 admin 目录缓存
测试:
1.测试清除所有缓存
物理机中curl -I 172.25.4.1两次,使172.25.4.1缓存到cache中
server1中执行 varnishadm ban.url .*$ 清除所有缓存
物理机中curl -I 172.25.4.1 ,发现显示MISS from westos cache
2.测试清除 index.html 页面缓存
物理机中curl -I 172.25.4.1/index.html两次,使172.25.4.1/index.html缓存到cache中
server1中执行 varnishadm ban.url /index.html 清除 index.html 页面缓存
物理机中curl -I 172.25.4.1/index.html 发现显示MISS from westos cache
注意:
此时如果cache中有172.25.4.1的缓存信息,使用curl -I 172.25.4.1访问时会显示HIT from westos cache,这是因为虽然curl -I 172.25.4.1
和curl -I 172.25.4.1/index.html访问得到的结果一致,但是缓存到cache中的地址不同。cache缓存的是用户访问的url
拓展:
curl -I 172.25.4.1访问的结果中Age表示缓存时间,默认为120s后自动清除,可在/etc/sysconfig/varnish中修改
五、定义多个不同域名站点的后端服务器
1、server3中:
1.安装acpache
yum install httpd -y
/etc/init.d/httpd start
2.制作index.html
cd /var/www/html
vim index.html
www.linux.org
3.重新加载服务
/etc/init.d/httpd reload
2、server2中:
1.更改index.html
cd /var/www/html
vim index.html
www.westos.org
2.重新加载服务
/etc/init.d/httpd reload
3、物理机中:
1.添加本地解析
vim /etc/hosts
172.25.4.1 www.westos.org www.linux.org westos.org
4、server1中:
1.更改配置文件
vim /etc/varnish/default.vcl
backend web1 {
.host = "172.25.4.2";
.port = "80";
}
backend web2 {
.host = "172.25.4.3";
.port = "80";
}
#当访问 westos.org 域名时,自动访问 www.westos.org 域名
#当访问 www.westos.org 域名时从 web1 上取数据,访问 www.linux.org 域名时到 web2 取数据,访问其他页面报错
sub vcl_recv {
if (req.http.host ~ "^(www.)westos.org") {
set req.http.host = "www.westos.org";
set req.backend = web1;
} elsif (req.http.host ~ "^www.linux.org") {
set req.backend = web2;
} else {error 404 "westos cache";
}
}
2.重新加载服务
/etc/init.d/varnish reload
5、测试:
物理机中:
curl www.westos.org
curl westos.org
发现两者得到的结果相同,均为server2中相应的index.html文件内容
curl www.linux.org
得到server3中相应的index.html文件内容
六、定义负载均衡
1、server3中:
1.更改apache配置文件
vim /etc/httpd/conf/httpd.conf
打开
NameVirtualHost *:80
添加
DocumentRoot /var/www/html
ServerName www.linux.org
DocumentRoot /www1
ServerName www.westos.org
2.建立/www1/index.html
mkdir /www1
vim /www1/index.html
www.westos.org-server3
3.重新加载服务
/etc/init.d/httpd reload
4.配置本地解析
vim /etc/hosts
172.25.4.3 server3 www.westos.org www.linux.org
5.测试配置是否生效
curl www.linux.org
curl www.westos.org
得到相应的index.html文件中的内容
2、server1中:
1.更改varnish配置
vim /etc/varnish/default.vcl
#把多个后端聚合为一个组,并检测后端健康状况
director lb round-robin {
{ .backend = web1; }
{ .backend = web2; }
}
sub vcl_recv {
if (req.http.host ~ "^(www.)westos.org") {
set req.http.host = "www.westos.org";
set req.backend = lb;
} elsif (req.http.host ~ "^www.linux.org") {
set req.backend = web2;
} else {error 404 "westos cache";
}
}
2.重新加载配置
/etc/init.d/varnish reload
3、测试:
1.物理机中:
curl www.westos.org 得到server2中相应的index.html文件内容
2.server1中:
varnishadm ban.url .*$ 清除所有缓存
3.物理机中:
curl www.westos.org 得到server3中相应的index.html文件内容
注意:
还可以更改server1中varnish配置文件,添加return (pass); 使得varnish缓存功能失效,客户端直接去后端抓取内容,可以获得更好的
测试对比效果
4、server1中:
1.更改varnish配置
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 = lb;
return (pass); #varnish缓存功能失效,客户端直接去后端抓取内容
} elsif (req.http.host ~ "^www.linux.org") {
set req.backend = web2;
} else {error 404 "westos cache";
}
}
2.重新加载配置
/etc/init.d/varnish reload
5、测试:
物理机中:
curl www.westos.org
curl www.westos.org
curl www.westos.org
curl www.westos.org
发现循环得到server2和server3相应的index.html内容
此时若server2的httpd服务关闭curl会一直读取server3相应的index.html内容而不会报错,这是因为varnish拥有自动的健康检查功能,
若开启server2的httpd服务,使用curl又能够循环读取到server2和server3相应的index.html内容
server2中:
/etc/init.d/httpd stop
物理机中:
curl www.westos.org
curl www.westos.org
发现一直得到server3相应的index.html内容
server2中:
/etc/init.d/httpd start
物理机中:
curl www.westos.org
curl www.westos.org
curl www.westos.org
curl www.westos.org
发现循环得到server2和server3相应的index.html内容
七、varnish全局配置文件中的参数
1、NFILES #所能够打开的最大文件数
server1中:
1.查看内核允许的打开文件数的最大值
sysctl -a | grep file
2.更改varnish配置文件
vim /etc/sysconfig/varnish
更改NFILES数值,小于内核允许最大值
NFILES=66655
3.更改系统限制文件
vim /etc/security/limits.conf
varnish nofile 66656
2、MEMLOCK #用多大内存空间保存日志信息
server1中:
1.更改varnish用户为可交互登陆模式,切换到varnish用户
usermod -s /bin/bash varnish
su – varnish
2.查看系统允许的最大值
ulimit -l
*拓展:
ulimit -a #查看所有系统限制
3.更改系统限制文件
logout
vim /etc/security/limits.conf
varnish memlock 82000
3、NPROCS #进程核心转储所使用的内存空间,unlimited表示无上限
server1中:
1.切换到varnish用户
su – varnish
2.查看系统允许的最大值
ulimit -u
3.更改系统限制文件
logout
vim /etc/security/limits.conf
varnish nproc unlimited
4.还原varnish用户登陆设置
usermod -s /sbin/nologin varnish
注意:/etc/security/limits.conf 与 /etc/sysconfig/varnish 配置文件均是即改即生效
拓展:
VARNISH_TTL=120 #联系后端服务器的超时时间
VARNISH_STORAGE_SIZE=1G #储存的文件的大小
VARNISH_STORAGE_FILE=/var/lib/varnish/varnish_storage.bin #基于文件存储时的文件路径
varnish与squid的区别
varnish和squid在中小规模的应用上,varnish足够轻量级,足够好用,但是在巨大的并发请求来说,单个varnish所能够承载的并发 访问量大概在5000个连接请求左右,超出5000个可能就就得不稳定了;而在这里squid就能表现出良好的性能了,并且squid拥有邻居功能,因此在大规模的企业级应用中仍然是以squid居多,而在中小规模的自己公司的反向代理缓存中varnish居多
8、CDN推送平台
1、server1:
1.安装apache服务
yum install httpd -y
2.更改apache服务配置
避免与varnish服务端口冲突
vim /etc/httpd/conf/httpd.conf
Listen 8080
3.下载bansys.zip包,安装解压缩命令
yum install unzip -y
unzip bansys.zip -d /var/www/html
4.将解压出来的目录中的文件移动至/var/www/html
cd /var/www/html
cd bansys/
mv * ..
5.安装php服务
yum install php -y
6.开启apache服务
/etc/init.d/httpd start
7.更改php服务配置文件
cd /var/www/html
vim config.php
删除其余内容,保留内容如下:
//varnish主机列表
//可定义多个主机列表
$var_group1 = array(
'host' => array('172.25.4.1'),
'port' => '80',
);
//varnish群组定义
//对主机列表进行绑定
$VAR_CLUSTER = array(
'www.westos.org' => $var_group1,
);
//varnish版本
//2.x和3.x推送命令不一样
$VAR_VERSION = "3";
>
注意:
bansys 有两种工作模式,分别是:telnet 和 http 模式。
telnet 模式需要关闭 varnish 服务管理端口的验证,注释掉/etc/sysconfig/varnish 文件中的
“ -S ${VARNISH_SECRET_FILE}”这行,重启 varnish 服务即可
如果是 http 模式需要对 varnish 做以下设置(本次试验采用http模式推送)
8.更改varnish配置文件
vim /etc/varnish/default.vcl
#设置访问控制
acl westos {
"127.0.0.1";
"172.25.4.0"/24;
}
在sub vcl_recv {} 中添加
if (req.request == "BAN") {
if (!client.ip ~ westos) {
error 405 "Not allowed.";
}
ban("req.url ~ " + req.url);
error 200 "ban added";
}
删除 return (pass);
9.重新加载varnish服务
/etc/init.d/varnish reload
2、测试:
物理机中:
用firefox访问www.westos.org
打开另外一个网页,用firefox访问 172.25.4.1:8080
推送模式:HTTP
CDN群组:www.westos.org
推送内容:
/index.html #文件
/images/* #目录
本次试验推送文件 /index.html
推送一次,再访问172.25.4.1:8080一次,发现循环读取到server2和server3相应的index.html内容