varnish 简单的学习

Varnish 简介

Varnish 是一款高性能且开源的反向代理服务器和 HTTP 加速器,其采用全新的软件体系机构,和现在的硬件体系紧密配合,与传统的 squid 相比,varnish 具有性能更高、速度更快、管理更加方便等诸多优点,很多大型的网站都开始尝试使用 varnish 来替换 squid,这些都促进 varnish 迅速发展起来。

挪威的最大的在线报纸 Verdens Gang(vg.no) 使用 3 台 Varnish 代替了原来的 12 台 Squid,性能比以前更好,这是 Varnish 最成功的应用案例。

Varnish 文件缓存的工作流程

Varnish 与一般服务器软件类似,分为 master 进程和 child 进程。Master 进程读入存储配置文件,调用合适的存储类型,然后创建 / 读入相应大小的缓存文件,接着 master 初始化管理该存储空间的结构体,然后 fork 并监控 child 进程。Child 进程在主线程的初始化的过程中,将前面打开的存储文件整个 mmap 到内存中,此时创建并初始化空闲结构体,挂到存储管理结构体,以待分配。Child 进程分配若干线程进行工作,主要包括一些管理线程和很多 worker 线程。

接着,开始真正的工作,varnish 的某个负责接收新 HTTP 连接线程开始等待用户,如果有新的 HTTP 连接过来,它总负责接收,然后唤醒某个等待中的线程,并把具体的处理过程交给它。Worker 线程读入 HTTP 请求的 URI,查找已有的 object,如果命中则直接返回并回复用户。如果没有命中,则需要将所请求的内容,从后端服务器中取过来,存到缓存中,然后再回复。

分配缓存的过程是这样的:它根据所读到 object 的大小,创建相应大小的缓存文件。为了读写方便,程序会把每个 object 的大小变为最接近其大小的内存页面倍数。然后从现有的空闲存储结构体中查找,找到最合适的大小的空闲存储块,分配给它。如果空闲块没有用完,就把多余的内存另外组成一个空闲存储块,挂到管理结构体上。如果缓存已满,就根据 LRU 机制,把最旧的 object 释放掉。

释放缓存的过程是这样的:有一个超时线程,检测缓存中所有 object 的生存期,如果超初设定的 TTL(Time To Live)没有被访问,就删除之,并且释放相应的结构体及存储内存。注意释放时会检查该存储内存块前面或后面的空闲内存块,如果前面或后面的空闲内存和该释放内存是连续的,就将它们合并成更大一块内存。

整个文件缓存的管理,没有考虑文件与内存的关系,实际上是将所有的 object 都考虑是在内存中,如果系统内存不足,系统会自动将其换到 swap 空间,而不需要 varnish 程序去控制。

Varnish 安装

下载 varnish 安装包

建议下载最新稳定版本(现在最新 varnish 版本为 3.0.2),varnish 提供源代码安装包和可执行程序安装包,按照您的习惯下载适合您平台的任一安装包即可。

安装 varnish

源代码安装包安装

首先安装 pcre 库,pcre 库是为兼容正则表达式,如果不安装,在安装 varnish2.0 版本以上时,会提示找不到 pcre 库。以下是 pcre 的安装过程,其代码如清单 1 所示:

清单 1. pcre 库安装代码
     tar zxvf pcre.tar.gz 
    cd pcre/
    ./configure --prefix=/usr/local/pcre/
    Make && make install

安装 varnish,其代码如清单 2 所示:

清单 2. varnish 安装代码
        tar xzvf varnish-3.0.2.tar.gz 
       cd varnish-3.0.2
       export PKG_CONFIG_PATH =/usr/local/pcre/lib/pkgconfig
       ./configure --prefix=/usr/local/varnish  
       make
       make install

可执行程序安装包安装

RedHat 系统环境下的安装 varnish,您需要安装以下软件:automake、autoconf、libtool、ncurses-devel、libxslt、groff、pcre-devel、pkgconfig,然后进行 varnish 的安装,安装代码如清单 3 所示:

清单 3. varnish 安装代码
 rpm -i varnish-2.1.4-2.el5.x86_64.rpm

启动 varnish

