Quantcast
Channel: 碳基体
Viewing all articles
Browse latest Browse all 75

Debian上搭建varnish环境

$
0
0
站点加速一定要用到缓存服务器,而目前开源的缓存服务器有SquidVarnishNginx(nginx第三方模块)。各款服务器都有自己的优劣点,没有坏的技术,只有不正确的适用场景。对于打算自建CDN的童鞋,可以都尝试用用,然后选择出最适合自己的。本文介绍varnish环境搭建及基本的VCL(varnish配置语言)语法。


一、varnish安装
https://www.varnish-cache.org/releases

1. 安装依赖包

sudo apt-get install autotools-dev automake1.9 libtool autoconf libncurses-dev xsltproc groff-base libpcre3-dev

2. 安装varnish

curl http://repo.varnish-cache.org/debian/GPG-key.txt | apt-key add -

echo "deb http://repo.varnish-cache.org/debian/ wheezy varnish-3.0" >> /etc/apt/sources.list

apt-get update

apt-get install varnish

3. varnish重要文件路径
(1)配置文件
/etc/varnish/
(2)命令工具

1)varnishd 守护进程

2)varnishadm varnish实例管理接口,可以动态的删除缓存,重新加载配置文件等

3)varnishlog 日志查看

 4)varnishncsa 以ncsa格式显示日志

5)varnishtop 读取共享内存的日志

6)varnishstat 统计工具, 包含很多计数器,请求丢失率,命中率,存储信息,创建线程,删除对象等,几乎所有的操作。通过跟踪这些计数器,可以很好的了解varnish运行状态
7)varnishhist 
8)varnishsizes 

9)varnishtest 测试工具

 10)varnishreplay http流量重放工具

二、 varnish启动,以varnish+lighttpd为例
1. 修改lighttpd(后端服务器)的端口

vim /etc/lighttpd/lighttpd.conf

server.port = 8032

service lighttpd start


2. 修改varnish配置文件

vim /etc/varnish/default.vcl

backend default {
.host = "127.0.0.1";
.port = "8032";
}


3.启动varnish
仅介绍基础启动所需参数

pkill varnishd

varnishd -f /etc/varnish/default.vcl -s file,/home/tanjiti/varnish_storage.bin,1G -T 127.0.0.1:2000 -a 0.0.0.0:80

-s 设置缓存存放地方,可以放在内存中(-s malloc,1G) 也可以放在文件中
-f  vcl配置文件,vcl的逻辑处理都依赖与vcl配置文件,可以在守护进程varnishd中指定vcl文件,也可以用varnishadm
来加载指定文件
第一步:将VCL文件放到对应的服务器上
第二步:进入varnishadm管理界面
第三步:
vcl.load <configname> <filename>
vcl.use <configname>
-a 对后端HTTP服务器的监听接口
-T 管理端口

三、VCL执行过程
Debian上搭建varnish环境 - 碳基体 - 碳基体
 
以下是上图涉及到vcl关键子函数,varnish在处理HTTP请求的各个阶段会回调这些函数进行处理。
1. VCL关键子函数
a.vcl_recv
用于接收和处理请求。当请求到达并成功接收后被调用,通过判断请求的数据来决定如何处理请求。例如如何响应、怎么响应、使用哪个后端服务器等。

返回值:
error code [reason] 返回规定的代码给客户端,并终止请求。 CODE是HTTP响应码,例如200或405等;reason是错误提示信息
pass 表示进入pass模式,控制权交给vcl_pass
pipe 表示进入pipe模式,控制权交给vcl_pipe
lookup 表示进入lookup模式,在cache中查找请求目标,控制权传递给vcl_hitvcl_miss

b.vcl_pipe
此函数在进入 pipe 模式时被调用,用于将请求直接传递至后端主机,在请求和返回的内容没有改变的情况下,将不变的内容返回给客户端,直到这个连接被关闭。

返回值:
errorcode
pipe

c.vcl_pass
此函数在进入 pass 模式时被调用,用于将请求直接传递至后端主机。后端主机在应答数据后将应答数据发送给客户端,但不进行任何缓存,在当前连接下每次都返回最新的内容。

返回值:
errorcode
pass
restart 重新启动流程,增加启动次数,如果重新启动次数高于max_restarts发出一个错误警告

d.vcl_hash
设置缓存的键值key,当您想把一个数据添加到 hash 上时,调用此函数。

返回值:
hash

e.vcl_hit
在执行 lookup 指令后,在缓存中找到请求的内容后将自动调用该函数。

返回值:
error code
pass
deliver 表示将找到的内容发送给客户端,并把控制权交给函数 vcl_deliver
restart

f.vcl_miss
在执行 lookup 指令后,在缓存中没有找到请求的内容时自动调用该方法。此函数可用于判断是否需要从后端服务器获取内容。

返回值:
error code
pass
fetch 表示从后端获取请求的内容,并把控制权交给 vcl_fetch 函数。

g.vcl_fetch
在后端主机更新缓存并且获取内容后调用该方法,接着,通过判断获取的内容来决定是将内容放入缓存,还是直接返回给客户端。

返回值:
error code
pass
deliver
esi
restart

h.vcl_deliver
将在缓存中找到请求的内容发送给客户端前调用此方法

返回值:
error code
pass
deliver

i.vcl_error
出现错误时调用此函数

返回值:
deliver
restart

我们可以看出大概有4种处理流程

(1). 处于PIPE状态,HTTP请求直接交给后端服务器处理
vcl_recv -> vcl_pipe 

(2). 处于PASS状态,Varnish相当于一个只负责转发的中转站
vcl_recv -> vcl_pass -> vcl_fetch -> vcl_deliver 

3. varnish 缓存
(3)初次请求,miss缓存
vcl_recv -> vcl_hash -> vcl_miss -> vcl_fetch -> vcl_deliver

(4)再次请求,hit缓存
vcl_recv -> vcl_hash -> vcl_hit -> vcl_deliver


3. VCl操作符
= 赋值
~ 正则匹配
!逻辑非
&& 逻辑and
||逻辑or
== 相等

4. VCL内置函数
regsub(str,regex,sub)
regsuball(str,regex,sub)
purge_url(regex) 

5. 自定义子函数
sub subname{
}
call subname;







对于商用云级应用,CloudFlare,安全宝都选择了Nginx服务器,其原因有很多,有性能方面的例如varnish对大并发的处理能力有限,简单的测试下来,varnish能支持3w左右并发,而nginx能支持到5w左右,有功能方面的,varnish对动态网页的缓存有限。

参考:
http://www.ibm.com/developerworks/cn/opensource/os-cn-varnish-intro/
http://my.oschina.net/u/572653/blog/178201

Viewing all articles
Browse latest Browse all 75

Trending Articles