阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

缓存服务器Varnish概念篇

125次阅读
没有评论

共计 12295 个字符,预计需要花费 31 分钟才能阅读完成。

一、Varnish 简介

Varnish 是一款高性能的开源 HTTP 加速器,挪威最大的在线报纸 Verdens Gang 使用 3 台 Varnish 代替了原来的 12 台 Squid,性能比以前更好。

Varnish 的作者 Poul-Henning Kamp 是 FreeBSD 的内核开发者之一,他认为现在的计算机比起 1975 年已经复杂许多。在 1975 年时,储存媒介只有两种:内存与硬盘。但现在计算机系统的内存除了主存外,还包括了 CPU 内的 L1、L2,甚至有 L3 快取。硬盘上也有自己的快取装置,因此 Squid Cache 自行处理物件替换的架构不可能得知这些情况而做到最佳化,但操作系统可以得知这些情况,所以这部份的工作应该交给操作系统处理,这就是 Varnish cache 设计架构。

Varnish 项目是 2006 年发布的第一个版本 0.9. 距今已经八年多了,此文档之前也提过 varnish 还不稳定,那是 2007 年时候编写的,经过 varnish 开发团队和网友们的辛苦耕耘,现在的 varnish 已经很健壮。很多门户网站已经部署了 varnish,并且反应都很好,甚至反应比 squid 还稳定,且效率更高,资源占用更少。相信在反向代理,web 加速方面,varnish 已经有足够能力代替 squid。

缓存服务器 Varnish 概念篇  http://www.linuxidc.com/Linux/2014-05/101389.htm

相关阅读

Varnish Cache 的架构笔记 http://www.linuxidc.com/Linux/2013-10/91016.htm

CentOS 5.8 下 Varnish-2.1.5 的安装配置 http://www.linuxidc.com/Linux/2013-09/89916.htm

RedHat 脚本改用 CentOS 源更新安装 Nginx、PHP 5.3、Varnish http://www.linuxidc.com/Linux/2012-07/65801.htm

利用 Varnish 构建 Cache 服务器笔记 http://www.linuxidc.com/Linux/2012-07/65234.htm

缓存服务 Varnish 安装配置 http://www.linuxidc.com/Linux/2012-07/65228.htm

Varnish 编译安装所需准备 http://www.linuxidc.com/Linux/2012-07/65230.htm

Linux 下 Varnish 缓存的配置优化 http://www.linuxidc.com/Linux/2012-03/56435.htm

二、Varnish 特点

Varnish 是一个轻量级的 Cache 和反向代理软件。先进的设计理念和成熟的设计框架是 Varnish 的主要特点。现在的 Varnish 总共代码量不大,虽然功能在不断改进,但是还需要继续丰富和加强。下面总结了 Varnish 的一些特点。

  • 基于内存进行缓存,重启后数据将消失。
  • 利用虚拟内存方式,I/ O 性能好。
  • 支持设置 0~60 秒内的精确缓存时间。
  • VCL 配置管理比较灵活。
  • 32 位机器上缓存文件大小为最大 2GB。
  • 具有强大的管理功能,例如 top,stat,admin,list 等。
  • 状态机设计巧妙,结构清晰。
  • 利用二叉堆管理缓存文件,达到积极删除目的。

三、Varnish 与 Squid 对比

说到 Varnish,不能不提 Squid,Squid 是一个高性能的代理缓存服务器,它和 Varnish 之间有诸多的异同点,下面进行分析。

下面是 Varnish 与 Squid 之间的相同点。

  • 都是一个反向代理服务器。
  • 都是开源软件。

下面是它们的不同点,也是 Varnish 的优点。

  • Varnish 的稳定性很高。两者在完成相同负荷的工作时,Squid 服务器发生故障的几率要高于 Varnish,因为 Squid 需要经常重启
  • Varnish 访问速度更快。Varnish 采用了“Visual Page Cache”技术,所有缓存数据都直接从内存读取,而 Squid 是从硬盘读取缓存数据,因此 Varnish 在访问速度方面会更快。
  • Varnish 可以支持更多的并发连接。因为 Varnish 的 TCP 连接释放要比 Squid 快,所以在高并发连接情况下可以支持更多 TCP 连接。
  • Varnish 可以通过管理端口,使用正则表达式批量清除部分缓存,而 Squid 做不到。

