性感的开源软件Varnish-基础知识篇

此博文针对varnish3.x系列,有些知识不适合最新的varnish4.x,望广大博友知晓;

本次只有基础知识跟介绍,详细的安装、生产引用后面一一呈现!!!

一、varnish简介

varnish是一款高性能、配置灵活、管理方便的代理缓存软件,在缓存软件中它与传统的squid相比是一个新贵,具有配置灵活、运行速度快、管理更加方便等优点.

二、varnish的软件架构系统介绍:

1.  varnish的软件系统架构类似于Nginx的master-worker,varnish主要有两个进程:management和child进程;

2. management进程主要的功能是:应用新的配置,管理编译器编译vcl配置文件,监控varnish child进程状态、初始化varnish以及提供一个varnish的命令行接口;

3. child进程,也常被称之为cache进程,每个child进程中包含有很多线程,常见的线程主要有:

acceptor线程:主要负责接收新的请求并相应;

worker线程:child进程会为每个会话分配一个worker线程

Expiry线程:从缓冲中清理过期的内容

4. varnish的工作架构图:   

三、varnish的配置语言VCL:

1. varnish的配置文件采用了varnish自己独特的配置语言VarnishConfiguration Language (VCL),VCL是一种简单的编程语言,仅支持有限的算术运算和逻辑运算操作,支持正则表达式进行字符串的匹配、允许用户使用set自定义变量、支持if判断语句,但是不支持循环语句;

2. varnish需要通过management将其转换成C代码,再有GCC编译器将C代码编译成二进制文件才能被varnish进程所调用使用;

3. management在将vcl转换成C代码的时候会去检测vcl语法的正确性,如果不正确的会抛出错误并且不去转换,有效的避免了装载错误配置文件的风险;

4. VCL语法:

1). //、#或/* comment */用于注释;

2). sub$name 定义函数;

3). 不支持循环,有内置变量;

4). 使用终止语句,没有返回值;

5). 域专用;

6)操作符:=(赋值)、==(等值比较)、~(模式匹配)、!(取反)、&&(逻辑与)、||(逻辑或);

四、varnish的日志功能:

1. varnish有记录日志的功能,但是它的特殊之处在于varnish的日志是存储在内存里面的,默认为内存保留的空间为90M,超过90M就会清楚最起初的日志记录新日志;

2. 要想获取日志信息,我们可以通过命令接口的方式或者工具去获取日志,这样的工具有varnishlog、varnishncsa或varnishstat;

3. varnish的日志分为两部分,第一部分是计数器,第二部分为客户端请求的数据;

五、varnish缓存对象的存储:

varnish支持将缓存的对象存储在不同的介质中,我们可以在varnish启动的使用使用-s选项来指定缓存的存储类型;

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

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

persistent:与file的功能相同,但是它可以实现持久存储,但是这个功能目前还尚不稳定,处于测试期;

根据官方资料记载,每个缓存对象会大约多占用1K左右的存储空间,所以大约没100万个对象就会多占用1G的空间(处于性能跟稳定性方面考虑,推荐使用malloc);

六、varnish的几个重要的内置函数

vcl_recv:

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

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

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

3. 为web应用程序执行URL重写规则;

4. 挑选合适的后端web服务器;

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

varnish默认的vcl_recv函数主要有两个功能:仅处理可以识别的http方法,并且只缓存GET和HEAD方法的http请求,不缓存任何用户特有的数据;

vcl_fetch

vcl_fetch根据服务器端的响应做出缓存的策略,在任何的VCL状态引擎中返回的PASS操作都由vcl_fetch进行后续的处理,vcl_fetch中有很多内置的变量比如最常见的用于定义某对象缓存时长的beresp.ttl变量

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

vcl_pipe

此函数在进入pipe模式的时候被调用,用于将请求直接传递至后端主机,在请求和返回的内容没有改变的情况下,将不改变的内容返回客户,知道这个链接被关闭

vcl_pass

将请求直接传递到后端主机,后端主机在应答数据后将应答数据发送给客户端,但不会进行缓存,所以在当前这种链接的情况下每次返回的都是最新的内容

vcl_hit

如果在执行完成lookup之后,在缓存中找到了请求的内容,那么会自动调用这个函数

lookup

在缓存中查找是否有请求的对象,并且根据结果把控制权交给vcl_hit(有结果)或者vcl_miss(没结果)

vcl_miss

执行lookup之后,如果没有在缓存中找到请求的对象,就调用这个函数,这个函数可以判断是否需要从后端服务器获取内容

vcl_deliver

如果lookup在缓存中找到的请求的对象,在将缓存的内容返回给客户端的时候会调用这个函数

七、varnish的状态引擎流程图:

八、varnish简易的内部处理流程:

九、varnish常见的环境变量:


变量名称


变量的意义


.host


后端服务器的主机名或者IP地址


.port


后端服务器的服务名称或者端口号


client.ip


客户端的IP地址


srever.hostname


服务器的主机名


server.ip


服务器端的IP地址


req.request


http请求的类型,如GET/HEAD/POST等


req.proto


客户端发起的http协议的版本


req.http.header


请求重启的次数


beresp.request


后端服务器请求的类型,如get/head/post等


beresp.url


请求的url地址


beresp.proto


发起请求的http协议的版本


beresp.ttl


最大缓存时长,以秒为单位


obj.status


返回内容的请求的http状态码,如200、500、404、403等;

性感的开源软件Varnish-基础知识篇

