首页 > 代码库 > 高性能HTTP加速器varnish实践

高性能HTTP加速器varnish实践

一,varnish介绍及特点

   varnish是一款高性能的、轻量的、开源的反向代理服务器和HTTP加速器。Varnish代码量不大,先进的设计理念和成熟的设计框架是它的主要特征。目前在缓存工具的选择上Varnish由于在本身的技术上优势已经超越传统的缓存工具squid,越来越受到青睐。以下是varnish的一些特点介绍:
      1,基于内存缓存,重启后数据消失
      2,利用虚拟内存方式,I/O性能好
      3,支持设置0-60秒的精确缓存时间
      4,配置管理灵活
      5,,具有强大的管理功能


二,varnish的安装

Varnish安装简单,可以使用非root用户进行安装。
1,首先安装 pcre 库,pcre 库是为兼容正则表达式。
     >tar zxvf pcre7.9.tar.gz 
     >cd pcre7.9/ 
     >./configure --prefix=/zhangzya/pcre/ 
     >Make && make install
2,varnish 安装
     >tar xzvf varnish-3.0.3.tar.gz 
     >cd varnish-3.0.3 
     >export PKG_CONFIG_PATH=/zhangzya/pcre/lib/pkgconfig 
     >./configure --prefix=/zhangzya/varnish      
     >make 
     >make install
     到此安装完成


三,varnish配置

1,VCL配置文件常用函数介绍
     vcl,即varnish configuation language,用来定义varnish的存取策略。下面对vcl常用内置函数进行介绍。
     Vcl_recv函数:用于接收和处理请求。
     Vcl_pipe函数:进入pipe模式时被调用,将请求直接传递至后端主机。
     Vcl_pass函数:用户将请求直接传递到后端主机,数据不进行任何缓存。
     Lookup:在缓存中查找请求对象,根据查找结果赋权给vcl_hit  vcl_miss函数。
     Vcl_hit函数:执行lookup后,在缓存中找到请求内容自动调用该函数。
     Vcl_fetch函数:在后端主机更新缓存并获取内容后调用,通过判断获取的内容来决定是将内容放入缓存还是直接返回给客户端。
     Vcl_deliver函数:将在缓存中找到的请求内容发生给客户端前调用。

2,vcl处理流程介绍

技术分享

    Varnish 处理 HTTP 请求的过程大致分为如下几个步骤:
     Receive 状态(vcl_recv):也就是请求处理的入口状态,根据 VCL 规则判断该请求应该 pass(vcl_pass)或是 pipe(vcl_pipe),还是进入 lookup(本地查询)。 
     Lookup 状态:进入该状态后,会在 hash 表中查找数据,若找到,则进入 hit(vcl_hit)状态,否则进入 miss(vcl_miss)状态。
    Pass(vcl_pass)状态:在此状态下,会直接进入后端请求,即进入 fetch(vcl_fetch)状态
    Fetch(vcl_fetch)状态:在 fetch 状态下,对请求进行后端获取,发送请求,获得数据,并根据设置进行本地存储。
    Deliver(vcl_deliver)状态。将获取到的数据发给客户端,然后完成本次请求。

3,vcl配置文件详细介绍
      Varnish安装完成后,默认配置文件在/echnweb/varnish/etc/varnish/default.vcl。该文件内容默认全部注释,我们可以已该文件为模板,创建新的的文件varnish.vcl,主要配置介绍:

#指定后端主机的IP及端口
 backend default {
     .host = "192.168.232.139";
     .port = "9080";
 }