当然,与传统的 Squid 相比,Varnish 也有缺点。

  • Varnish 在高并发状态下 CPU、I/ O 和内存等资源开销都高于 Squid。
  • Varnish 进程一旦挂起、崩溃或者重启,缓存数据都会从内存中完全释放,此时所有请求都会被发送到后端服务器,在高并发情况下,这会给后端服务器造成很大压力。

四、Varnish 设计结构

缓存服务器 Varnish 概念篇

Varnish 主要运行两个进程:Management 进程和 Child 进程(也叫 Cache 进程)。如上图,

更多详情见请继续阅读下一页的精彩内容:http://www.linuxidc.com/Linux/2014-05/101389p2.htm

1.Management 进程

Management 进程主要实现应用新的配置、编译 VCL、监控 varnish、初始化 varnish 以及提供一个命令行接口等。Management 进程会每隔几秒钟探测一下 Child 进程以判断其是否正常运行,如果在指定的时长内未得到 Child 进程的回应,Management 将会重启此 Child 进程。

  • Management 管理接口:

  • CLI interface 命令行接口

  • Telnet interface telnet 接口

  • Web interface Web 管理接口

2.Child/Cache 进程

Child/Cache 进程包含多种类型的线程,常见的如:

  • Accept 线程:接收新的连接请求并响应;

  • Worker 线程:child 进程会为每个会话启动一个 worker 线程,因此,在高并发的场景中可能会出现数百个 worker 线程甚至更多;

  • Object Expiry 线程:从缓存中清理过期内容;

  • Commad line 线程 : 管理接口

  • Storage/hashing 线程:缓存存储

  • Log/stats 线程:日志管理线程

  • Backend Communication 线程:管理后端主机线程

Varnish 依赖“工作区(workspace)”以降低线程在申请或修改内存时出现竞争的可能性。在 varnish 内部有多种不同的工作区,其中最关键的当属用于管理会话数据的 session 工作区。

3.Varnish 日志

为了与系统的其它部分进行交互,Child 进程使用了可以通过文件系统接口进行访问的共享内存日志(shared memory log),因此,如果某线程需要记录信息,其仅需要持有一个锁,而后向共享内存中的某内存区域写入数据,再释放持有的锁即可。而为了减少竞争,每个 worker 线程都使用了日志数据缓存。共享内存日志大小一般为 90M,其分为两部分,前一部分为计数器,后半部分为客户端请求的数据。varnish 提供了多个不同的工具如 varnishlog、varnishncsa 或 varnishstat 等来分析共享内存日志中的信息并能够以指定的方式进行显示。

4.VCL(Varnish Configuation Language)简介

Varnish Configuration Language (VCL)是 varnish 配置缓存策略的工具,它是一种基于“域”(domain specific)的简单编程语言,它支持有限的算术运算和逻辑运算操作、允许使用正则表达式进行字符串匹配、允许用户使用 set 自定义变量、支持 if 判断语句,也有内置的函数和变量等。使用 VCL 编写的缓存策略通常保存至.vcl 文件中,其需要编译成二进制的格式后才能由 varnish 调用。事实上,整个缓存策略就是由几个特定的子例程如 vcl_recv、vcl_fetch 等组成,它们分别在不同的位置 (或时间) 执行,如果没有事先为某个位置自定义子例程,varnish 将会执行默认的定义。

VCL 策略在启用前,会由 management 进程将其转换为 C 代码,而后再由 gcc 编译器将 C 代码编译成二进制程序。编译完成后,management 负责将其连接至 varnish 实例,即 child 进程。正是由于编译工作在 child 进程之外完成,它避免了装载错误格式 VCL 的风险。因此,varnish 修改配置的开销非常小,其可以同时保有几份尚在引用的旧版本配置,也能够让新的配置即刻生效。编译后的旧版本配置通常在 varnish 重启时才会被丢弃,如果需要手动清理,则可以使用 varnishadm 的 vcl.discard 命令完成。

 

5.Varnish 的后端存储

