Varnish的VCL子程序


以下内容参考:
http://book.varnish-software.com/4.0/

VCL子进程,在其中定制Varnish的行为。VCL子例程可用于:添加自定义标头,更改Varnish错误消息的外观,在Varnish中添加HTTP重定向功能,清除内容以及定义缓存对象的哪些部分是唯一的。
注意:强烈建议尽可能让默认的内置子程序。内置子程序的设计考虑到安全性,这通常意味着它们可以合理的方式处理VCL代码中的任何缺陷。

vcl_recv

    规范化客户端输入选择一个后端Web服务器重新编写Web应用程序的客户端数据根据客户端输入决定缓存策略访问控制列表(ACL)安全屏障,例如针对SQL注入攻击修复错误,例如index.htlm- >index.html

vcl_recv是Varnish第一个VCL子进程,将客户端请求解析为其基本数据结构之后执行。 vcl_recv有四个主要用途:

    修改客户端数据以减少缓存的多样性。决定使用哪个Web服务器。根据客户端数据决定缓存策略。执行特定Web应用程序所需的重写规则。

在vcl_recv你可以执行以下终止操作:

    pass:它通过缓存查找,但它执行Varnish请求流的其余部分。 pass不会将来自后端的响应存储在缓存中。pipe:此操作创建一个全双工管道,将客户端请求转发到后端,且不查看其内容。后端回复被转发回客户端且不缓存其内容。由于Varnish不再尝试将内容映射到请求上,因此任何子进程的请求发送给活动连接将被通过pipe转发。pipe请求不会出现在任何日志中。hash:它在缓存中查找请求。purge:它在缓存中查找请求以便删除它。synth -从Varnish生成合成响应。这种合成响应通常是一个带有错误信息的网页。 synth也可以用来重定向客户端请求。

同样可以使用vcl_recv来设置以下安全措施。varnish不是入侵检测系统的替代品,但仍可以用来提前阻止一些典型的攻击。简单访问控制列表(ACL)也可以应用到vcl_recv上。
内建的vcl_recv子进程不会缓存所有你想要的,同时也最好不要缓存错误内容而是把它们发送给错误的用户。
重新访问内置的vcl_recv:

    sub vcl_recv {if (req.method == "PRI") {/* We do not support SPDY or HTTP/2.0 */return (synth(405));}if (req.method != "GET" &&req.method != "HEAD" &&req.method != "PUT" &&req.method != "POST" &&req.method != "TRACE" &&req.method != "OPTIONS" &&req.method != "DELETE") {/* Non-RFC2616 or CONNECT which is weird. */return (pipe);}if (req.method != "GET" && req.method != "HEAD") {/* We only deal with GET and HEAD by default */return (pass);}if (req.http.Authorization || req.http.Cookie) {/* Not cacheable by default */return (pass);}return (hash);}

示例:

    基本设备检测sub vcl_recv {if (req.http.User-Agent ~ "iPad" ||req.http.User-Agent ~ "iPhone" ||req.http.User-Agent ~ "Android") {set req.http.X-Device = "mobile";} else {set req.http.X-Device = "desktop";}}

vcl_pass

    进入pass模式是调用sub vcl_pass {return (fetch);}

当上一层子进程返回pass动作后才会调用vcl_pass子进程。这动作的请求是在pass模式中设置的。vcl_pass通常作为一个重要的catch-all,服务于vcl_hit和vcl_miss执行结果。
vcl_pass可能会返回是三个动作:fetch、synth、或者是restart。当返回的的是fetch时,正在进行的请求就采用pass模式。采用pass模式从请求中抓取的对象不被缓存,但会传递到客户端。synth和restart返回的动作会调用相关的子进程。
hit-for-pass

        当一个对象不应该被缓存是使用hit-for-pass对象取代抓取的对象存在TTL一些请求就不应该被缓存,一个典型的例子就是当一个请求页中含有set-cookie响应头部时,且 必须并只能把它递送给所需的客户端。因此你可以告诉varnish创建个hit-for-pass的对象并存储这个对象到缓存,而不是存储抓取的这个对象。分布式的请求被采用pass模式处理。当一个对象不需要被缓存是,beresp.uncacheable变量会设置为true。结果,cacher进程会保持对hit-for-pass对象的hash散列应用。这种情况下,对请求的查找操作会传递给hash来找个hit-for-pass对象。如此类的请求会被vclpass子进程中的pass模式给处理。如同其他缓存对象一样,hit-for-pass对象也有一个TTL(生命周期)。一旦生命周期过了,这个对象就会从缓存上删除。

vcl_backend_fetch

        sub vcl_backend_fetch {return (fetch);}vcl_backend_fetch 可以从vcl_miss或vcl_pass中调用。当vcl_backend_fetch从vcl_miss中调用时,抓取的对象会被缓存。如果vcl_backend_fetch被从vcl_pass中调用时,抓取的对象也不会被缓存的,即使是obj.ttl或obj.keep变量的值比0大。一个相关的变量是bereq.uncacheable,这个变量指示出从后端来的对象请求是否被缓存。当然从pass请求中来的对象是绝不被缓存的。vcl_backend_fetch有俩个可能的终端操作,fetch或abandon。fetch动作发送请求给后动,abandon动作调用vcl_synth子进程。内建vcl_bakend_fetch子进程只返回fetch动作。后端响应被vcl_backend-response还是vcl_backend_error处理取决于响应来之于那个服务。如果Varnish收到语法正确的HTTP响应,则Varnish将控制权交给vcl_backend_response。语法正确的HTTP响应包括HTTP 5xx错误代码。如果Varnish没有收到HTTP响应,则将控制权交给vcl_backend_error。

vcl_hash

    定义什么是唯一的请求vcl_hash终是在vcl_recv后,或者另个子进程范围hash动作关键词。sub vcl_hash {hash_data(req.url);if (req.http.host) {hash_data(req.http.host);} else {hash_data(server.ip);}return (lookup);}

vcl_hash定义要用于缓存对象的hash key。Hash key将一个缓存对象与另一个缓存对象区分开来。默认的VCL为vcl_hash添加主机名或ip地址,同时添加请求的url给cache hash。
vcl_hash的一个用法是在cache hash上添加用户名来识别用户指定的数据。当然缓存用户数据时应该谨慎进行。一个更好的选择可能是hash每个会话缓存对象。
vcl_hash子进程返回lookup操作关键字。不像其他动作关键词,lookup是一个操作,而不是子进程。在vcl_hash后的下个状态取决于在缓存中lookup的查找。
当lookup操作没能匹配到任何hash时,它会创建一个带有busy标志的对象并存储在缓存中。然后,请求会被发送到vcl_miss子进程中。一旦请求被处理busy标志会被删除,并从后端的响应中更新对象。
随后遇到busy标记的对象请求将被发送到等待列表中。这个等待名单旨在提高响应性能,这个在waiting state 选项中有解释。
注意:一个高速缓存散列可以指代一个或多个对象变量。对象变量是基于Vary头域的创建的。在一个缓存散列下保留多个变量是比较好的做法,而不是每个变量创建一个散列。

vcl_hit

    在lookup操作之后执行,调用vcl_hash,找到(hits)在缓存上的对象。sub vcl_hit {if (obj.ttl >= 0s) {// A pure unadultered hit, deliver itreturn (deliver);}if (obj.ttl + obj.grace > 0s) {// Object is in grace, deliver it// Automatically triggers a background fetchreturn (deliver);}// fetch & deliver once we get the resultreturn (fetch);}

vcl_hit子进程通常通过调用含有deliver,restart或者synth的return()来进行终止。
如果对象的TTL+grace time没有过时的话,返回的deliver会控制vcl_deliver。如果过时时间超过了TTL,但没有超过TTL+grace time,deliver会调用与vcl_deliver同步的background fetch。background fetch是一种异步调用,用来插入一个新的请求对象到缓存中。grace time会在grace模式选项中有解释。
restart重启传输,并增加重启计数器设定值。如果重启的次数比max_restarts设定的值要大,varnish会发出一个guru mediation的错误。
synth(status code,reason)返回指定状态码给客户端并丢弃请求。

vcl_miss

    如果一个请求对象没有被lookup操作找到时子进程会被调用。包含有是否尝试从后端检索文档以及使用那个后端的策略。sub vcl_miss {return (fetch);}

子进程vcl_hit和vcl_miss是相关的。你很少调用他们,因为HTTP请求投吧的修改通常是在vcl_recv中进行。但是,如果你不希望发送X-Varnish头部给后端服务,你可以把它移动动vcl_miss或vcl_pass中。基于这种情况,你可以使用unset bereq ,http,x-varnish。

vcl_deliver

    所有请求流程的公共最后退出点,除了通过vcl_pipe的请求。经常用于添加和移除debug-headers。sub vcl_deliver {return (deliver);}

vcl_deliver子进程是简单的,同样也是对修改varnish的输出很有用的。如果你需要删除一个头部,或添加一个不应该存储在cache中的头部,vcl_deliver可以胜任这个工作。
在vcl_deliver中常用的且被可被修改的变量是:

    resp.http.*:发送个客户端的头部,它们可以被set和unset。resp.status:状态码为200,404,503等resp.reason:被返回给客户端的http状态信息obj.hit:在对象上的cache-hits的数。因此,0代表miss,可以评估这个变量来轻松地显示响应是来自缓存命中还是未命中。req.restarts:在VCL中发出的重启次数 - 如果没有发生,则返回0。

vcl_synth

    用于在Varnish中生成内容错误消息可以在这里创建其他用例:重定向用户(301/302重定向)

vcl/default-vcl_synth.vcl:

    sub vcl_synth {set resp.http.Content-Type = "text/html; charset=utf-8";set resp.http.Retry-After = "5";synthetic( {"<!DOCTYPE html><html><head><title>"} + resp.status + " " + resp.reason + {"</title></head><body><h1>Error "} + resp.status + " " + resp.reason + {"</h1><p>"} + resp.reason + {"</p><h3>Guru Meditation:</h3><p>XID: "} + req.xid + {"</p><hr><p>Varnish cache server</p></body></html>"} );return (deliver);}

你可以创建合成响应,例如,在vcl_synth上的个性化错误信息。调用这个子进程你可以做:
return (synth(status_code, "reason"));
注意synth不是一个关键字,而是个带有参数的函数。
你必须为vcl_synth明确地返回status code和reason参数。在resp.http上设置合成响应的头部。
注意:从 vcl/default-vcl_synth.vcl注意到 {" and "}可以用于创建多行的字段。这个不仅限于synthetic()函数,在其他地址也可以使用。vcl_synth定义的对象绝不在缓存上存储,对立与vcl_backend_error定义的对象。
示例:

    使用vcl_synth重定向请求sub vcl_recv {if (req.http.host == "www.example.com") {set req.http.location = "http://example.com" + req.url;return (synth(750, "Permanently moved"));}}sub vcl_synth {if (resp.status == 750) {set resp.http.location = req.http.location;  set resp.status = 301;return (deliver);}}

转载于:https://www.cnblogs.com/shenxm/p/7787841.html

Varnish的vcl子程序相关推荐

  1. varnish 4.0 官方文档翻译12-VCL

    2019独角兽企业重金招聘Python工程师标准>>> VCL - Varnish Configuration Language 本节包含了怎样通过varnish配置语言vcl来通知 ...

  2. Varnish缓存代理简介与配置

    一.varnish原理: 1)Varnish简介: varnish缓存是web应用加速器,同时也作为http反向缓存代理.你可以安装varnish在任何http的前端,同时配置它缓存内容.与传统的 s ...

  3. CDN加速实现—varnish

    CDN介绍: 1 . 对cdn的理解: CDN的全称是(Content Delivery Network),即内容分发网络:加速器,反向代理缓存.CDN系统能够实时的根据网络流量和各节点的连接,负载状 ...

  4. varnish构建高速缓存

    os: [root@aliyun_test html]# cat /etc/system-release CentOS release 6.5 (Final) 首先安装varnish: 配置好varn ...

  5. varnish工作原理详细讲解

    Varish Configuration Language 简称VCL,通过它我们可以完成一些复杂的逻辑处理.下面将详细介绍: Backend declarations: Java代码   backe ...

  6. CentOS下使用Varnish为网站加速

    1 varnish概述 2 安装varnish 3 varnish 缓存原理 4 实战:缓存一个网站 5 实战:使用varnish缓存多个网站 1 varnish概述 Varnish是一款高性能的开源 ...

  7. 企业高性能缓存----varnish

    文章目录 cdn加速 vanish简介 varnish运行产生的进程 varnish的安装 varnish的启动脚本的配置 最大打开文件数的修改 内存锁的修改 默认端口的修改 添加命令行管理端口 启动 ...

  8. varnish 简单应用

    标签:操作系统 代理服务器 varnish 允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://essun.blog.51cto.com/721 ...

  9. Varnish 介绍和部署

    一 .基础知识简介 1.1 CDN的全称是Content Delivery Network,即内容分发网络. 通过在网络各处放置节点服务器所构成的在现有的互联网基础之上的一层智能虚拟网络,CDN系统能 ...

最新文章

  1. java网络编程udp_java网络编程 UDP网络编程问题
  2. 【全球年青人召集令】Hello World,Hello 2050
  3. 1562: 比较大小(思维)
  4. Python 38 初识数据库
  5. 程序员进阶架构师路线
  6. Taro+react开发(40)封装组件1
  7. Java中文件复制的一个汇总
  8. (96)FPGA时序违规案例(一)
  9. 经典的CSS代码(转)
  10. 【Python古诗词鉴赏小程序】千古绝唱,精选中国最美古诗句,经典咏流传~
  11. 9. Go复合类型-数组
  12. 如何利用turtle制作一个滑稽表情
  13. 流程管理体系实施策略
  14. 如何让spyder中途暂停(之前运行出来的结果仍然显示)
  15. 星巴克2022新年限定特饮;丹麦蓝罐曲奇虎年春节礼盒;尊尼获加、督威啤酒等虎年限定 | 食品饮料新品...
  16. 2022-2028全球与中国零售电子商务软件市场现状及未来发展趋势
  17. 关于逸马驰骋兄转移数据库的一种方案(记录下)
  18. Mathcad求解一元二次方程
  19. (C语言)找出一个二维数组中的鞍点,即该位置上的元素在该行最大,在该列上最小,也可能没有鞍点。存在则输出坐标;否则输出 -1.
  20. Linux学习-ps显示进程信息

热门文章

  1. Android XmlPullParser 笔记
  2. org.springframework.beans.BeanUtils
  3. 《C语言及程序设计》实践参考——转着圈加密
  4. 细数被程序员吐糟的9大困难(转)
  5. STL之multiset简介
  6. C++中的声明和定义
  7. L1-047 装睡-PAT团体程序设计天梯赛GPLT
  8. CCCC-GPLT L3-014. 周游世界 团体程序设计天梯赛
  9. 顺序表常见操作实现之一
  10. Hive:用Java代码通过JDBC连接Hiveserver