热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

架构师日记——Varnish的VCL子程序

一个子程序就是一串可读和可用的代码,子程序在VCL中没有参数,也没有返回值。示例如下:subpipe_if_local{if(client.ip~local){

一个子程序就是一串可读和可用的代码,子程序在VCL中没有参数,也没有返回值。示例如下:

sub pipe_if_local{
if(client.ip ~ local){
pipe;
}
}

调用一个子程序,使用子程序的关键字名字,如下所示

call pipe_if_local;

varnish的工作流程

有很多默认子程序和varnish的工作流程相关,这些子程序会检查和操作http头文件和各种各种的请求,决定那个、哪些请求被使用,如果这些子程序没有被定义,或者没有完成预定的处理而被终止,控制权将转交给默认的子程序,他们是:
1.vcl_init
当VCL加载是调用,之后加载客户请求。一般用于初始化VMOD模块
2.vcl_recv
在请求的开始被调用,在接收、解析后,决定是否响应请求,怎么相应,使用哪个后台服务器。在vcl_recv中,可以修改请求,比如可以修改COOKIEs,添加或者删除请求的头信息。注意vcl_recv中只有请求的目标。vcl_recv子程序以下面的关键字结束:error code [resson]、pass、pipe、lookup
3.vcl_pipe
请求进入pipe模式的时候被调用,在这个模式,请求会被passed到后端服务器,在连接关闭前,无论是这个客户端还是对应的后端服务器的数据,都会进入pass模式。vcl_pipe子程序以下面的关键字结束:error code [reason]、pipe
4.vcl_pass
请求进入pass模式的时候被调用,在这个模式,请求会被passed到后端服务器,后端服务器的应答会被passed给客户端,但是不会被缓存。相同客户端的随后的请求正常处理。vcl_pass子程序以下面的关键字结束:error code [reason]、pass、restart
5.vcl_hash
使用req.hash +=req.http.COOKIE或者HTTP头文件包含COOKIE生成hash字符串。vcl_hash将以下的关键字结束:hash
6.vcl_hit
当一个请求从cache中命中需要的内容,vcl_hit子程序以下面的关键字结束:error code [reason]、pass、restart、deliver
7.vcl_miss
当需要的内容没有在缓存中命中的时候被调用,决定是否尝试到后端服务器查找目标,从哪个后端服务器查找目标,vcl_miss子程序以下面的关键字结束:error code [reason]、pass、fetch
8.vcl_fetch
在一个文件成功从后台获取被调用,用场他的任务就是改变response heaeders,出发ESI进程,在请求失败的时候轮询其他服务器。在vcl_fetch中一样的包含请求的对象,还有返回对象beresp,他将会包含后端服务器的返回信息。以下面的关键字结束:error code [reason]、pass、restart、deliver、hit_for_pass
9.vcl_deliver
当一个没有被cached内容交付给客户端的时候被调用,vcl_deliver子程序以下面关键字结束:deliver、restart
10.vcl_error
当hit错误或者发生内部错误的时候。以下面的关键字结束:deliver、restart
11vcl_fini
当销毁VCL程序的时候调用,return的值ok表示征程销毁VCL程序

VCL工作流程图如下

这里写图片描述

中文解析版

这里写图片描述

Actions

VCL中主要有如下动作:
1.pass:当一个请求被pass后,这个请求将通过varnish转发到后端服务器,该请求不会被缓存,后续的请求仍通过Varnish处理。pass可以放在vcl_recv和vcl_fetch中,示例如下

if(req.uri ~ "\.jsp$"){
return (pass);//如果是.jsp结尾,交由后端服务器处理
}

2.lookup:但疫情请求在vcl_recv中被lookup后,varnish将从缓存中提取数据,如果缓存中没有数据,将被设置为pass,不能在vcl_fetch中设置lookup。

3.pipe:pipe和pass相似,都要访问后端服务器,不过当进入pipe模式后,在此连接未关闭前,后期的所有请求都直接发到后端服务器,不经过Varnish的处理

4.deliver:请求的目标被缓存,然后发送给客户端

5.hit_for_pass:表示直接从后端获取数据,回传件一个hit_for_pass的对象,该对象的TTL值将会被设置成bereso.ttl的当前值。用来控制vcl_deliver如果处理当前的请求,后续的请求会直接vcl_pass,可在vcl_fetch中用,示例如下

if(beresp.ttl <= 0s||beresp.http.Set-COOKIE||beresp.http.Vary == "*"){
set beresp.ttl =120s;//接下来的120s内都会直接走vcl_pass
return (hit_for_pass);
}

6.fetch:从后端服务器获取请求目标,控制权转交给vcl_fetch。

7.hash:进入Hash模式

8.restart:重启本次事务,重新返回给vcl_recv,如果重启次数超过
max_restarts报错

9.ok:表示正常

10.error:表示错误


推荐阅读
  • Varnish搭建CDN内容分发网络
    概述:1.CDN内容分发网络CDN的全称是ContentDeliveryNetwork,即内容分发网络。其基本思路是尽可能避开互联网上有可能影响数据 ... [详细]
  • 分布式系统关注点——360°全方位解读「缓存」
    如果这是第二次看到我的文章,欢迎文末扫码订阅我个人的公众号(跨界架构师)哟~  本文长度为3578字,建议阅读10分钟。坚持原创,每 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • Spring框架《一》简介
    Spring框架《一》1.Spring概述1.1简介1.2Spring模板二、IOC容器和Bean1.IOC和DI简介2.三种通过类型获取bean3.给bean的属性赋值3.1依赖 ... [详细]
  • Linux下部署Symfoy2对app/cache和app/logs目录的权限设置,symfoy2logs
    php教程|php手册xml文件php教程-php手册Linux下部署Symfoy2对appcache和applogs目录的权限设置,symfoy2logs黑色记事本源码,vsco ... [详细]
  • mogifs分布式文件系统
    分布式文件系统:1:系统的各个组件分布于网络上的多个计算机上2:各组件彼此之间仅仅通过消息传递来通信并协调运行分布式文件系统存在的意义:A:向上扩展的性价比越来越低;单机扩展存在性 ... [详细]
  • EvanWeaver是Twitter服务团队的总工程师,他的主要工作是优化与伸缩性。在QConLondon2009上,他谈到了Twitter的架构&#x ... [详细]
  • 怎么查看linux日志里请求量最高的url访问最多的_40道Linux运维面试精华题,请收下这份跳槽秘籍!...
    过一次年,结婚、存款、父母养老,一系列向钱看的事都在碾压我们本来还挺简单的神经,但难过没有出路,唯有找到好的方法和事业方向& ... [详细]
  • 有关phpfile_exists()函数的文章推荐10篇
    有关phpfile_exists()函数的文章推荐10篇:定义和用法clearstatcache()函数的作用是:清除文件状态缓存。PHP的缓存数据对更快更好的运行函数是非常有利的 ... [详细]
  • varnish 缓存服务器
    varnish缓存服务器局部性:空间局部时间局部http1.1时代过期时间条件式条件式请求:客户端发请求时给缓存服务器,先查本地缓存是否命 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 集成电路企业在进行跨隔离网数据交换时面临着安全性问题,传统的数据交换方式存在安全性堪忧、效率低下等问题。本文以《Ftrans跨网文件安全交换系统》为例,介绍了如何通过丰富的审批流程来满足企业的合规要求,保障数据交换的安全性。 ... [详细]
  • varnish2.04配置文章来源:http:blog.163.comkoumm126blogstatic9540383720091182424317修改varnishheader ... [详细]
  • 在不用缓存、集群之类东东只情况下,PHP框架哪家强?我指的是高并发高负载,并且适合做大型项目的。高负载不是一个语言的问题,这 ... [详细]
  • 一、原理用server1当作缓存的,主机请求server1,server1通过varnish设置,访问server2,将se ... [详细]
author-avatar
_Cokoice
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有