Varnish 支持多种不同类型的后端存储,这可以在 varnishd 启动时使用 - s 选项指定。后端存储的类型包括:

  • file:使用特定的文件存储全部的缓存数据,并通过操作系统的 mmap()系统调用将整个缓存文件映射至内存区域(如果条件允许);

  • malloc:使用 malloc()库调用在 varnish 启动时向操作系统申请指定大小的内存空间以存储缓存对象;

  • persistent(experimental):与 file 的功能相同,但可以持久存储数据(即重启 varnish 数据时不会被清除);仍处于测试期;

Varnish 无法追踪某缓存对象是否存入了缓存文件,从而也就无从得知磁盘上的缓存文件是否可用,因此,file 存储方法在 varnish 停止或重启时会清除数据。而 persistent 方法的出现对此有了一个弥补,但 persistent 仍处于测试阶段,例如目前尚无法有效处理要缓存对象总体大小超出缓存空间的情况,所以,其仅适用于有着巨大缓存空间的场景。

选择使用合适的存储方式有助于提升系统性,从经验的角度来看,建议在内存空间足以存储所有的缓存对象时使用 malloc 的方法,反之,file 存储将有着更好的性能的表现。然而,需要注意的是,Varnishd 实际上使用的空间比使用 - s 选项指定的缓存空间更大,一般说来,其需要为每个缓存对象多使用差不多 1K 左右的存储空间,这意味着,对于 100 万个缓存对象的场景来说,其使用的缓存空间将超出指定大小 1G 左右。另外,为了保存数据结构等,varnish 自身也会占去不小的内存空间。

为 varnishd 指定使用的缓存类型时,- s 选项可接受的参数格式如下:

  • malloc[,size] 或

  • file[,path[,size[,granularity]]]

  • persistent,path,size {experimental}

注,file 中的 granularity 用于设定缓存空间分配单位,默认单位是字节,所有其它的大小都会被圆整。

一、Varnish 简介

Varnish 是一款高性能的开源 HTTP 加速器,挪威最大的在线报纸 Verdens Gang 使用 3 台 Varnish 代替了原来的 12 台 Squid,性能比以前更好。

Varnish 的作者 Poul-Henning Kamp 是 FreeBSD 的内核开发者之一,他认为现在的计算机比起 1975 年已经复杂许多。在 1975 年时,储存媒介只有两种:内存与硬盘。但现在计算机系统的内存除了主存外,还包括了 CPU 内的 L1、L2,甚至有 L3 快取。硬盘上也有自己的快取装置,因此 Squid Cache 自行处理物件替换的架构不可能得知这些情况而做到最佳化,但操作系统可以得知这些情况,所以这部份的工作应该交给操作系统处理,这就是 Varnish cache 设计架构。

Varnish 项目是 2006 年发布的第一个版本 0.9. 距今已经八年多了,此文档之前也提过 varnish 还不稳定,那是 2007 年时候编写的,经过 varnish 开发团队和网友们的辛苦耕耘,现在的 varnish 已经很健壮。很多门户网站已经部署了 varnish,并且反应都很好,甚至反应比 squid 还稳定,且效率更高,资源占用更少。相信在反向代理,web 加速方面,varnish 已经有足够能力代替 squid。

缓存服务器 Varnish 概念篇  http://www.linuxidc.com/Linux/2014-05/101389.htm

相关阅读

Varnish Cache 的架构笔记 http://www.linuxidc.com/Linux/2013-10/91016.htm

CentOS 5.8 下 Varnish-2.1.5 的安装配置 http://www.linuxidc.com/Linux/2013-09/89916.htm

RedHat 脚本改用 CentOS 源更新安装 Nginx、PHP 5.3、Varnish http://www.linuxidc.com/Linux/2012-07/65801.htm

利用 Varnish 构建 Cache 服务器笔记 http://www.linuxidc.com/Linux/2012-07/65234.htm

缓存服务 Varnish 安装配置 http://www.linuxidc.com/Linux/2012-07/65228.htm

Varnish 编译安装所需准备 http://www.linuxidc.com/Linux/2012-07/65230.htm

Linux 下 Varnish 缓存的配置优化 http://www.linuxidc.com/Linux/2012-03/56435.htm

二、Varnish 特点