#开始调用vcl_recv函数
 sub vcl_recv {
     ... ...
     #移除匹配规则的对应请求的Cookie信息
     if (req.request == "GET" && req.url ~ "\.(jpg|png|gif|swf|jpeg|ico|css|js|html)$")
     {
         unset req.http.cookie;
     }  
     #如果请求的类型不是GET或HEAD,则进入pass模式
     if (req.request != "GET" && req.request != "HEAD") {
         return (pass);
    ... ...
    }
sub vcl_fetch {
   #当请求类型是GET并且请求的URL以js、css等结尾时进行缓存,缓存时间7天。
   if (req.request == "GET" && req.url ~ "\.(js|css|mp3|jpg|png|gif|swf|jpeg|ico)$") 
     { set beresp.ttl = 7d; }
}

Varnish对应多台Web主机的应用实例,具有负载分担和健康检测机制。具体配置如下:
backend web1{
.host="192.168.232.11";
.port="80";
}
backend web2{
.host="192.168.232.12";
.port="80";
}
#定义一个名为webserver的director,也就是由web1和web2两台后端服务器随机分担请求。.weight用来指定两台后端服务器的权值,权值高的处理请求的几率就高。
director webserver random{
{.backend=web1;.weight=5;}
{.backend=web2;.weight=8;}
}

 

四,varnish的启动

1,Varnish启动命令为/zhangzya/varnish/sbin/varnishd,启动时参数较多,执行
/zhangzya/varnish/sbin/varnishd -h 可获得各参数的详细用法。

启动参数

含义

-a address:port

表示Varnish对httpd的监听地址及端口

-b address:port

表示后端服务器地址及端口

-d

表示使用debug调试模式

-f

指定Varnish服务器的配置文件

-p param=value

指定服务器参数,用来优化Varnish性能

-P file

Varnish进程pid文件存放路径

-n dir

指定Varnish的工作目录

-T address:port

设定varnish的telnet管理地址及端口

-w int,int,int

设定varnish的工作线程数,常用的方式有:-w min,max -w min,max,timeout

-s kind[,storageoptions]

指定Varnish缓存内容的存放方式,常用的方式有:-s file,,
其中用于指定缓存文件的存放路径,“”用于指定缓存文件的大小


 2,启动后效果如下图,需要注意的是,Varnish运行时会同时启动两个进程,一个主进程,一个是子进程,如果子进程出现问题,主进程将重新生成一个子进程。 

技术分享

3,如果Varnish正常 启动,31000端口和31001端口应该处于监听状态。可以通过netstat进行查看。

 


五,varnish运行日志介绍
       varnish提供了varnishlog和varnishncsa两个工具用于日志处理。前者便于详细的查看varnish 缓存、接收、发送、是否命中等详细的处理过程,便于对varnish进行性能分析和故障查询;后者便于日常的日志分析和数据挖掘。

1,Varnishncsa日志如下图,可以把日志记录到文件中
/zhangzya/varnish/bin/varnishncsa -n /echnweb/varnish1/cache -w varnish.log &

技术分享


2,varnishlog日志如下图
/zhangzya/varnish/bin/varnishlog -n /echnweb/varnish1/cache


 

六,varnish缓存效果展示

可以通过浏览器访问对应的网页来查看Varnish缓存的效果。下面用命令行方式通过查看网页头来查看缓存命中情况。

第一次访问后查看网页头信息,红框中状态为MISS,表示该访问没有从缓存中读取。
技术分享

第二次访问相同的URL地址,红框中状态为HIT,表示缓存命中,从缓存中读取内容。

技术分享

 


七,varnish缓存刷新

Varnish的一个显著优点是可以灵活管理缓存内容。可迅速有效地控制和清除指定的缓存内容。

1,telnet登录管理端口清楚所有缓存,登陆后执行ban.url /*返回200表示清理成功。
技术分享
2,通过linux命令方式清除缓存,清理所有域名下download下的缓存

/zhangzya/varnish/bin/varnishadm -T 192.168.232.139:31001 ban.url /download/

3,清理10086.com域名下所有png文件的缓存

/zhangzya/varnish/bin/varnishadm -T 192.168.232.139:31001  ban req.http.host == "10086.com" && req.url  ~ ".png$"

 

八,优化varnish自身参数

      telnet到Varnish的管理端口,然后执行param.show命令即可看到Varnish运行中的所有参数。当然也可以通过这种方式更改相关参数,下面对4个重点参数进行介绍:
thread_ pools 4[ pools]
thread_ pool_ min 50[ threads]
thread_ pool_ max 5120[ threads]
thread_ pool_ timeout 10[ seconds]

thread_pools:用来设置线程池的数量。一般认为这个值和系统CPU的数目相同最好。设置多一些的pool,Varnish的并发处理能力会更强,但是也会消耗更多的CPU和内存。

thread_pool_min:用来设置每个pool的最小thread数。pool接收到可用的请求后,就会将请求分配给空闲的thread来处理。

thread_pool_max:表示所有pool对应的thread数总和的最大值。此值不能太大,设置为系统峰值的90%左右即可,设置过大会导致进程被挂起。

thread_pool_timeout:表示thread的超时过期时间。当thread数大于thread_pool_min设定值时,如果thread空闲超过thread_pool_timeout设定的时间,thread就会释放。



九,优化linux内核参数
      内核参数是用户和系统内核之间交互的一个接口,通过这个接口用户可以在系统运行的同时动态更新内核配置,可以通过调整Proc文件系统达到优化Linux性能的目的。

      以下参数是官方给出的一个配置:
net.ipv4.ip_local_port_range=1024 65536
net.core.rmem_max=16777216
net.core.wmem_max=16777216
net.ipv4.tcp_rmem=4096 87380 16777216
net.ipv4.tcp_wmem=4096 65536 16777216
net.ipv4.tcp_fin_timeout=30
net.core.netdev_max_backlog=30000
net.ipv4.tcp_no_metrics_save=1
net.core.somaxconn=262144
net.ipv4.tcp_syncookies=1
net.ipv4.tcp_max_orphans=262144
net.ipv4.tcp_max_syn_backlog=262144
net.ipv4.tcp_synack_retries=2
net.ipv4.tcp_syn_retries=2


高性能HTTP加速器varnish实践