Centos 6.5 varnish
源码编译需要安装以下的依赖:
1
2
3
4
5
|
报错:
.
/autogen
.sh
.
/autogen
.sh: line 47: libtoolize:
command
not found
安装依赖:
yum
install
libtool*
|
1
2
3
4
|
报错:
configure: error: requires an X
/Open-compatible
Curses library
安装依赖:
yum
install
ncurses-devel -y
|
1
2
3
4
|
报错:
configure: error: neither libedit nor another readline compatible library found
安装依赖:
yum
install
libedit-devel -y
|
rpm包安装所需的依赖:
1、安装varnish所需lib,
1
|
rpm --nosignature -i http:
//repo
.varnish-cache.org
/redhat/varnish-4
.0
/el6/x86_64/varnish/varnish-libs-4
.0.0-1.el6.x86_64.rpm
|
2、安装jemalloc,库文件可到此链接处下载:ftp-hk.tmapy.cz/fedora/epel/6/x86_64/jemalloc-3.6.0-1.el6.i686.rpm
1
|
rpm --nosignature -i http:
//ftp-hk
.tmapy.cz
/fedora/epel/6/x86_64/jemalloc-3
.6.0-1.el6.x86_64.rpm
|
#可以去下载合适自己的varnish版本软件包
1
|
http:
//repo
.varnish-cache.org
/redhat/varnish-4
.0
/el6/x86_64/varnish/
|
3、开始安装,
1
|
rpm --nosignature -i http:
//repo
.varnish-cache.org
/redhat/varnish-4
.0
/el6/x86_64/varnish/varnish-4
.0.0-1.el6.x86_64.rpm
|
安装完成后,启动varnish:
1
|
service varnish start
|
HTTP 请求的类型有几种,下面是主要的几种:
GET : 请求指定的页面信息,并返回实体主体。
HEAD: 只请求页面的首部。
POST: 请求服务器接受所指定的文档作为对所标识的URI的新的从属实体。
pass和pipe都从后端服务器取数据,它们之间有什么不同呢?
答:当vcl_recv调用 pass 函数时,pass将当前请求直接转发到后端服务器。而后续的请求仍然
通过varnish处理。
例如,建立了HTTP连接之后,客户端顺序请求 a.css 、a.png两个文件,“当前请求”指的是第一个
请求,即a.css,a.css被直接转发到后端服务器,不被缓存。而后续的a.png则再由varnish来做
处理,varnish会判断a.png 如何处理。
总结:一个连接中除了当前请求,其它请求仍然按照正常情况由varnish处理。
而pipe模式则不一样,当vcl_recv判断 需要调用 pipe 函数时,varnish会在客户端和服务器之
间建立一条直接的连接 ,之后客户端的所有请求都直接发送给服务器,绕过varnish,不再由varnish
检查请求,直到连接断开。
Request
1、调用 pass 函数,从后端服务器调用数据。
2、调用 pipe 函数,建立客户端和后端服务器之间的直接连接,从后端服务器调用数据。
3、调用lookup函数,从缓存中查找应答数据并返回,如果查找不到,则调用pass函数从后端服务器
调用数据 。
varnish vcl配置文件:
vcl_recv 接受请求
vcl_hash 缓存策略
vcl_fetch 不缓存
vcl_hit 命中
vcl_miss 未命中
1
2
3
|
if
(req.request !=
"GET"
&& req.request !=
"HEAD"
&& req.request !=
"PUT"
&& req.request !=
"POST"
&& req.request !=
"TRACE"
&& req.request !=
"OPTIONS"
&& req.request !=
"DELETE"
) {
return
(pipe);
}
|
#如果不是get和head,那就是post。post属于发送数据给服务器,需要服务器接受数据并处理,属于动态。
1
2
3
|
if
(req.request !=
"GET"
&& req.request !=
"HEAD"
) {
return
(pass);
}
|
#认证信息
1
2
3
4
|
if
(req.http.Authorization || req.http.Cookie) {
return
(pass);
}
return
(lookup);
|
1
2
3
4
5
6
7
|
hash_data(req.url);
if
(req.http.host) {
hash_data(req.http.host);
}
else
{
hash_data(server.ip);
}
return
(
hash
);
|
#sub vcl_deliver 返回引擎,客户端提示是否命中
1
2
3
4
5
6
7
|
sub vcl_deliver {
if
(obj.hits > 0) {
set
resp.http.X-Cache =
"Hit"
;
}
else
{
set
resp.http.X-Cache =
"Miss"
;
}
}
|
缓存时间的计算方法
缺省的缓存时间计算方法如下:
. 先根椐max-age确定缓存时间
看返回头中的Cache-Control头中,有没有指定s-maxage或max-age信息,另外,如果后端是一个缓存服务器,它还会指定一个age头,表明已经缓存过的时间,这样需要减去age头指定的时间,计算出对应的缓存时间。
例1 只有max-age,没有age
CacheControl: max-age=86400
缓存时间:86400秒,即一天
例2 同时有max-age和age信息
CacheControl: max-age=86400
Age: 6400
缓存时间:86400 - 6400 = 80000秒