Varnish 是一个轻量级的 Cache 和反向代理软件。先进的设计理念和成熟的设计框架是 Varnish 的主要特点。现在的 Varnish 总共代码量不大,虽然功能在不断改进,但是还需要继续丰富和加强。下面总结了 Varnish 的一些特点。

  • 基于内存进行缓存,重启后数据将消失。
  • 利用虚拟内存方式,I/ O 性能好。
  • 支持设置 0~60 秒内的精确缓存时间。
  • VCL 配置管理比较灵活。
  • 32 位机器上缓存文件大小为最大 2GB。
  • 具有强大的管理功能,例如 top,stat,admin,list 等。
  • 状态机设计巧妙,结构清晰。
  • 利用二叉堆管理缓存文件,达到积极删除目的。

三、Varnish 与 Squid 对比

说到 Varnish,不能不提 Squid,Squid 是一个高性能的代理缓存服务器,它和 Varnish 之间有诸多的异同点,下面进行分析。

下面是 Varnish 与 Squid 之间的相同点。

  • 都是一个反向代理服务器。
  • 都是开源软件。

下面是它们的不同点,也是 Varnish 的优点。

  • Varnish 的稳定性很高。两者在完成相同负荷的工作时,Squid 服务器发生故障的几率要高于 Varnish,因为 Squid 需要经常重启
  • Varnish 访问速度更快。Varnish 采用了“Visual Page Cache”技术,所有缓存数据都直接从内存读取,而 Squid 是从硬盘读取缓存数据,因此 Varnish 在访问速度方面会更快。
  • Varnish 可以支持更多的并发连接。因为 Varnish 的 TCP 连接释放要比 Squid 快,所以在高并发连接情况下可以支持更多 TCP 连接。
  • Varnish 可以通过管理端口,使用正则表达式批量清除部分缓存,而 Squid 做不到。

当然,与传统的 Squid 相比,Varnish 也有缺点。

  • Varnish 在高并发状态下 CPU、I/ O 和内存等资源开销都高于 Squid。
  • Varnish 进程一旦挂起、崩溃或者重启,缓存数据都会从内存中完全释放,此时所有请求都会被发送到后端服务器,在高并发情况下,这会给后端服务器造成很大压力。

四、Varnish 设计结构

缓存服务器 Varnish 概念篇

Varnish 主要运行两个进程:Management 进程和 Child 进程(也叫 Cache 进程)。如上图,

更多详情见请继续阅读下一页的精彩内容:http://www.linuxidc.com/Linux/2014-05/101389p2.htm

五、Varnish 工作流程

缓存服务器 Varnish 概念篇

Varnish 处理 HTTP 请求的过程大致分为如下几个步骤:

  • Receive 状态,也就是请求处理的入口状态,根据 VCL 规则判断该请求应该 Pass 或 Pipe,还是进入 Lookup(本地查询)。

  • Lookup 状态,进入此状态后,会在 hash 表中查找数据,若找到,则进入 Hit 状态,否则进入 miss 状态。

  • Pass 状态,在此状态下,会进入后端请求,即进入 Fetch 状态。

  • Fetch 状态,在 Fetch 状态下,对请求进行后端获取,发送请求,获得数据,并进行本地存储。

  • Deliver 状态,将获取到的数据发送给客户端,然后完成本次请求。

 

六、Varnish 状态引擎(state engine)

VCL 用于让管理员定义缓存策略,而定义好的策略将由 varnish 的 management 进程分析、转换成 C 代码、编译成二进制程序并连接至 child 进程。varnish 内部有几个所谓的状态(state),在这些状态上可以附加通过 VCL 定义的策略以完成相应的缓存处理机制,因此 VCL 也经常被称作“域专用”语言或状态引擎,“域专用”指的是有些数据仅出现于特定的状态中。

1.VCL 状态引擎

在 VCL 状态引擎中,状态之间具有相关性,但彼此间互相隔离,每个引擎使用 return(x)来退出当前状态并指示 varnish 进入下一个状态。

