首页 > 代码库 > Varnish应用和实例详解

Varnish应用和实例详解


varnish 是squid的升级版,主要应用于http得反向代理和http缓存来提供加速功能
1、varnish工作原理是:是每个线程响应一个用户请求的(某个用户请求到来,accept接收这个请求并分配到某个空闲的worker进程进行处理,
(由worker线程读入缓存根据请求的url,如果能够在缓存中查找到,直接把查找的内容直接响应给客户;如果在缓存中查找不到,就负责到后端服务器查找数据,查找到数据后,根据缓存机制,如果能够缓存,就缓存到本地,再响应给客户端。))

2、varnish能够响应多少用户请求呢?取决于打开线程的总数,用什么来控制线程总数呢??
通过线程池的机制来控制打开多个线程,来响应客户端请求。(一般情况是打开线程池的个数,和物理机的核心数是成正比的。不能超过物理核心数。)

3、varnish缓存方式:(也可以缓存到内存和磁盘)
    缓存数据的存储方式:在缓存空间中固定分配大小的空间,如果要缓存一个数据根据缓存数据的大小来缓存到最接近缓存数据大小的空间。
                        如果缓存空间慢了将使用用LRU机制来置换内存空间(LRU是Least Recently Used 近期最少使用算法。内存管理的一种页面置换算法,对于在内存中但又不用的数据块(内存块)叫做LRU,Oracle会根据哪些数据属于LRU而将其移出内存而腾出空间来加载另外的数据。)

4、varnish释放缓存方式:由varinish管理缓存超时周期线程TTL(TTL值如果超过设置的值将释放缓存空间),如果释放的空闲空间有连续的,就会自动合并成一起成为大的空闲空间,避免了空间浪费和空间碎片(内存合并机制)。
varnish安装 官网:www.varnish-cache.org/releases
http://repo.varnish-cache.org/redhat/varnish3.0/el6/
    包: varnish-3.0.5-1.el6.x86_64.rpm
         varnish-docs-3.0.5-1.el6.x86_64.rpm
         varnish-libs-3.0.5-1.el6.x86_64.rpm  

拓扑图                     

实验环境:
    vm1-web1:172.16.3.1/16
    vm2-web2:172.16.3.2/16
    vm3-varnish: 172.16.3.10/16
配置:
vm1-web1:
    # yum install httpd
    # service httpd start
    # echo "172.16.3.1" > /var/www/html/index.html

vm2-web2:
    # yum install httpd
    # service httpd start
    # echo "172.16.3.2" > /var/www/html/index.html
vm3-varnish:
    # yum install varnish
全局属性配置文件:
# cat /etc/sysconfig/varnish
NFILES=131072                   允许打开的最大文件数

MEMLOCK=82000                     默认的log日志大小为82M

VARNISH_VCL_CONF=/etc/varnish/default.vcl     指定varnish的配置文件

VARNISH_LISTEN_PORT=80                     指定监听端口

VARNISH_ADMIN_LISTEN_ADDRESS=127.0.0.1        指定管理主机
VARNISH_ADMIN_LISTEN_PORT=6082                指定管理主机的端口号

VARNISH_SECRET_FILE=/etc/varnish/secret        指定密钥文件的目录
VARNISH_MIN_THREADS=50                        一个worker 默认开启的最小线程数

VARNISH_MAX_THREADS=1000                       一个worker 开启的最大线程数

VARNISH_THREAD_TIMEOUT=120                    一个worker空闲多长时间会被终止单位秒钟

VARNISH_STORAGE_FILE=/var/lib/varnish/varnish_storage.bin     指定缓存文件的位置

VARNISH_STORAGE_SIZE=1G                                          缓存文件最大为1G   

VARNISH_STORAGE="file,${VARNISH_STORAGE_FILE},${VARNISH_STORAGE_SIZE}"   存储文件的定义格式

VARNISH_TTL=120                缓存回收周期时间。

主配置文件配置
# cp /etc/varnish/default.vcl /etc/varnish/test1.vcl  (先备份下,为了方便修改)
# vim /etc/varnish/test1.vcl

backend web1 {                         定义第一个backend-server
  .host = "172.16.3.1";                    后端服务器的地址
  .port = "80";                            监听端口
  .probe = {                           监控检测机制
    .url = "/index.html";                以url来检测
    .interval = 2s;                        每隔2秒钟检测一次
    .window = 8;                        从正常到失败检测8次
    .threshold = 2;                        8此中有两次是监控就说明是监控的
   }
}
backend web2 {                            定义第二个backend-server
  .host = "172.16.3.2";
  .port = "80";
  .probe = {
    .url = "/index.html";
    .interval = 2s;
    .window = 8;
    .threshold = 2;
   }
}
director webservers round-robin {            定义后端服务器组webservers,并指明访问机制:这里指定的是round-robin轮询机制
    { .backend = web1; }                    指定后端server
    { .backend = web2; }
}
acl purgers {                           定义清除单个缓存的控制列表(允许的用户)
    "127.0.0.1";
    "172.16.0.0"/16;                  
}

