碳基体

奋斗在产品安全第一线的安全妹子

Debian上搭建varnish环境

站点加速一定要用到缓存服务器,而目前开源的缓存服务器有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执行过程

 

以下是上图涉及到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

来源:碳基体

评论