Varnish 开始处理一个请求时,首先需要分析 HTTP 请求本身,比如从首部获取请求方法、验正其是否为一个合法的 HTT 请求等。当这些基本分析结束后就需要做出第一个决策,即 varnish 是否从缓存中查找请求的资源。这个决定的实现则需要由 VCL 来完成,简单来说,要由 vcl_recv 方法来完成。如果管理员没有自定义 vcl_recv 函数,varnish 将会执行默认的 vcl_recv 函数。然而,即便管理员自定义了 vcl_recv,但如果没有为自定义的 vcl_recv 函数指定其终止操作(terminating),其仍将执行默认的 vcl_recv 函数。事实上,varnish 官方强烈建议让 varnish 执行默认的 vcl_recv 以便处理自定义 vcl_recv 函数中的可能出现的漏洞。

 

2.VCL 语法

  • VCL 的设计参考了 C 和 Perl 语言,因此,对有着 C 或 Perl 编程经验者来说,其非常易于理解。其基本语法说明如下:
    (1)//、# 或 /* comment */ 用于注释
    (2)sub $name 定义函数
    (3)不支持循环,有内置变量
    (4)使用终止语句,没有返回值
    (5)域专用
    (6)操作符:=(赋值)、==(等值比较)、~(模式匹配)、!(取反)、&&(逻辑与)、||(逻辑或)

VCL 的函数不接受参数并且没有返回值,因此,其并非真正意义上的函数,这也限定了 VCL 内部的数据传递只能隐藏在 HTTP 首部内部进行。VCL 的 return 语句用于将控制权从 VCL 状态引擎返回给 Varnish,而非默认函数,这就是为什么 VCL 只有终止语句而没有返回值的原因。同时,对于每个“域”来说,可以定义一个或多个终止语句,以告诉 Varnish 下一步采取何种操作,如查询缓存或不查询缓存等。

 

3.VCL 内置函数

(1).vcl_recv 函数 用于接收和处理请求。当请求到达并被成功接收后被调用,通过判断请求的数据来决定如何处理请求。此函数一般以如下几个关键字结束。

  • pass:表示进入 pass 模式,把请求控制权交给 vcl_pass 函数。

  • pipe:表示进入 pipe 模式,把请求控制权交给 vcl_pipe 函数。

  • error code [reason]:表示返回“code”给客户端,并放弃处理该请求。“code”是错误标识,例如 200 和 405 等,“reason”是错误提示信息。

 

(2).vcl_pipe 函数 此函数在进入 pipe 模式时被调用,用于将请求直接传递至后端主机,在请求和返回的内容没有改变的情况下,将不变的内容返回给客户端,直到这个链接被关闭。此函数一般以如下几个关键字结束。

  • error code [reason]

  • pipe

 

(3).vcl_pass 函数 此函数在进入 pass 模式时被调用,用于将请求直接传递至后端主机,后端主机在应答数据后将应答数据发送给客户端,但不进行任何缓存,在当前连接下每次都返回最新的内容。此函数一般以如下几个关键字结束。

  • error code [reason]。

  • pass。

 

(4).lookup 表示在缓存中查找被请求的对象,并且根据查找的结果把控制权交给函数 vcl_hit 或函数 vcl_miss。

 

(5).vcl_hit 函数 在执行 lookup 指令后,在缓存中找到请求的内容后将自动调用该函数。此函数一般以如下几个关键字结束。

  • deliver:表示将找到的内容发送给客户端,并把控制权交给函数 vcl_deliver。

  • error code [reason]。

  • pass。

 

(6).vcl_miss 函数 在执行 lookup 指令后,在缓存中没有找到请求的内容时自动调用该方法,此函数可用于判断是否需要从后端服务器获取内容。此函数一般以如下几个关键字结束。

  • fetch:表示从后端获取请求的内容,并把控制权交给 vcl_fetch 函数。

  • error code [reason]。

  • pass。

 

(7).vcl_fetch 函数
在后端主机更新缓存并且获取内容后调用该方法,接着,通过判断获取的内容来决定将内容放入缓存,还是直接返回给客户端。此函数一般以如下几个关键字结束。\

  • rror code [reason]

  • pass

  • deliver

 

(8).vcl_deliver 函数
将在缓存中找到请求的内容发送给客户端前调用此方法。此函数一般以如下几个关键字结束。

  • error code [reason]

  • deliver

 

(9).vcl_timeout 函数
在缓存内容到期前调用此函数。此函数一般以如下几个关键字结束。

  • discard:表示从缓存中清除该内容。

  • fetch。

 

