amorfait 2014-09-27
实验目的:
varnish利用实现对后端单双静态web服务器的缓存
varnish包的下载路径:http://repo.varnish-cache.org/redhat/varnish-3.0/el6 可以下载到varnish的rpm包
需要下载的有:
varnish-3.0.5-1.el6.x86_64
varnish-docs-3.0.5-1.el6.x86_64
varnish-libs-3.0.5-1.el6.x86_64
varnish的官网地址:https://www.varnish-cache.org/
实验环境:
web1:172.16.18.3 Nginx
web2:172.16.17.12 Nginx
varnish:172.16.18.1 Varnish
实验内容:
一,安装varnish包,配置web服务器
[root@node1~]# rpm -ql varnish
/etc/rc.d/init.d/varnish #varnish的启动程序
/etc/rc.d/init.d/varnishlog #日志
/etc/rc.d/init.d/varnishncsa #日志
/etc/sysconfig/varnish #配置文件,varnish定义自身属性
/etc/varnish #配置文件目录
/etc/varnish/default.vcl #默认配置文件,定义后端节点的
/usr/bin/varnish_reload_vcl #加载vcl,
/usr/bin/varnishadm #客户端程序
/usr/bin/varnishstat #状态监控
二,编辑配置文件
[root@node1 ~]# vim /etc/sysconfig/varnish
NFILES=131072
MEMLOCK=82000
NPROCS="unlimited"
RELOAD_VCL=1 #是否重载VCL文件
## Alternative 3, Advanced configuration
VARNISH_VCL_CONF=/etc/varnish/default.vcl #vcl文件路径
VARNISH_LISTEN_PORT=80 #varnish自己工作于那个端口。默认是6081
VARNISH_ADMIN_LISTEN_ADDRESS=127.0.0.1 #管理接口
VARNISH_ADMIN_LISTEN_PORT=6082 #管理接口监听端口
VARNISH_SECRET_FILE=/etc/varnish/secret #密钥文件
VARNISH_MIN_THREADS=50 #最少空闲线程
VARNISH_MAX_THREADS=1000 #最多启动线程
VARNISH_THREAD_TIMEOUT=120 #work超时时长
#VARNISH_STORAGE_FILE=/var/lib/varnish/varnish_storage.bin #存储文件
VARNISH_STORAGE_SIZE=64M #存储文件文件大小
#VARNISH_STORAGE="file,${VARNISH_STORAGE_FILE},${VARNISH_STORAGE_SIZE}" #存储方式file
VARNISH_STORAGE="malloc,${VARNISH_STORAGE_SIZE}" #基于内存方式
VARNISH_TTL=120
DAEMON_OPTS="-a ${VARNISH_LISTEN_ADDRESS}:${VARNISH_LISTEN_PORT} \
-f ${VARNISH_VCL_CONF} \
-T ${VARNISH_ADMIN_LISTEN_ADDRESS}:${VARNISH_ADMIN_LISTEN_PORT} \
-t ${VARNISH_TTL} \
-w ${VARNISH_MIN_THREADS},${VARNISH_MAX_THREADS},${VARNISH_THREAD_TIMEOUT} \
-u varnish -g varnish \
-S ${VARNISH_SECRET_FILE} \
-s ${VARNISH_STORAGE}"
[root@node1 ~]# vim /etc/varnish/default.vcl
backend default {
.host = "172.16.18.3";
.port = "80";
}
此时varnish就已经可以启动了。下来就是最重要的编写vcl文件。
------------------------------------------------------------
-----------------------------------------------------------------------------------
那么我们就应该熟悉这张表,每一个状态引擎所对应的变量
简单介绍一下vcl的语法
VCL的设计参考了C和Perl语言,因此,对有着C或Perl编程经验者来说,其非常易于理解。其基本语法说明如下:
(1)//、#或/* comment */用于注释
(2)sub $name 定义函数
(3)不支持循环,有内置变量
(4)使用终止语句,没有返回值
(5)域专用
(6)操作符:=(赋值)、==(等值比较)、~(模式匹配)、!(取反)、&&(逻辑与)、||(逻辑或)
编译vcl文件中状态引擎的顺序我们按照默认配置文件的顺序来,此顺序也符合请求处理的基本顺序,当然,为了配合实验也会有些改动。我们来看一张图,可以明确的明白请求的过程:
1,首先我们来编写vcl_recv段,
vcl_recv作为进入varnish对请求报文解码后第一个子例程,可以在此处做访问控制,是否查询缓存,以及无法识别的数据的判定。
首先对default.vcl文件复制一份重新改名为test1.vcl
acl purgers { #定义一个acl
"127.0.0.1";
"172.16.0.0"/16;
}
sub vcl_recv {
if (req.url ~ "^/test.html$") { #请求首部的url匹配到test.html,
return(pass); #跳过缓存
}
if
if (req.request != "GET" && #请求方法不是已知的这7中则发到pipe上去
req.request != "HEAD" &&
req.request != "PUT" &&
req.request != "POST" &&
req.request != "TRACE" &&
req.request != "OPTIONS" &&
req.request != "DELETE") {
return (pipe);
}
if (req.request != "GET" && req.request != "HEAD") { #不是获取资源的全部跳过缓存,减少无用缓存查询
return (pass);
}
if (req.request == "PURGE") {
if (!client.ip ~ purgers) { #请求IP不在ACL中定义,则发挥405错误页。
error 405 "Method not allowed";
}
return (lookup);
}
return (lookup);
}
那么此时如何加载这个test1让他生效呢?
第一修改配置文件。
第二,利用varnishadm客户端工具。
varnishadm
[root@node1 ~]# varnishadm -S /etc/varnish/secret -T 127.0.0.1:6082 #进入到管理工具
200
-----------------------------
Varnish Cache CLI 1.0
-----------------------------
Linux,2.6.32-431.el6.x86_64,x86_64,-sfile,-smalloc,-hcritbit
varnish-3.0.5 revision 1a89b1f
Type 'help' for command list.
Type 'quit' to close CLI session.
varnish> vcl.load test1 test1.vcl #加载vcl文件
200
VCL compiled.
varnish> vcl.list
200
active 2 boot
available 0 test1
varnish> vcl.use test1
200
varnish> vcl.list
200
available 2 boot
active 0 test1
这样就设定成功了。
为了显示效果我们来配置一下deliver段,给客户端返回时候匹配到缓存信息,以便我我们来查看实验结果。
sub vcl_deliver {
if (obj.hits > 0) { #判断条件缓存匹配次数���于0
set resp.http.X-Cache = "HIT via" + " " + server.hostname; #添加HIT via
} else {
set resp.http.X-Cache = "MISS via" + " " + server.hostname; #没有匹配到则添加MISS via
}
}
访问缓存172.16.18.1.第一次是miss via 之后的访问在缓存有效期内都是HIT via
当访问test.html是会被vcl_recv定义的pass匹配到,直接跳过缓存,所以X-cache状态一直是MISS via
2,编辑vcl_hash,自定义hash生成时的数据来源。
sub vcl_hash {
hash_data(req.url); #依据req.url来匹配
if (req.http.host) {
hash_data(req.http.host); #请求首部的host来缓存
} else {
hash_data(server.ip);
}
return (hash);
}