varnish的Backend storage的管理

简介:

  varnish缓存服务器是工作在代理模式的。意思是说,由varnish接收用户的请求,把用户请求资源的URL做“哈唏”编码后,做为“键”与缓存条目中的键做比对:

    1、如果,缓存条目有一模一样的键的话,那么该键对应的值就是用户请求URL对应的资源,

       varnish把该键对应的值取出来,响应给客户端。

    2、如果,缓存条目没有与之匹配的键的话,那么varnish 就向后端服务器(backup server)发送

       请求。当后端服务器(backup server )构建完响应报文响应varnish,varnish服务器收到后端

       服务器(backup server)的响应后,会把:用户请求的URL做“哈唏”编码后,

       作为键(key),该URL对应的资源作为值(value),保存在varnish的缓存中。

       这就是所谓的,插入缓存条目。 varnish的缓存条目是:key:value 方式存在的。

       然后,varnish再构建响应报文响应客户端。

这就是,varnish 缓存服务器的正常工作流程。

如下图所示:

wKioL1QkITWRXjylAALLTNOHn-Y023.jpg

那么如何实现varnish缓存的管理呢?

1、varnish接收用户请求后,是如何根据用户请求的报文来决定是否查找缓存的呢?

   由上图所知。当 varnish 服务器接收到用户请求后,分析用户请求的 URL 是否符合缓存标准,再查找缓存。这样是为了避免花费在与缓存条目比对的时间。如果,缓存条目较多的话,做缓存比对也是需要很长时间的。varnish通过如下方式,控制那些URL可以查找缓存的:

    varnish 在vcl_recv状态引擎定义策略,怎么样处理用户的请求的。如:varnish 处理的客户端请求的标准、如果判断是否查找缓存的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
sub vcl_recv {
     # varnish 在vcl_recv状态引擎定义的策略来控制,varnish服务器只处理指定http协议请求资源的方法,的URL
    if  (req.request !=  "GET"  &&
       req.request !=  "HEAD"  &&
       req.request !=  "PUT"  &&
       req.request !=  "POST"  &&
       req.request !=  "TRACE"  &&\
       req.request !=  "OPTIONS"  &&
       req.request !=  "DELETE" ) {
         /* Non-RFC2616 or CONNECT  which  is weird. */
         return  (pipe);  -----> 用户请求的访问的服务虽然是:tcp /80  但是,varnish不处理除了,GET、HEAD、PUT、POST、TRACE、OPTIONS、DELETE请求资源的方法。直接让该请求把该请求交给backup server.
     }
 
     # 再使用下述策略来过滤用户请求资源时所使用的方法;判断用户请求资源时使用的方法不是:GET、HEAD 就绕过查找缓存的操作
     if  (req.request !=  "GET"  && req.request !=  "HEAD" ) {
         /* We only deal with GET and HEAD by default */
         return  (pass);  -----> 绕过查找缓存操作,varnish直接向 backup server 请求资源
     }
     # 使用vcl_recv状态引擎判断用户的请求,都不符合上述:if 条件。那么该用户请求资源所使用的方法一定是:GET或HEAD。但是如果用户访问的是资源,需要通过口令认证
     # 才可以访问的。用户请求该资源使用的也是"GET"方法。该用户请求的URL是不需要查找缓存的。
     if  (req.http.Authorization || req.http.Cookie) {
        /* Not cacheable by default */
         return  (pass);   -----> 绕过查找缓存操作,varnish直接向 backup server 请求资源
     }
 
     return  (lookup);  ------> 查找缓存
}

说明:

    varnish 有很多内置变量保存了,http协议报文的信息。通过使用if判断这些信息,来控制varnish是如何使用缓存的。

    如:

1
2
3
4
5
6
7
8
req.url            ------> 记录用户请求的URL
req.request        -------> 记录了用户请求资源使用的方法
req.http.HEADER    -------> 记录了用户请求报文的首部。该变量是可写的。如:req.http.hostreq.restarts          ------->  请求被重启的次数
server.ip             -------> varnish 的IP地址
server.port           -------> varnish 监听的端口
server. hostname        -------> 服务器的主机名
client.ip             -------> 客户端IP
req.backend           -------> 如果,未从缓存中命中。该请求分调度到后端的那个服务器。

例:

   当用户访问指定页面时,禁止查询缓存

1
2
3
4
5
6
7
8
      sub vcl_recv {
         ...
         if  (req.url ~  "/images/a.jpg$"  ) {
             return  (pass);
         }
 
         return  (lookup);
     }

2、当缓存没有命中(cache miss)如何控制 varnish 向缓存中插入缓存条目时,该缓存条目的过期时长呢?