(10).vcl_discard 函数
在缓存内容到期后或缓存空间不够时,自动调用该函数。该函数一般以如下几个关键字结束。

  • keep:表示将内容继续保留在缓存中。

  • discard。

 

4. 内置公用变量

VCL 内置的公用变量可以用在不同的 VCL 函数中。下面根据这些公用变量使用的不同阶段依次进行介绍。

(1). 当请求到达后,可以使用的公用变量

  • req.backend 指定对应的后端主机

  • server.ip 表示服务器端 IP

  • client.ip 表示客户端 IP

  • req.request 指定请求的类型,例如 GET、HEAD 和 POST 等

  • req.url 指定请求的地址

  • req.proto 表示客户端发起请求的 HTTP 协议版本

  • req.http.header 表示对应请求中的 HTTP 头部信息

  • req. restarts ;/.l 表示请求重启的次数,默认最大值为 4

 

(2).Varnish 在向后端主机请求时,可以使用的公用变量

  • beresp.request 指定请求的类型,例如 GET 合 HEAD 等

  • beresp.url 指定请求的地址

  • beresp .proto 表示客户端发起请求的 HTTP 协议版本

  • beresp .http.header 表示对应请求中的 HTTP 头部信息

  • beresp .ttl 表示缓存的生存周期,也就是 cache 保留多长时间,单位是秒

 

(3). 从 cache 或后端主机获取内容后,可以使用的公用变量

  • obj.status 表示返回内容的请求状态代码,例如 200、302 和 504 等

  • obj.cacheable 表示返回的内容是否可以缓存,也就是说,如果 HTTP 返回的是 200、203、300、301、302、404 或 410 等,并且有非 0 的生存期,则可以缓存

  • obj.valid 表示是否是有效的 HTTP 应答

  • obj.response 表示返回内容的请求状态信息

  • obj.proto 表示返回内容的 HTTP 协议版本

  • obj.ttl 表示返回内容的生存周期,也就是缓存时间,单位是秒

  • obj.lastuse 表示返回上一次请求到现在的间隔时间,单位是秒

 

(4). 对客户端应答时,可以使用的公用变量

  • resp.status 表示返回给客户端的 HTTP 状态代码

  • resp.proto 表示返回给客户端的 HTTP 协议版本

  • resp.http.header 表示返回给客户端的 HTTP 头部信息

  • resp.response 表示返回给客户端的 HTTP 状态信息

在上面的讲述中,只介绍了常用的 VCL 内置公用变量,如果需要了解和使用更多的公用变量信息,请登录 varnish 官方网站查阅。https://www.varnish-cache.org/docs/3.0/

5. 常用内置函数

(1).vcl_recv

vcl_recv 是在 Varnish 完成对请求报文的解码为基本数据结构后第一个要执行的子例程,它通常有四个主要用途:

  • 修改客户端数据以减少缓存对象差异性;比如删除 URL 中的 www. 等字符;

  • 基于客户端数据选用缓存策略;比如仅缓存特定的 URL 请求、不缓存 POST 请求等;

  • 为某 web 应用程序执行 URL 重写规则;

  • 挑选合适的后端 Web 服务器;

 

可以使用下面的终止语句,即通过 return()向 Varnish 返回的指示操作:

  • pass:绕过缓存,即不从缓存中查询内容或不将内容存储至缓存中;

  • pipe:不对客户端进行检查或做出任何操作,而是在客户端与后端服务器之间建立专用“管道”,并直接将数据在二者之间进行传送;此时,keep-alive 连接中后续传送的数据也都将通过此管道进行直接传送,并不会出现在任何日志中;

  • lookup:在缓存中查找用户请求的对象,如果缓存中没有其请求的对象,后续操作很可能会将其请求的对象进行缓存;

  • error:由 Varnish 自己合成一个响应报文,一般是响应一个错误类信息、重定向类信息或负载均衡器返回的后端 web 服务器健康状态检查类信息;

vcl_recv 也可以通过精巧的策略完成一定意义上的安全功能,以将某些特定的攻击扼杀于摇篮中。同时,它也可以检查出一些拼写类的错误并将其进行修正等。

Varnish 默认的 vcl_recv 专门设计用来实现安全的缓存策略,它主要完成两种功能:

仅处理可以识别的 HTTP 方法,并且只缓存 GET 和 HEAD 方法;

不缓存任何用户特有的数据;

注,安全起见,一般在自定义的 vcl_recv 中不要使用 return()终止语句,而是再由默认 vcl_recv 进行处理,并由其做出相应的处理决策。

下面是一个自定义的使用示例:

此例中的 VCL 创建一个 X -Device 请求首部,其值可能为 mobile 或 desktop,于是 web 服务器可以基于此完成不同类型的响应,以提高用户体验。

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”;

  }

}

(2).vcl_fetch

如前面所述,相对于 vcl_recv 是根据客户端的请求作出缓存决策来说,vcl_fetch 则是根据服务器端的响应作出缓存决策。在任何 VCL 状态引擎中返回的 pass 操作都将由 vcl_fetch 进行后续处理。vcl_fetch 中有许多可用的内置变量,比如最常用的用于定义某对象缓存时长的 beresp.ttl 变量。通过 return()返回给 arnish 的操作指示有:

  • deliver:缓存此对象,并将其发送给客户端(经由 vcl_deliver);

  • hit_for_pass:不缓存此对象,但可以导致后续对此对象的请求直接送达到 vcl_pass 进行处理;

  • restart:重启整个 VCL,并增加重启计数;超出 max_restarts 限定的最大重启次数后将会返回错误信息;

  • error code [reason]:返回指定的错误代码给客户端并丢弃此请求;

默认的 vcl_fetch 放弃了缓存任何使用了 Set-Cookie 首部的响应。

6. 其它内置函数

VCL 提供了几个函数来实现字符串的修改,添加 bans,重启 VCL 状态引擎以及将控制权转回 Varnish 等。

  • regsub(str,regex,sub) 匹配正则表达式的字符串

  • regsuball(str,regex,sub):这两个用于基于正则表达式搜索指定的字符串并将其替换为指定的字符串;但 regsuball()可以将 str 中能够被 regex 匹配到的字符串统统替换为 sub,regsub()只替换一次;

  • ban(expression):

  • ban_url(regex):Bans 所有其 URL 能够由 regex 匹配的缓存对象;

  • purge:从缓存中挑选出某对象以及其相关变种一并删除,这可以通过 HTTP 协议的 PURGE 方法完成;

  • hash_data(str):

  • return():当某 VCL 域运行结束时将控制权返回给 Varnish,并指示 Varnish 如何进行后续的动作;其可以返回的指令包括:lookup、pass、pipe、hit_for_pass、fetch、deliver 和 hash 等;但某特定域可能仅能返回某些特定的指令,而非前面列出的全部指令;

  • return(restart):重新运行整个 VCL,即重新从 vcl_recv 开始进行处理;每一次重启都会增加 req.restarts 变量中的值,而 max_restarts 参数则用于限定最大重启次数。

(2).vcl_fetch

如前面所述,相对于 vcl_recv 是根据客户端的请求作出缓存决策来说,vcl_fetch 则是根据服务器端的响应作出缓存决策。在任何 VCL 状态引擎中返回的 pass 操作都将由 vcl_fetch 进行后续处理。vcl_fetch 中有许多可用的内置变量,比如最常用的用于定义某对象缓存时长的 beresp.ttl 变量。通过 return()返回给 arnish 的操作指示有:

  • deliver:缓存此对象,并将其发送给客户端(经由 vcl_deliver);

  • hit_for_pass:不缓存此对象,但可以导致后续对此对象的请求直接送达到 vcl_pass 进行处理;

  • restart:重启整个 VCL,并增加重启计数;超出 max_restarts 限定的最大重启次数后将会返回错误信息;

  • error code [reason]:返回指定的错误代码给客户端并丢弃此请求;

默认的 vcl_fetch 放弃了缓存任何使用了 Set-Cookie 首部的响应。

Varnish 的详细介绍:请点这里
Varnish 的下载地址:请点这里

 

正文完
星哥说事-微信公众号
post-qrcode
 
星锅
版权声明:本站原创文章,由 星锅 2022-01-20发表,共计12295字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中