固定链接 Varnish 原理及使用介绍

Varnish 原理及使用介绍

Varnish 原理及使用介绍

Varnish 介绍

什么是 Varnish , 和通常的缓存加速工具有何不同,在 Varnish 文档中有如下描述:

下面从 Varnish 的工作流程以及取数据流程两个方面对 Varnish 的总体工作机制进行介绍。

Varnish的工作流程

Varnish 主要有两个进程,下面是 Varnish 的基本进程结构

如上图示,Varnish 主要存在两个进程:manage 进程及 child 进程,其中:

相当于 child 进程实际是提供 Varnish 主体功能的进程,线程结构如下图示:

child 进程中各线程的处理任务如下所示:

Varnish 中主要是在 work 线程中完成对请求的处理,而处理请求的逻辑主要是依据 varnish vcl 配置文件来决定对不同的请求采取的处理方式。vcl 配置文件主机涉及 vcl 的状态转换相关的配置,下面主要讲 vcl 处理流程。

vcl 的处理流程

vcl 的处理流程,主要是由 Varnish 的状态机决定,可以通过 vcl 配置文件来对 varnish 状态机各个步骤所做的操作进行配置。

vcl 的状态机如下图示:

上面的状态图,主要对 Varnish 处理 http 请求时各个步骤及决策方式进行了描述,下面对其中的各个状态进行介绍。

vcl_recv

vcl_recv 是 http 请求到达后进入的第一个状态,在这个状态中,可以对请求进行以下的一些处理:

在 vcl_recv 可以进入 vcl_pass, vcl_pipe,vcl_lookup,vcl_error.

vcl_pipe

若连接存活期间其请求被 vcl_recv 传递至 vcl_pipe ,那么这请求后的所有请求,将直接经 vcl_recv 到达 backend,Varnish 不再查找,及存储及请求的对象,就如同 client 与 backend 直接通信一样, 不会记录任何通信的日志。

vcl_pass

进入 vcl_pass 的请求,请求会直接发送至 backend , 但不会缓存, 可进入 restart , 会增加 restart 计数。

vcl_hash

根据请求的特征,构建 hash 值,通常是以 host+url 的形式建立 Hash 值,可进入 vcl_hit 及 vcl_miss .

vcl_hit

可进入 vcl_pass 及v cl_deliver,vcl_restart

vcl_miss

可进入 vcl_pass 及 vcl_fetch,vcl_restart

vcl_fetch

将请求传递至 backend, 决定是是否缓存,可进入 hit_for_pass: 仅vcl_fetch 可进入,与 pass 功能类似,不过其会利用 beresp 建立一个 hitforpass 对象,以防止同一对象被缓存,在 hitforpass 对象存在期间,同一请求的结果都不会被缓存,请求会直接进入 pass。

deliver:缓存取到的对象,并发送至服务端,也可进入 restart , 增加 restart 计数,当 restart 计数大于 max_restarts 时会报错。

vcl_deliver

在缓存数据将要发送到客户端时调用

vcl_error

出错时调用,以上的各状态通常情况下都可进入 vcl_error

对于以上状态的转换,具体的转换原因,也可如下图示:

vcl中的变量

vcl 内置的公共变量可以用在不同的 vcl 函数中,下面根据使用的不同阶段进行介绍

表 1. 请求到达时可用公共变量

表 2. 向后端主机请求时可用公共变量

表 3. 后端主机获取内容时可使用公共变量

表 4. 对客户端相应时可使用公共变量

本文作者:高志刚

您的留言将激励我们越做越好