使用 varnish  缓存服务器提供的:vcl_fetch 状态引擎来控制是否向缓存中插入缓存条目的。

如:

1
2
3
4
5
6
7
sub vcl_recv {
       ....
            if  (req.request ==  "GET"  && req.request ~  "\.png$" ) {
           set  beresp.ttl = 10s;
       }
       ....
}

3、如何修剪(删除)缓存条目呢?

使用 varnish 提供 purge指令来清除不需要的缓存

如:

(1)、为了安全,对操作清除缓存条目的指令的用户做限制

只允许下述用户修剪缓存条目

1
2
3
4
    acl purgers {
    "127.0.0.1" ;
    "172.16.13.0" /24 ;
}

(2)、在vcl_recv 状态引擎,放行purge请求方法查询缓存

1
2
3
4
5
6
7
8
9
10
sub vcl_recv {
。。。
  if  (req.request ==  "PURGE" ) { ----------> 开放用户请求资源使用 purgers 方法,
      if  ( client.ip !~ purgers ) {  ------> 检测发起 PURGE 方法的用户来源,只允许属于purgers的用户的请求查询缓存
            error 405  "Method not allowed" ;
       }
           return  (lookup);  --------> 查询缓存
   }
 
}

(3)、当缓存命中(cache hit)就执行varnish 的purge清除(修剪)缓存条目的指令

1
2
3
4
5
6
7
sub vcl_hit {
      if  (req.request ==  "PURGE" ) {
         purge; ----------> 执行varnish 修改缓存的指令
         error 200  "Purged" ;   ----> 合成状态码,和“原因短语”
     
      return  (deliver);
  }

(4)、使用【curl】指定使用PURGE方法访问指定的资源,实现缓存修剪

如:

1
curl -X PURGE http: //172 .16.13.1 /index .html

说明:

 

4、定义缓存大小; 

1
2
3
[root@haproxy2 ~] # vim /etc/sysconfig/varnish
VARNISH_STORAGE_SIZE=64M  ----> 定义缓存大小
VARNISH_STORAGE= "malloc,${VARNISH_STORAGE_SIZE}"  ---> 明确指定varnish使用内存做为缓存。




     本文转自成长的小虫 51CTO博客,原文链接:http://blog.51cto.com/9528du/1558272 ,如需转载请自行联系原作者


相关文章
|
1月前
|
存储 负载均衡 前端开发
slb的Backend Server Group 或 BackendServer
slb的Backend Server Group 或 BackendServer
13 3
|
3月前
|
缓存 前端开发 搜索推荐
Service Worker cache 与 HTTP cache 相比的优势所在
Service Worker cache 与 HTTP cache 相比的优势所在
43 0
|
3月前
|
存储 缓存 JavaScript
Service Worker Cache 和 HTTP Cache 的对比
Service Worker Cache 和 HTTP Cache 的对比
26 0
|
7月前
|
缓存 前端开发 JavaScript
Service Worker Cache 和 HTTP Cache 的区别
Service Worker Cache 和 HTTP Cache 的区别
56 1
|
7月前
|
缓存
Service Worker Cache 和 HTTP Cache 联合使用的场景讨论
Service Worker Cache 和 HTTP Cache 联合使用的场景讨论
42 0
|
9月前
|
存储 Web App开发 移动开发
📕Local Storage、Session Storage和Cache Storage之间的区别
你知道什么是Cache Storage、Local Storage和Session Storage吗?它们都是一些可以在你的浏览器里保存信息的介质,但是它们有什么不同呢?🤔
355 0
📕Local Storage、Session Storage和Cache Storage之间的区别
|
存储 Kubernetes 测试技术
emptyDir、hostPath以及local volume都是Kubernetes的本地存储卷,那么有何不同?
Kubernetes支持几十种类型的后端存储卷,其中有几种存储卷总是给人一种分不清楚它们之间有什么区别的感觉,尤其是local与hostPath这两种存储卷类型,看上去都像是node本地存储方案嘛。当然,还另有一种volume类型是emptyDir,也有相近之处。
2815 0
|
缓存 应用服务中间件 nginx
Nginx 学习笔记(三)proxy_cache 缓存配置和ngx_cache_purge模块
反向代理的缓存清理 一、proxy_cache配置 (1)如何配置和安装,都在这里了:https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Nginx/Nginx-Web/Nginx-8-proxy_cache.
2876 0
|
存储 缓存 块存储
Ceph Cache tier配置
简单了解Cache tier Cache tier 是Ceph服务端缓存的一种方案可以提升存储在后端存储层的I/O性能Cache tier 的创建需要一个由高速而昂贵的存储设备如SSD组成的存储池作为缓存层以及一个相对廉价设备组成的后端存储池作为经济存储层。
6915 0