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秒缓存会失效一次(有图有真相)


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

停掉后端server,检测的过程

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    排序请求量,(请求量最大的排在上面)

时间: 2024-10-08 23:16:46

Varnish应用和实例详解的相关文章

varnish安装及配置详解

varnish系统架构: varnish主要运行两个进程:Management进程和Child进程(也叫Cache进程). Management进程主要实现应用新的配置.编译VCL.监控varnish.初始化varnish以及提供一个命令行接口等.Management进程会每隔几秒钟探测一下Child进程以判断其是否正常运行,如果在指定的时长内未得到Child进程的回应,Management将会重启此Child进程. Child进程包含多种类型的线程,常见的如:Acceptor线程:接收新的连接

23、磁盘管理—磁盘阵列(RAID)实例详解

磁盘阵列(RAID)实例详解 raid技术分类 软raid技术 硬raid技术 Raid和lvm的区别 为什么选择用raid RAID详解 RAID-0 RAID-1 RAID-5 Raid-10 Raid的管理 案例:创建一个raid10+冗余盘 磁盘阵列(RAID)实例详解 Raid(磁盘阵列)级别介绍 Raid有"廉价磁盘冗余阵列"的意思,就是利用多块廉价的硬盘组成磁盘组,让数据分部储存在这些硬盘里面,从而达到读取和写入加速的目的:也可以用作数据的冗余,当某块硬盘损毁后,其他硬盘

Cocos2d-x 3.X手游开发实例详解

Cocos2d-x 3.X手游开发实例详解(最新最简Cocos2d-x手机游戏开发学习方法,以热门游戏2048.卡牌为例,完整再现手游的开发过程,实例丰富,代码完备,Cocos2d-x作者之一林顺和泰然网创始人杨雍力荐) 于浩洋 著   ISBN 978-7-121-23998-4 2014年9月出版 定价:59.00元 356页 16开 编辑推荐 以Cocos2d-x V3.0为框架全面讲解手游开发的知识和方法 以热门游戏2048.卡牌为例,完整再现手游的开发过程 Cocos2d-x作者之一林

实例详解Django的 select_related 和 prefetch_related 函数对 QuerySet 查询的优化(一)

在数据库有外键的时候,使用 select_related() 和 prefetch_related() 可以很好的减少数据库请求的次数,从而提高性能.本文通过一个简单的例子详解这两个函数的作用.虽然QuerySet的文档中已经详细说明了,但本文试图从QuerySet触发的SQL语句来分析工作方式,从而进一步了解Django具体的运作方式. 本来打算写成一篇单独的文章的,但是写完select_related()之后发现长度已经有点长了,所以还是写成系列,大概在两到三篇.整个完成之后将会在这里添加上

boost asio异步读写网络聊天程序客户端 实例详解

// // chat_client.cpp // ~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2013 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://ww

《HTML 5网页开发实例详解》目录

第一篇  从宏观上认识HTML 5 讲述了HTML 5引发的Web革命.HTML 5的整体特性.HTML 5相关概念和框架和开发环境搭建. 第1章 HTML 5引发的Web革命 1.1  你是不是真的了解HTML 5 1.1.1  通过W3C认识HTML 5的发展史 1.1.2  HTML 5.HTML4.XHTML的区别 1.1.3  什么人应该学HTML 5 1.1.4  一个图告诉你如何学习HTML 5 1.2  浏览器之争 1.2.1  说说这些常见的浏览器 1.2.2  浏览器的兼容烦

Android Touch系统简介(二):实例详解onInterceptTouchEvent与onTouchEvent的调用过程

上一篇文章主要讲述了Android的TouchEvent的分发过程,其中有两个重要的函数:onInterceptTouchEvent和onTouchEvent,这两个函数可被重装以完成特定的逻辑.onInterceptTouchEvent的定义为于ViewGroup中,默认返回值为false,表示不拦截TouchEvent.onTouchEvent的定义位于View中,当ViewGroup要调用onTouchEvent时,会利用super.onTouchEvent.ViewGroup调用onTo

js取整数与取余数实例详解

分享下js取整数.取余数的方法. 1.丢弃小数部分,保留整数部分parseInt(5/2)2.向上取整,有小数就整数部分加1 Math.ceil(5/2)3,四舍五入.Math.round(5/2)4,向下取整 Math.floor(5/2)Math 对象的方法FF: Firefox, N: Netscape, IE: Internet Explorer方法 描述 FF N IEabs(x) 返回数的绝对值 1 2 3acos(x) 返回数的反余弦值 1 2 3asin(x) 返回数的反正弦值

Linux 查看系统硬件信息(实例详解)

cpu lscpu命令,查看的是cpu的统计信息. [email protected]:~$ lscpu Architecture: i686 #cpu架构 CPU op-mode(s): 32-bit, 64-bit Byte Order: Little Endian #小尾序 CPU(s): 4 #总共有4核 On-line CPU(s) list: 0-3 Thread(s) per core: 1 #每个cpu核,只能支持一个线程,即不支持超线程 Core(s) per socket: