Varnish基础概念详解(2)

上游服务器缓存的是图片,但是图片中加了cookie ,图片一般而言跟用户的关联不是很大,除非是邮件服务器,虽然图片的关联不大,但是加了cookie,就没办法在多个用户之间共享缓存,那这种情况下需要将cookie删掉,将图片缓存,并且缓存很长时间

所以这些处理机制都需要在内部完成策略的,所以这些都需要在不同的步骤完成

所以所谓的状态引擎就是当一个用户的请求到达后,大致走到哪一层,我们在哪个步骤哪个位置大致做出哪些处理,这就为状态

在请求的报文在大致经过的位置,内置了几个状态引擎,在用户的请求到达状态引擎的时候,我们在其状态引擎上做规则并做出相应处理

状态引擎图解

Varnish基础概念详解

椭圆形为状态引擎

菱形的为条件判断

每个颜色箭头下面的字符串为处理机制

首先用户请求到达后,首先进入vcl_recv

vcl_recv对其做判断,是否命中缓存(vcl_hash)

如果不想使用缓存则直接交由vcl_pipe,建立管道并交由后端服务器

如果期望本地缓存处理则自定义检测缓存lookup

很显然,如果要检查缓存是需要根据什么方式做检查

判断缓存中是否存在对象 ,如果命中了yes 于是交予vcl_hit

就算命中了也有两条路可以走:

·deliver 直接由vcl_deliver在缓存中取出直接返回至用户

·如果命中了交予给vcl_pass 通过自行手动控制了到后端缓存中去取的数据,有些时候有独特的控制机制

而vcl_miss也可以交由vcl_pass来处理

而为什么使用pass

如果我们期望处理缓存的,比如要清理缓存,缓存中的内容找到则清理,如果没有找到则通过pass做一些处理

仅仅是提供用户编辑一些规则的而已

如果未命中,很先让必然要到后端去取vcl_fatch

取完之后是否缓存下来就是在fatch中定义的

如果要缓存就先放着cache中,如果不想缓存则Dont'Cache

最后再响应至客户端

因此用户请求到达varnish之后,varnish大致要经过以上的处理阶段,而每个处理阶段要自定义处理规则对其做出处理,而有些功能只能在后端实现,有些只能在前端,不同的规则要在不同的位置实现的

VCL_RECV

vcl_recv是在Varnish完成对请求报文的解码为基本数据结构后第一个要执行的子例程,它通常有四个主要用途:
(1)修改客户端数据以减少缓存对象差异性;比如删除URL中的等字符;
(2)基于客户端数据选用缓存策略;比如仅缓存特定的URL请求、不缓存POST请求等;
(3)为某web应用程序执行URL重写规则;
(4)挑选合适的后端Web服务器;

可以使用下面的终止语句,即通过return()向Varnish返回的指示操作:
pass:绕过缓存,即不从缓存中查询内容或不将内容存储至缓存中;
pipe:不对客户端进行检查或做出任何操作,而是在客户端与后端服务器之间建立专用“管道”,并直接将数据在二者之间进行传送;此时,keep-alive连接中后续传送的数据也都将通过此管道进行直接传送,并不会出现在任何日志中;
lookup:在缓存中查找用户请求的对象,如果缓存中没有其请求的对象,后续操作很可能会将其请求的对象进行缓存;
error:由Varnish自己合成一个响应报文,一般是响应一个错误类信息、重定向类信息或负载均衡器返回的后端web服务器健康状态检查类信息;

vcl_recv也可以通过精巧的策略完成一定意义上的安全功能,以将某些特定的攻击扼杀于摇篮中。同时,它也可以检查出一些拼写类的错误并将其进行修正等。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/22c96ff40c76c1088e2a102b231247f7.html