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

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

  1. 调用 pass 函数,从后端服务器调用数据。
  2. 调用 pipe 函数,建立客户端和后端服务器之间的直接连接,从后端服务器调用数据。
  3. 调用lookup函数,从缓存中查找应答数据并返回,如果查找不到,则调用pass函数从后端服务器
  4. 调用数据 。

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

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

在理解这几个问题前,需要先理解另外一些概念:

  1. http 建立连接的过程
  2. http 请求的类型:get post head

先说http建立连接的过程(我只写下大概,因为不是本文的重心,具体的请另外上网查):

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

HTTP 请求的类型:

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

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

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

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

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

  1. pass和pipe都从后端服务器取数据,它们之间有什么不同呢?
  2. 什么情况下用pass,什么情况下用pipe呢?
  3. 什么样的数据会被缓存在varnish中呢?
  1. 问:pass和pipe都从后端服务器取数据,它们之间有什么不同呢?
  2. 答:当vcl_recv调用 pass 函数时,pass将当前请求直接转发到后端服务器。而后续的请求仍然
  3. 通过varnish处理。
  4. 例如,建立了HTTP连接之后,客户端顺序请求 a.css 、a.png两个文件,“当前请求”指的是第一个
  5. 请求,即a.css,a.css被直接转发到后端服务器,不被缓存。而后续的a.png则再由varnish来做
  6. 处理,varnish会判断a.png 如何处理。
  7. 总结:一个连接中除了当前请求,其它请求仍然按照正常情况由varnish处理。
  8. 而pipe模式则不一样,当vcl_recv判断 需要调用 pipe 函数时,varnish会在客户端和服务器之
  9. 间建立一条直接的连接 ,之后客户端的所有请求都直接发送给服务器,绕过varnish,不再由varnish
  10. 检查请求,直到连接断开。
  1. 什么情况下用pass,什么情况下用pipe呢?
  2. 答:pass 通常只处理静态页面。即只在GET 和 HEAD 类型的请求中时才适合调用pass函数。
  3. 另外,需要注意的一点是,pass模式不能处理POST请求,为什么呢?因为POST请求一般是发送
  4. 数据给服务器,需要服务器接收数据,并处理数据,反馈数据 。是动态的,不作缓存。
  5. 示例代码如下:
  6. if (req.request !="GET" && req.request != "HEAD")
  7. {
  8. return (pipe);
  9. }
  10. 那什么情况下用pipe?由以上陈述可以知,类型是POST时用pipe,但是也许还不太清晰。举个例子,
  11. 当客户端在请求一个视频文件时,或者一个大的文档,如.zip .tar 文件,就需要用pipe模式,
  12. 这些大的文件是不被缓存在varnish中的。
  1. 什么样的数据会被缓存在varnish中呢?
  2. 答:varnish只缓存静态数据。在网上搜到的varnish缓存策略,可以解答这个问题:
  3. varnish缓存策略
  4. 缺省是根椐后端返回的http状态码决定是否缓存。可以缓存的状态码如下:
  5. 200
  6. 203
  7. 300
  8. 301
  9. 302
  10. 410
  11. 404
  12. varnish现在还不支持ranges请求,所以不会缓存206状态的结果。
  13. 管理员可以在vcl的配置文件中的vcl_fetch部分,加入自已的缓存策略,方法是修改beresp.cacheable变量。下面的例子,看后端返回中如果设置了cookie,则不缓存:
  14. sub fetch {
  15. if (beresp.http.Set-Cookie) {
  16. set beresp.cacheable = false;
  17. }
  18. }
  19. 参考文章:http://blog.sina.com.cn/s/blog_5374d6e30100tupo.html

文章末尾总结:学技术不要死扣中文文档,多看英文文档会比较有帮助 。

本文出自 “YEELONⒼ” 博客,请务必保留此出处http://yeelone.blog.51cto.com/1476571/772369

