Varnish缓存服务区应用

1) Varnish工作流程

Varnish是一款高性能的开源HTTP加速器

Varnish与一般服务器软件类似,分为master(management)进程和child(worker,主要做cache的工作)进程。master进程读入命令,进行一些初始化,然后fork并监控child进程。child进程分配若干线程进行工作,主要包括一些管理线程和很多woker线程。

针对文件缓存部分,master读入存储配置(-sfile[,path[,size[,granularity]]]),调用合适的存储类型,然后创建/读入相应大小的缓存大文件。接着,master初始化管理该存储空间的结构体。这些变量都是全局变量,在fork以后会被child进程所继承(包括文件描述符)。

在child进程主线程初始化过程中,将前面打开的存储大文件整个mmap到内存中(如果超出系统的虚拟内存,mmap失败,进程会减少原来的配置mmap大小,然后继续mmap),此时创建并初始化空闲存储结构体,挂到存储管理结构体,以待分配。

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

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

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

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

2) varnish的安装和启动配置

[[email protected] varnish]# ls ~/varnish/
3.0.5                                varnish-libs-3.0.4-1.el6.x86_64.rpm
varnish-3.0.4-1.el6.x86_64.rpm       varnish-libs-devel-3.0.4-1.el6.x86_64.rpm
varnish-docs-3.0.4-1.el6.x86_64.rpm
[[email protected] varnish]# yum install varnish*.rpm
#编辑/etc/sysconfig/varnish,将监听端口改为80
VARNISH_LISTEN_PORT=80
#编辑/etc/varnish/default.vcl,将监听服务器妨碍为172.16.21.102:80
backend default {
  .host = "172.16.21.102";
  .port = "80";
}
#启动服务
service varnish start

#此时我们已经可以访问arnish服务器172.16.21.101了

现在我们可以使用varnishadmin来配置varnish了

[[email protected] varnish]# varnishadm

3) 配置varnish添加X-Cache头部以判断缓存是否命中

#拷贝default.vcl到test1.vcl
co default.vcl test1.vcl
#编辑tes1.vcl在sub vcl_deliver段中添加
sub vcl_deliver {
    if(obj.hits>0){ #如果命中次数大于0
        set resp.http.X-Cache = "HIT";
    }else{
        set resp.http.X-Cache = "MISS";
    }
    return (deliver);
}
#加载并启用test1.vcl
varnish> vcl.load test ./test1.vcl
200       
VCL compiled.
varnish> vcl.use test
200

访问测试,没有命中

再次访问,可以看到已经命中

4) 配置指定页面不可以被缓存

再次编辑test1.vcl.添加如下内容

sub vcl_recv {
        if (req.url ~ "miss.html"){  #如果url被miss.html匹配,不要缓存,直接进入pass
                return(pass);
        }
     return (lookup);
}
#加载配置
varnish> vcl.load test2 ./test1.vcl
200       
VCL compiled.
varnish> vcl.use test2
200 
#在102添加miss.html文件
[[email protected] html]# echo "<h1>Can‘t be Cached</h1>" > miss.html

访问miss.html,可见无论如何刷新都不会命中缓存

5) 设置图片缓存时间,取消图片cookie设置

sub vcl_fetch {
        if (req.url ~ "\.(jpg|jpeg|gif|png)"){ #如果文件以指定格式结尾,使其缓存两个小时
                set beresp.ttl=7200s;
unset beresp.http.Set-Cookie;
        }
}

6) 设置缓存修剪及修剪控制

#修改配置文件
[[email protected] varnish]# cat /etc/varnish/test1.vcl |grep -v "^#"
backend default {
  .host = "172.16.21.102";
  .port = "80";
}
acl purgers { #访问控制列表
"127.0.0.1";
"172.16.21.0"/24;
}
sub vcl_recv {
if (req.request == "PURGE"){ #如果请求方法为PURGE并且
if(! client.ip ~ purgers) {  #客户端ip不在列表中
error 406 "Method not allowed IN the address"; #生成错误报文并退出
}
if (req.url ~ "miss.html"){
return(pass);
}
}
     return (lookup);
}
sub vcl_pass {
if(req.request == "PURGE") {
error 502 " Purge on a passwd object";
}
     return (pass);
}
sub vcl_hit {
if(req.request == "PURGE") {
purge;
error 201 " Purged";
}
     return (deliver);
}
sub vcl_miss {
if(req.request == "PURGE") {
purge;
error 405 " Not Found in Cache";
}
     return (fetch);
}
sub vcl_fetch {
if (req.url ~ "\.(jpg|jpeg|gif|png)"){
set beresp.ttl=7200s;
unset beresp.http.Set-Cookie;
}
}
sub vcl_deliver {
    if(obj.hits>0){
set resp.http.X-Cache = "HIT";
    }else{
set resp.http.X-Cache = "MISS";
    }
    return (deliver);
}
#修剪测试
[[email protected] varnish]# curl -X PURGE 172.16.21.101
<?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>201  Purged</title>
  </head>
  <body>
    <h1>Error 201  Purged</h1>
   
Purged

    <h3>Guru Meditation:</h3>
   
XID: 587750580

    <hr>
   
Varnish cache server

  </body>
</html>
[[email protected] varnish]# curl -X PURGE 172.16.21.101/miss.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>502  Purge on a passwd object</title>
  </head>
  <body>
    <h1>Error 502  Purge on a passwd object</h1>
   
Purge on a passwd object

    <h3>Guru Meditation:</h3>
   
XID: 587750582

    <hr>
   
Varnish cache server

  </body>
</html>

7) 设置varnish使用多台后端主机