时间: 2024-10-07 14:58:55

性感的开源软件Varnish-基础知识篇的相关文章

C#基础知识篇(五)-----------C#笔记

一.值类型和引用类型 1>值类型和引用类型将我们学过的数据类型划分成了两部分. 划分的依据是不同类型的数据在内存中(堆栈)存储的结构不同. 2>值类型:所有的数值类型:long int short byte ulong uint ushort sbyte decimal duoble float char bool 枚举 结构 3>引用类型:string,arry(数组),类(class) 4>不管是值类型还是引用类型赋值都是将数据copy一份将副本赋给变量,不同的是值类型拷贝的是

C#基础知识篇(二)-----------C#笔记

1.关系运算符(比较运算符) 1.关系运算符有哪些? >,< ==,!= >=,<= 2.关系运算符的作用? 用于比较两个事物之间的关系. 3.什么叫关系表达式? 由关系运算符连接起来的式子叫关系表达式. 注意:所有的关系表达式最终都能计算成一个bool类型的值. 2.逻辑运算符 1.逻辑表达式有哪些? 逻辑与:&& ,逻辑或:||  ,逻辑非:!(又叫取反) 2.逻辑运算 语法:表达式1 逻辑运算符  表达式2 逻辑运算符连接的两个表达式,要最终能求解成一个boo

C#基础知识篇(四)-----------C#笔记

一.类 1. 什么叫做类? 类是具有相同特征的一类事物统称.所以类是一种抽象,即不是一个实体(我们把类看做模板). 2. 什么叫做对象? 对象是根据类的模板创造出来的一个实体,它具有类里所有的特征,一个也多不得,一个也少不得.少了就不叫这个类的成员了,多了也不是!假如张三有变身这个功能,那么张三就不属于人. 记住对象是根据模板创建的,模板有什么它就有什么,不会多也不会少! 3. 什么叫做字段(或者是成员变量)? 我们把定义在方法的外面,类的里面(即:类中)的变量称之为字段或者说是成员变量. 4.

C#基础知识篇(三)-----------C#笔记

一.方法 1. 什么叫做方法? 方法就是对一段代码的重用的机制. 2. 方法的定义: [访问修饰符] [static] 返回值类型 方法名() { 方法体; } 注意:用[]修饰的都是可选的. 3. 需要注意的细节: 命名规则:方法名开头大写,参数名开头小写,参数名.变量名要有意义. 4. 方法的参数: 1>在方法名后面括号内定义变量就叫做定义这个方法的参数(形参). 2>在方法()中我们定义多个参数时,参数之间用逗号分隔,不管参数之间的类型是否相同,都不能像定义同类型的多个变量时:如:int

C#基础知识篇---------C#笔记

   一.变量         1.什么叫做变量?            我们把值可以改变的量叫做变量.          2.变量的声明:            语法:[访问修饰符] 数据类型 变量名; 如: int number=10://声明了一个整型的变量number.            注意:一次声明多个变量之间要用逗号分隔.                  如:int number1,number2,number3....;          3.变量的赋值:        

Android Camera开发之基础知识篇

概述 Android框架支持设备的相机拍照和录像功能,你的应用可以直接调用系统的Camera应用来拍照或者录像(比如微信拍照),当然也可以利用Android系统提供的API开发一个Camera应用来实现相机拍照和录像功能(比如市面上流行的360相机).此篇文章主要记录相机开发有关的基础知识,以及带着自己的理解翻译Camera官方文档,如有翻译不恰当支出,还请指出改正.当然我会开一个有关相机开发的一个系列,该系列主要内容包括如下: 相机基本预览拍照功能. 实现相机的Flash,Hdr,滤镜,前后摄

c++基础知识篇:指针

从面试的反馈来看,这部分可以问的很难. 1.指针与引用的区别 指针是一个变量,用来存放地址的变量.引用是原来变量的存储空间的别名. ? 2.指针作为参数的要点 a.需要进行指针的合法性检验,防止空指针. b.需要修改指针本身指向的地址时,参数需要是该指针的引用. ? 3.c++程序运行空间 数据区(Data Area):全局变量.静态变量.常量存放在数据区. 代码区(Code Area):所有类成员函数和非成员函数 栈区(Stack Area):为运行函数分配的局部变量.函数参数.返回数据.返回

java--学习java从这里开始:Java语言基础(1)《基础知识篇》--黑马程序员

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- Java语言基础(1) 从这篇日记开始说一些关于java的语言基础知识, 1  Java语言概述 java的创始人——詹姆斯·高斯林(James Gosling) 1977年获得了加拿大卡尔加里大学计算机科学学士学位,1983年获得了美国卡内基梅隆大学计算机科学博士学位,毕业后到IBM工作,设计IBM第7一代工作站NeWS系统,但不受重视.后来转至Sun公司,1990年,与Patrick,Na

JMeter工具基础知识篇-入门知识介绍

转载于金阳光测试 JMeter背景知识介绍: 1)  一个100%的纯Java桌面应用,它的用户界面采用Swing Java API实现 2)  Apache软件基金会下的一个子项目,Google在插件方面的持续支持 3)  自1998年发版以来,一直随着时代的发展在持续改进中,从3.0版本开始测试报告变得非常美观 4)  能满足接口功能自动化.批量数据准备.性能测试等多重需求 5)  直观的图形化操作界面,丰富的结果报告图表,强大而易用 6)  它是独立于平台的工具,在Windows / Li