• varnish--vcl


    Varnish Configuration Language - VCLvarnish配置语言-VCL

             Varnish有一个很棒的配置系统,大部分其他的系统使用配置指令,让您打开或者关闭一些开关。Varnish使用区域配置语言,这种语言叫做“VCL”(varnish configuration language),在执行vcl时,varnish就把VCL转换成二进制代码。
             VCL文件被分为多个子程序,不同的子程序在不同的时间里执行,比如一个子程序在接到请求时执行,另一个子程序在接收到后端服务器传送的文件时执行。    
    varnish将在不同阶段执行它的子程序代码,因为它的代码是一行一行执行的,不存在优先级问题。随时可以调用这个子程序中的功能并且当他执行完成后就退出。
           如果到最后您也没有调用您的子进程中的功能,varnish将执行一些内建的VCL代码,这些代码就是default.vcl中被注释的代码。
           99%的几率您需要改变vcl_recv 和 vcl_fetch这两个子进程。
           vcl_recv
                  vcl_recv(当然,我们在字符集上有点不足,应为它是unix)在请求的开始被调用,在接收、解析后,决定是否响应请求,怎么响应,使用哪个后台服务器。
                  在vcl_recv中,您可以修改请求,比如您可以修改cookies,添加或者删除请求的头信息。
                  注意vcl_recv中只有请求的目标,req is available。
           vcl_fetch
                  vcl_fetch在一个文件成功从后台获取后被调用,他的任务就是改变响应的头文件,触发ESI进程,在后台服务器轮询尝试失败的请求。
                  在vcl_fetch中一样的包含请求的目标,req,available,哪里通常是backend response,beresp.beresp将会包含后端服务器的HTTP的头信息
           actions
           主要有以下动作
                  pass              \当一个请求被pass后,这个请求将通过varnish转发到后端服务器,但是它不会被缓存。pass可以放在vcl_recv 和 vcl_fetch中。
                  lookup           \当一个请求在vcl_recv中被lookup后,varnish将从缓存中提取数据,如果缓存中没有数据,将被设置为pass,不能在vcl_fetch中设置lookup。
                  pipe              \pipe和pass相似,都要访问后端服务器,不过当进入pipe模式后,在此连接未关闭前,后续的所有请求都发到后端服务器(这句是我自己理解后简化的,有能力的朋友可以看看官方文档,给我提修改建议)。
                  deliver           \请求的目标被缓存,然后发送给客户端
                  esi          \ESI-process the fetched document(我理解的就是vcl中包换一段html代码)
           RequestsResponses and objects
                  在VCL中,有3个重要的数据结构
                  request 从客户端进来
            responses 从后端服务器过来
                  object 存储在cache中
                  在VCL中,你需要知道以下结构
                  req         \请求目标,当varnish接收到一个请求,这时req object就被创建了,你在vcl_recv中的大部分工作,都是在req object上展开的。
                  beresp          \后端服务器返回的目标,它包含返回的头信息,你在vcl_fetch中的大部分工作都是在beresp object上开展的。
                  obj         \被cache的目标,只读的目标被保存于内存中,obj.ttl的值可修改,其他的只能读。
           Operaors
                  VCL支持一下运算符,请阅读下面的例子:
                  =                   \赋值运算符
                  ==                 \对比
                  ~                   \匹配,在ACL中和正则表达式中都可以用
                  !                  \否定
                  &&                 \逻辑与
                  ||                   \逻辑或
          
           EXAMPLE 1 – manipulation headers
                  我们想要取消我们服务器上/images目录下的所有缓存:
    sub vcl_recv {
    if (req.url ~ "^/images") {
    unset req.http.cookie;
    }
    }
    现在,当这个请求在操作后端服务器时,将不会有cookie头,这里有趣的行是 if-statement,它匹配URL,如果匹配这个操作,那么头信息中的cookie就会被删除。
           EXAMPLE 2 – manipulation beresp
                  从后端服务器返回对象的值满足一些标准,我们就修改它的TTL值:
    sub vcl_fetch {
       if (beresp.url ~ ".(png|gif|jpg)$") {
         unset beresp.http.set-cookie;
         beresp.ttl = 3600;
      }
    }
           EXAMPLE3-ACLs
                  你创建一个VCL关键字的访问控制列表。你可以配置客户端的IP地址
                  # Who is allowed to purge....
                  acl local {
                      "localhost";
                      "192.168.1.0"/24; /* and everyone on the local network */
                      ! "192.168.1.23"; /* except for the dialin router */
                  }
      
                  sub vcl_recv {
                     if (req.request == "PURGE") {
                      if (client.ip ~ local) {
                         return(lookup);
                      }
                    }
                  }
                 
                  sub vcl_hit {
                     if (req.request == "PURGE") {
                       set obj.ttl = 0s;
                       error 200 "Purged.";
                      }
                  }
                 
                  sub vcl_miss {
                    if (req.request == "PURGE") {
                      error 404 "Not in cache.";
                    }
                  }
     
     
    参考资料:http://blog.csdn.net/wangpengqi/article/details/8900896
  • 相关阅读:
    Java实现 LeetCode 467 环绕字符串中唯一的子字符串
    Java实现 LeetCode 467 环绕字符串中唯一的子字符串
    从ramdisk根文件系统启动Linux成功
    linux中的设备名称和设备号
    设备与驱动的关系以及设备号、设备文件
    使用BusyBox制作Linux根文件系统
    使用Busybox-1.2.0制作根文件系统
    使用BusyBox制作根文件系统
    使用busybox制作rootfs
    uboot里读sd卡内容
  • 原文地址:https://www.cnblogs.com/wjoyxt/p/4933142.html
Copyright © 2020-2023  润新知