#编辑配置文件
[[email protected] varnish]# cat /etc/varnish/test1.vcl |grep -v "^#"
backend web1 {
  .host = "172.16.21.102";
  .port = "80";
}
backend web2 {
  .host = "172.16.21.103";
  .port = "80";
}
director webservers random {
  .retries = 5;
  {
    .backend = web1;
    .weight = 2 ;
  }
  {
    .backend = web2;
    .weight = 3 ;
  }
}
...
sub vcl_recv {
set req.backend = webservers;
}
     return (lookup);
}
#重新加载并使用
varnish> vcl.load test9 ./test1.vcl
200       
VCL compiled.
varnish> vcl.use test9
200

#访问测试

#清除缓存后访问,

curl -X PURGE 172.16.21.101/

时间: 2024-07-28 19:13:16

Varnish缓存服务区应用的相关文章

Varnish缓存机制详细介绍及简单配置

Varnish是一款高性能的开源HTTP加速器,其主要用来做为反向代理中的缓存服务器使用,但其实Varnish本身也是具有反向代理功能的,但在创建连接和维持连接上,与Nginx相比差距很大,现在有一个很流行的架构就是前端用Nginx作为反向代理,后面加Varnish缓存服务器为Web服务加速 在将Varnish前先谈谈我们的浏览器缓存机制,现在的浏览器基本都具有缓存功能,它能将我们以前访问过的静态内容和可进行缓存的动态内容缓存再本地,而后在下次访问相同资源时,如果可以确认Server端的资源未发

Varnish缓存代理简介与配置

一.varnish原理: 1)Varnish简介: varnish缓存是web应用加速器,同时也作为http反向缓存代理.你可以安装varnish在任何http的前端,同时配置它缓存内容.与传统的 squid 相比,varnish 具有性能更高.速度更快.管理更加方便等诸多优点.有一部分企业已经在生产环境中使用其作为旧版本的squid的替代方案,以在相同的服务器成本下提供更好的缓存效果,Varnish更是作为CDN缓存服务器的可选服务之一. 根据官网的介绍,Varnish的主要特性如下:http

varnish缓存服务

缓存的基础知识1.程序本身具有局部性时间局部性 过去访问到的数据,也有可能被两次访问 空间局部性 一个数据被访问到时,离它最近的文件可能马上也会被访问 2.命中率文档命中率 从文档个数进行衡量 字节命中率 从内容大小进行衡量 3.缓存系统的特性缓存对象 有生命周期,且是定期清理的 缓存空间耗尽 使用LRU(最近最少使用算法)或者MRU算法进行缓存项清理 不可缓存项 用户私有数据 4.缓存系统一般处理步骤接收请求解析请求 提取请求的URL及各种首部 查询缓存新鲜度检测创建响应报文发送响应报文记录日

Varnish 缓存加速

Varnish可以有效降低web服务器的负载,提升访问速度.按照HTTP协议的处理过程,web服务器接受请求并且返回处理结果,理想情况下服务器要在不做额外处理的情况下,立即返回结果,但实际情况并非如此. 当把Varnish部署上之后,web请求的处理过程会有一些变化.客户端的请求将首先被Varnish接受.Varnish将分析接收的请求,并将其转发到后端的web服务器上.后端的web服务器对请求进行常规的处理,并将依次将处理结果返回给Varnish. 但Varnish的功能并非仅限于此.Varn

varnish缓存代理的安装

二.安装varnish 1.安装依赖关系的软件包(注:使用centos在线yum源) [[email protected] ~]# yum -y install autoconfautomake libedit-devel libtool ncurses-devel pcre-devel pkgconfigpython-docutils python-sphinx 2.安装varnish Varnish的官方网址为http://varnish-cache.org,可以在这里下载最新版本的软件.

linux之搭建varnish缓存代理服务器

一.varnish原理: 1)Varnish简介: varnish缓存是web应用加速器,同时也作为http反向缓存代理.你可以安装varnish在任何http的前端,同时配置它缓存内容.与传统的 squid 相比,varnish 具有性能更高.速度更快.管理更加方便等诸多优点.有一部分企业已经在生产环境中使用其作为旧版本的squid的替代方案,以在相同的服务器成本下提供更好的缓存效果,Varnish更是作为CDN缓存服务器的可选服务之一. 根据官网的介绍,Varnish的主要特性如下:http

varnish缓存代理

1)Varnish简介: varnish缓存是web应用加速器,同时也作为http反向缓存代理.你可以安装varnish在任何http的前端,同时配置它缓存内容.与传统的 squid 相比,varnish具有性能更高.速度更快.管理更加方便等诸多优点.有一部分企业已经在生产环境中使用其作为旧版本的squid的替代方案,以在相同的服务器成本下提供更好的缓存效果,Varnish更是作为CDN缓存服务器的可选服务之一. 根据官网的介绍,Varnish的主要特性如下:https://www.varnis

Web架构:varnish缓存代理服务器超详细剖析

小生博客:http://xsboke.blog.51cto.com 小生 Q Q:1770058260 -------谢谢您的参考,如有疑问,欢迎交流 目录 varnishi简介 varnish配置组成 --------------------------------------  vcl内置预设变量 --------------------------------------  功能语句与对象 --------------------------------------  varnish中内置

varnish缓存系统基础知识

缓存系统类型 1.页面缓存/pageCache     缓存静态资源(html js css image)  例如:varnish    squid 2.数据缓存/dataCache      缓存应用程序在数据库中查询到的数据结果 例如:redis  memcache 缓存系统一般是key/value类型 缓存只是缓存读请求,写操作不能缓存.在hash表中查询有o(1)的查询效率,在30条数据和30万条数据中匹配一条数据的效率是一样的 衡量缓存命中率: 1.请求命中次数      2.命中的字