• varnish pipe 和pass的区别分析


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

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

     

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

     

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

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

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

     

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

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

     

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

    HTTP 请求的类型:

     

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

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

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

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

     

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

     

    1. pass和pipe都从后端服务器取数据,它们之间有什么不同呢?  
    2.   
    3. 什么情况下用pass,什么情况下用pipe呢?  
    4.   
    5. 什么样的数据会被缓存在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.  
    9. 而pipe模式则不一样,当vcl_recv判断 需要调用 pipe 函数时,varnish会在客户端和服务器之
    10. 间建立一条直接的连接 ,之后客户端的所有请求都直接发送给服务器,绕过varnish,不再由varnish
    11. 检查请求,直到连接断开。 

     

    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.  
    5. 缺省是根椐后端返回的http状态码决定是否缓存。可以缓存的状态码如下: 
    6. 200    
    7. 203    
    8. 300    
    9. 301    
    10. 302    
    11. 410    
    12. 404    
    13.  
    14. varnish现在还不支持ranges请求,所以不会缓存206状态的结果。 
    15.  
    16. 管理员可以在vcl的配置文件中的vcl_fetch部分,加入自已的缓存策略,方法是修改beresp.cacheable变量。下面的例子,看后端返回中如果设置了cookie,则不缓存: 
    17.  
    18. sub fetch { 
    19.  
    20.     if (beresp.http.Set-Cookie) { 
    21.         set beresp.cacheable = false
    22.     } 
    23. 参考文章:http://blog.sina.com.cn/s/blog_5374d6e30100tupo.html 

     

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

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

  • 相关阅读:
    C++中对C的扩展学习新增语法——lambda 表达式(匿名函数)
    C++中对C的扩展学习新增语法——内联函数以及函数参数
    C++中对C的扩展学习新增语法——For循环以及AUTO类型
    C++中对C的扩展学习新增语法——强枚举
    C++中对C的扩展学习新增语法——引用
    C++中对C的扩展学习新增语法——const
    C++中对C的扩展学习新增语法——强制类型转换
    3. Longest Substring Without Repeating Characters
    2. Add Two Numbers
    策略模式
  • 原文地址:https://www.cnblogs.com/moqiang02/p/4061236.html
Copyright © 2020-2023  润新知