varnish pipe 和pass的区别分析的更多相关文章

  1. C++中关于[]静态数组和new分配的动态数组的区别分析

    这篇文章主要介绍了C++中关于[]静态数组和new分配的动态数组的区别分析,很重要的概念,需要的朋友可以参考下 本文以实例分析了C++语言中关于[]静态数组和new分配的动态数组的区别,可以帮助大家加 ...

  2. Java中Comparable和Comparator接口区别分析

    Java中Comparable和Comparator接口区别分析 来源:码农网 | 时间:2015-03-16 10:25:20 | 阅读数:8902 [导读] 本文要来详细分析一下Java中Comp ...

  3. Oracle nvchar2和varchar2区别分析

    Oracle nvchar2和varchar2区别分析: [注意]VARCHAR2是Oracle提供的特定数据类型,Oracle可以保证VARCHAR2在任何版本中该数据类型都可以向上和向下兼容.VA ...

  4. jQuery中的.bind()、.live()和.delegate()之间区别分析

    jQuery中的.bind()..live()和.delegate()之间区别分析,学习jquery的朋友可以参考下.   DOM树   首先,可视化一个HMTL文档的DOM树是很有帮助的.一个简单的 ...

  5. jQuery中的bind() live() delegate()之间区别分析

    jQuery中的bind() live() delegate()之间区别分析 首先,你得要了解我们的事件冒泡(事件传播)的概念,我先看一张图 1.bind方式 $('a').bind('click', ...

  6. addEventListener()及attachEvent()区别分析

    Javascript 的addEventListener()及attachEvent()区别分析 Mozilla中: addEventListener的使用方式: target.addEventLis ...

  7. C# Parse和Convert的区别分析

    原文:C# Parse和Convert的区别分析 大家都知道在进行类型转换的时候有连个方法供我们使用就是Convert.to和*.Parse,但是疑问就是什么时候用C 什么时候用P 通俗的解释大家都知 ...

  8. jquery中attr和prop的区别分析

    这篇文章主要介绍了jquery中attr和prop的区别分析的相关资料,需要的朋友可以参考下 在高版本的jquery引入prop方法后,什么时候该用prop?什么时候用attr?它们两个之间有什么区别 ...

  9. ql语句中left join和inner join中的on与where的区别分析

    sql语句中left join和inner join中的on与where的区别分析   关于SQL SERVER的表联接查询INNER JOIN .LEFT JOIN和RIGHT JOIN,经常会用到 ...

随机推荐

  1. AD9各种布线总结

    1.常规布线:不详细说了,是个人就知道怎么弄.需要说明的是在布线过程中,可按小键盘的*键或大键盘的数字2键添加一个过孔:按L键可以切换布线层:按数字3可设定最小线宽.典型线宽.最大线宽的值进行切换. ...

  2. [.net] 无法创建虚拟目录。已将URL“XXX”映射到IIS Express网站上的一个不同的文件夹

    工作时,在修改项目属性,Web中服务器时,出现了下面的错误: 各种折腾后,找到下面的解决方法: 1.找到项目在本地的目录,目录下有当前项目的项目文件,文件名以.csproj为后缀名. 2.用文本编辑软 ...

  3. pyodbc

  4. hive一些思考

    Hive查询 1.hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供完整的sql查询功能,可以将sql语句转换为MapReduce任务进行运行.其优点是学习 ...

  5. 【总结整理】JQuery基础学习---DOM篇

    前言: 先介绍下需要用到的浏览器提供的一些原生的方法(这里不处理低版本的IE兼容问题) 创建流程比较简单,大体如下: 创建节点(常见的:元素.属性和文本) 添加节点的一些属性 加入到文档中 流程中涉及 ...

  6. Angular11 模板表单、响应式表单(自定义验证器)、HTTP、表单元素双向绑定

    1 模板表单 模型通过指令隐式创建 技巧01:需要在模块级别引入 FormsModule ,通常在共享模块中引入再导出,然后在需要用到 FormsModule 的模块中导入共享模块就可以啦 impor ...

  7. centos6.x禁用ipv6的方法

    注意可能有两个网卡的情况,修改当前网卡才有效. cd /etc/sysconfig/network-scripts/ ls ifcfg-Auto_eth0 ifcfg-eth0 现在ipv6没流行,几 ...

  8. glib-2.40编译安装

    1 安装glib库所需要的依赖库: libffi-.tar.gz glib-.tar.xz 安装依赖库libffi: tar xf libffi-.tar.gz cd libffi- ./config ...

  9. HTML5学习笔记(七)HTML5 服务器发送事件(Server-Sent Events)

    Server-Sent 事件指的是网页自动获取来自服务器的更新. 以前也可能做到这一点,前提是网页不得不询问是否有可用的更新.通过服务器发送事件,更新能够自动到达. EventSource 对象用于接 ...

  10. EasyOffice-.NetCore一行代码导入导出Excel,生成Word

    简介 Excel和Word操作在开发过程中经常需要使用,这类工作不涉及到核心业务,但又往往不可缺少.以往的开发方式在业务代码中直接引入NPOI.Aspose或者其他第三方库,工作繁琐,耗时多,扩展性差 ...