sub vcl_recv {                                    指定接收客户端的一些访问机制
    set req.backend = webservers;                应用后端server

     if (req.restarts == 0) {                    如果请求重启次数为0
        if (req.http.x-forwarded-for) {           如果存在x-forwarded-for
            set req.http.X-Forwarded-For =
            req.http.X-Forwarded-For + ", " + client.ip; 则在x-forwarded-for后面添加客户端IP
        } else {
            set req.http.X-Forwarded-For = client.ip;    否则设置x-forwarded-for等于客户端IP
        }
     }
     if (req.url ~ "^/test1.html$") {                如果是请求test1.html则跳过直接去后端server请求
                return(pass);
     }

    if (req.request == "PURGE"){                     定义清除单个缓存的返回信息的说明
       if (client.ip !~ purgers) {
            error 405 "Method not allower.";
        }
        return (lookup);                      如果客户请求为 PURGE且客户端IP非purgers 则响应Method not allower.
    }
     return (lookup);               如果客户端请求为PURGE则直接查找缓存
}

sub vcl_hit {                             如果在缓存中能查到,直接清除缓存并响应"Purged
    if (req.request == "PURGE") {
        purge;
        error 200 "Purged";   
    }
     return (deliver);
}
sub vcl_miss {                                如果缓存中没有查到,则直接返回not in Purged
    if (req.request == "PURGE") {
        purge;
        error 404 "not in Purged";   
    }
     return (fetch);
}

sub vcl_fetch {                            这里定义得不严谨(为了方便测试,周期性缓存时间最多5秒)
  set beresp.ttl = 5s;
}      

sub vcl_deliver {                                   设置响应客户端机制
    if (obj.hits > 0) {
           set resp.http.X-Cache = "HIT via" + " " + server.hostname;   如果缓存命中次数大于0 则在响应首部添加varnish服务器的主机名称,
        } else {
                set resp.http.X-Cache = "MISS via" + " " + server.hostname; 如果没有命中缓存,则在响应首部添加X-Cache = "MISS via" + " " + server.hostname

}
     return (deliver);         对应上面的重启次数。
}

启动varnish服务:
        1、 service varnish start
        2、 # varnishadm -S /etc/varnish/secret -T 127.0.0.1:6082
             vcl.load ning test1.vcl   编辑生效配置
             vcl.use ning             应用配置
==================================================================================
测试:
    1、测试是否能够对后端server轮训,同时也可以测出每个5秒缓存会失效一次(有图有真相)

88

轮训1

轮训2
    2、检测是否可以健康监控后端server(有图有真相)

停掉后端server,检测的过程

检测的过程失败

监控检测机制图

 
    3、检测是否在响应头添加了指定信息(有图有真相)

命中1

命中2

命中3

 

4、清理单个缓存的命令:

# curl -X PURGE http://172.16.3.10/index.html (清理缓存对象的命令)
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
  <head>
    <title>200 Purged</title>
  </head>
  <body>
    <h1>Error 200 Purged</h1>
   

Purged


    <h3>Guru Meditation:</h3>
   

XID: 202759686


    <hr>
   

Varnish cache server


  </body>
</html>

# curl http://172.16.3.10/index.html -I
HTTP/1.1 200 OK
Server: Apache/2.2.15 (CentOS)
Last-Modified: Tue, 02 Sep 2014 08:08:58 GMT
ETag: "80102-c-50210a1a7a078"
Content-Type: text/html; charset=UTF-8
Content-Length: 12
Accept-Ranges: bytes
Date: Tue, 23 Sep 2014 15:38:15 GMT
X-Varnish: 202759707
Age: 0
Via: 1.1 varnish
Connection: keep-alive
X-Cache: MISS via localhost.localdomain     指令就可以看到没有命中

varnish 一些管理工具:

         # arnishadm -h  查询帮助信息
         # varnishadm -S /etc/varnish/secret -T 127.0.0.1:6082    varnishadm管理连接命令

# varnishstat 检测命中率
# varnishlog 时时监控日志信息
# varnishncsa  记录的日志和httpd格式差不多
172.16.255.109 - - [24/Sep/2014:01:45:28 +0800] "GET http://172.16.3.10/ HTTP/1.1" 200 11 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36"

# varnishhist  请求历史的整个过程
# varnishtop    排序请求量,(请求量最大的排在上面)

Varnish应用和实例详解