varnish pipe 和pass的区别分析

这两天在学习varnish,在学到vcl时,不理解pipe和pass的区别以及如何区分加以应用。经过两天的搜索,总算是理清了概念。如今记录在博客上跟你们分享。css

  当 vcl_recv 函数接收到请求时,它要判断如何处理这个请求。有三种状况 :html

 

调用 pass 函数,从后端服务器调用数据。  调用 pipe 函数,创建客户端和后端服务器之间的直接链接,从后端服务器调用数据。  调用lookup函数,从缓存中查找应答数据并返回,若是查找不到,则调用pass函数从后端服务器调用数据 。

 

在这里,我就有几个疑惑:后端

pass和pipe都从后端服务器取数据,它们之间有什么不一样呢?  什么状况下用pass,什么状况下用pipe呢?  什么样的数据会被缓存在varnish中呢?

在理解这几个问题前,须要先理解另一些概念:浏览器

 

http 创建链接的过程   http 请求的类型:get post head

先说http创建链接的过程(我只写下大概,由于不是本文的重心,具体的请另外上网查):缓存

 

当浏览器想要得到一个网页内容时,如在浏览器输入www.google.com。  这时浏览器开始跟服务器创建链接,先执行三次握手,确认创建链接。  以后浏览器会发送请求,一个网页包含多个内容,如图片,正文,html代码,css代码,js代码。若是在html 1.0版本中,请求一个文件是须要创建一次链接的,多个请求多个链接。开销是很大的。而在HTML 1.1中,具备了长链接的特性,容许在keep-live 时间内保持链接,在这段时间内无须再创建链接就能够发送多个请求。  请求完成 或 keep-live时间到限,链接断开。

HTTP 请求的类型:服务器

 

HTTP 请求的类型有几种,下面是主要的几种:   GET : 请求指定的页面信息,并返回实体主体。  HEAD: 只请求页面的首部。  POST: 请求服务器接受所指定的文档做为对所标识的URI的新的从属实体。

说白了,请求一个静态的HTML页面就是用get类型,而若是你在新浪微博上发一条微博,其实就是post 类型。cookie

总结来讲,get是请求相关URI并接受服务器的返回数据。为了接收数据。ide

post是发送数据给服务器,服务器须要对这些数据作相应的处理。为了发送数据。函数

 

以上都明白的话,就能够解答这三个问题了:post

 

pass和pipe都从后端服务器取数据,它们之间有什么不一样呢?    什么状况下用pass,什么状况下用pipe呢?    什么样的数据会被缓存在varnish中呢?

 

问:pass和pipe都从后端服务器取数据,它们之间有什么不一样呢?  答:当vcl_recv调用 pass 函数时,pass将当前请求直接转发到后端服务器。然后续的请求仍然经过varnish处理。 例如,创建了HTTP链接以后,客户端顺序请求 a.css 、a.png两个文件,“当前请求”指的是第一个请求,即a.css,a.css被直接转发到后端服务器,不被缓存。然后续的a.png则再由varnish来作处理,varnish会判断a.png 如何处理。 总结:一个链接中除了当前请求,其它请求仍然按照正常状况由varnish处理。  而pipe模式则不同,当vcl_recv判断 须要调用 pipe 函数时,varnish会在客户端和服务器之间创建一条直接的链接 ,以后客户端的全部请求都直接发送给服务器,绕过varnish,再也不由varnish检查请求,直到链接断开。

 

什么状况下用pass,什么状况下用pipe呢?  答:pass 一般只处理静态页面。即只在GET 和 HEAD 类型的请求中时才适合调用pass函数。另外,须要注意的一点是,pass模式不能处理POST请求,为何呢?由于POST请求通常是发送数据给服务器,须要服务器接收数据,并处理数据,反馈数据 。是动态的,不做缓存。 示例代码以下: if (req.request !="GET" && req.request != "HEAD") {               return (pipe);       }       那什么状况下用pipe?由以上陈述能够知,类型是POST时用pipe,可是也许还不太清晰。举个例子,当客户端在请求一个视频文件时,或者一个大的文档,如.zip .tar 文件,就须要用pipe模式,这些大的文件是不被缓存在varnish中的。

 

什么样的数据会被缓存在varnish中呢?   答:varnish只缓存静态数据。在网上搜到的varnish缓存策略,能够解答这个问题: varnish缓存策略  缺省是根椐后端返回的http状态码决定是否缓存。能够缓存的状态码以下: 200    203    300    301    302    410    404     varnish如今还不支持ranges请求,因此不会缓存206状态的结果。  管理员能够在vcl的配置文件中的vcl_fetch部分,加入自已的缓存策略,方法是修改beresp.cacheable变量。下面的例子,看后端返回中若是设置了cookie,则不缓存:  sub fetch {      if (beresp.http.Set-Cookie) {         set beresp.cacheable = false;     } } 参考文章:http://blog.sina.com.cn/s/blog_5374d6e30100tupo.html
相关文章
相关标签/搜索