清单 4. varnish 启动代码
 varnishd -f /etc/varnish/default.vcl -s file,/var/varnish_cache,1G \
-T 127.0.0.1:2000 -a 0.0.0.0:9082

各参数的含义如下:

-f 指定 varnish 的配置文件位置

-s 指定 varnish 缓存存放的方式,常用的方式有:“-s file,<dir_or_file>,<size>”。

-T address:port 设定 varnish 的 telnet 管理地址及其端口

-a address:port 表示 varnish 对 http 的监听地址及其端口

装完了之后,它的默认配置文件就是 /etc/varnish/default.vcl,像  Squid 的配置文件  squid.conf 一样,这个默认的配置文件本身就是一个详细的配置文档,详见注释。目前有效内容就只有几行:

1
2
3
4
backend default {
     .host = "127.0.0.1" ;
     .port = "8080" ;
}

Varnish 是个代理服务器,所以它在 Web 服务器前端,它默认的端口也是 6081。所以默认情况下上面的配置表示的意思是:

对于发往本机 6081 端口的请求将派发给主机  127.0.0.1 的 8080 端口所对应的进程去处理。8080 基本为知名的 Tomcat 端口,看来它与 Tomcat 走得比较近(玩笑而已)。

Varnish 的启动,三种方式

varnishd -f /etc/varnish/default.vcl -s malloc,1G -T 127.0.0.1:2000 -a 0.0.0.0:80 , 命令执行成功以后 , 访问 127.0.0.1 此时返回了 8080 端口的真实数据 , 通过火狐浏览器的FireBug 查看网络请求头信息 , 会发现在 "响应头信息" 里面 Varnish 添加了两个属性信息 (Age:3,Via:1.1 varnish), Varnish 到此就已经安装并且启动成功。

-f /etc/varnish/default.vcl -- 指定 Varnish 需要使用的配置文件
-s malloc,1G         -- 指定 Varnish 的缓存空间
-T 127.0.0.1:2000        -- varnish 有一个基于文本的管理接口 , 启动它可以在不停止 varnish 的情况下来管理 varnish 。指定管理软件监听哪个 端口
-a 0.0.0.0:80      -- 指定 Varnish 使用的端口号 , Varnish 会监听所有来自 80 端口号的数据 , 并且转发给 backend default 配置的真实服务器 。

2) sudo /etc/init.d/varnish start|stop|restart|status

本文原始链接 http://unmi.cc/varnish-install-quick-start/, 来自 隔叶黄莺 Unmi Blog

3) sudo service varnish start|stop|restart|status

后两种方式采用默认配置,即执行的命令是

/usr/sbin/varnishd -P /var/run/varnishd.pid -a :6081 -T localhost:6082 -f /etc/varnish/default.vcl -S /etc/varnish/secret -s malloc,256m

 我们可以修改使用  /etc/init.d/varnish 和 service varnish 启动 varnish 的默认参数, RedHat 的配置文件在 /etc/sysconfig/varnish, Ubuntu 的配置文件在 /etc/default/varnish,打开这个文件,针对产品环境通常是用 80 端口来接收并转发请求,这样子看起来它还是一个 Web 服务器。所以我们参考里面的

1
2
3
4
5
DAEMON_OPTS="-a :6081 \
              -T localhost:6082 \
              -f /etc/varnish/default .vcl \
              -S /etc/varnish/secret \
              -s malloc,256m"

在最后面加上

1
2
3
4
5
DAEMON_OPTS="-a :80 \
              -T localhost:6082 \
              -f /etc/varnish/default .vcl \
              -S /etc/varnish/secret \
              -s malloc,1G"

你也可以使用文件来缓存,同样是参看这个  varnish 配置文件中的详细注释。

关于观察 Varnish 的状态,以下所有以 varnish 打头的命令很重要,可以用它们实时看到缓存命中状态,和更多的详细信息

1
2
3
unmi@ubuntu:/etc/varnish$ varnish
varnishadm     varnishhist    varnishncsa    varnishsizes   varnishtest   
varnishd       varnishlog     varnishreplay  varnishstat    varnishtop







你可能感兴趣的:(varnish安装以及简单配置)