●Varnish Configuration Language - VCL(varnish配置语言-VCL)
Varnish有一个很棒的配置系统,大部分其他的系统使用配置指令,让您打开或者关闭一些开关。Varnish使用区域配置语言,这种语言叫做“VCL”(varnish configuration language),在执行vcl时,varnish就把VCL转换成二进制代码。
VCL文件被分为多个子程序,不同的子程序在不同的时间里执行,比如一个子程序在接到请求时执行,另一个子程序在接收到后端服务器传送的文件时执行。
varnish将在不同阶段执行它的子程序代码,因为它的代码是一行一行执行的,不存在优先级问题。随时可以调用这个子程序中的功能并且当他执行完成后就退出。
如果到最后您也没有调用您的子进程中的功能,varnish将执行一些内建的VCL代码,这些代码就是default.vcl中被注释的代码。
99%的几率您需要改变vcl_recv 和 vcl_fetch这两个子进程。
vcl_recv
vcl_recv(当然,我们在字符集上有点不足,应为它是unix)在请求的开始被调用,在接收、解析后,决定是否响应请求,怎么响应,使用哪个后台服务器。
在vcl_recv中,您可以修改请求,比如您可以修改cookies,添加或者删除请求的头信息。
注意vcl_recv中只有请求的目标,req is available。
vcl_fetch
vcl_fetch在一个文件成功从后台获取后被调用,他的任务就是改变响应的头文件,触发ESI进程,在后台服务器轮询尝试失败的请求。
在vcl_fetch中一样的包含请求的目标,req,available,哪里通常是backend response,beresp.beresp将会包含后端服务器的HTTP的头信息
actions
主要有以下动作
pass \\当一个请求被pass后,这个请求将通过varnish转发到后端服务器,但是它不会被缓存。pass可以放在vcl_recv 和 vcl_fetch中。
lookup \\当一个请求在vcl_recv中被lookup后,varnish将从缓存中提取数据,如果缓存中没有数据,将被设置为pass,不能在vcl_fetch中设置lookup。
pipe \\pipe和pass相似,都要访问后端服务器,不过当进入pipe模式后,在此连接未关闭前,后续的所有请求都发到后端服务器(这句是我自己理解后简化的,有能力的朋友可以看看官方文档,给我提修改建议)。
deliver \\请求的目标被缓存,然后发送给客户端
esi \\ESI-process the fetched document(我理解的就是vcl中包换一段html代码)
Requests,Responses and objects
在VCL中,有3个重要的数据结构
request 从客户端进来
responses 从后端服务器过来
object 存储在cache中
在VCL中,你需要知道以下结构
req \\请求目标,当varnish接收到一个请求,这时req object就被创建了,你在vcl_recv中的大部分工作,都是在req object上展开的。
beresp \\后端服务器返回的目标,它包含返回的头信息,你在vcl_fetch中的大部分工作都是在beresp object上开展的。
obj \\被cache的目标,只读的目标被保存于内存中,obj.ttl的值可修改,其他的只能读。
Operaors
VCL支持一下运算符,请阅读下面的例子:
= \\赋值运算符
== \\对比
~ \\匹配,在ACL中和正则表达式中都可以用
! \\否定
&& \\逻辑与
|| \\逻辑或
EXAMPLE 1 – manipulation headers
我们想要取消我们服务器上/images目录下的所有缓存:
sub vcl_recv {
if (req.url ~ "^/images") {
unset req.http.cookie;
}
}
现在,当这个请求在操作后端服务器时,将不会有cookie头,这里有趣的行是 if-statement,它匹配URL,如果匹配这个操作,那么头信息中的cookie就会被删除。
EXAMPLE 2 – manipulation beresp
从后端服务器返回对象的值满足一些标准,我们就修改它的TTL值:
sub vcl_fetch {
if (beresp.url ~ "\.(png|gif|jpg)$") {
unset beresp.http.set-cookie;
beresp.ttl = 3600;
}
}
EXAMPLE3-ACLs
你创建一个VCL关键字的访问控制列表。你可以配置客户端的IP地址
# Who is allowed to purge....
acl local {
"localhost";
"192.168.1.0"/24; /* and everyone on the local network */
! "192.168.1.23"; /* except for the dialin router */
}
sub vcl_recv {
if (req.request == "PURGE") {
if (client.ip ~ local) {
return(lookup);
}
}
}
sub vcl_hit {
if (req.request == "PURGE") {
set obj.ttl = 0s;
error 200 "Purged.";
}
}
sub vcl_miss {
if (req.request == "PURGE") {
error 404 "Not in cache.";
}
}
参考资料:http://blog.csdn.net/wangpengqi/article/details/8900896
- 7.1 Varnish VCL
根据以上的配置增加集群,修改default.vcl # This ) # man page for details on VCL syntax and semantics. # # Default b ...
- 7.3 Varnish VCL 常用函数
- 7.5 Varnish VCL的变量和应用片段
- 7.4 Varnish VCL的子程序
- varnish
html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,bi ...
- Varnish 4.0 实战(转)
简介 Varnish 是一款高性能且开源的反向代理服务器和 HTTP 加速器,其采用全新的软件体系机构,和现在的硬件体系紧密配合,与传统的 squid 相比,varnish 具有性能更高.速度更快.管 ...
- 使用Varnish代替Squid做网站缓存加速器的详细解决方案----转载
[文章作者:张宴 本文版本:v1.2 最后修改:2008.01.02 转载请注明出处:http://blog.s135.com] 我曾经写过一篇文章──<初步试用Squid的替代产品──Varn ...
- Varnish缓存服务器的搭建配置手册
Varnish缓存服务器的搭建配置手册 1.Varnish官方环境依赖提示 Installing Varnish Cache is as simple as enabling our package ...
- Varnish缓存服务
Varnish缓存服务详解及应用实现 1.varnish的基本介绍 Varnish 的作者Poul-Henning Kamp是FreeBSD的内核开发者之一,他认为现在的计算机比起1975年已 ...
- Varnish缓存服务详解及应用实现
1.varnish的基本介绍 Varnish 的作者Poul-Henning Kamp是FreeBSD的内核开发者之一,他认为现在的计算机比起1975年已经复杂许多.在1975年时,储存媒介只有 ...
随机推荐
- 一 JAVA整体概念以及安装部署
JAVA 基本概念 JVM(JAVA virtual machine)java虚拟机,是java的能跨平台的核心,java的跨平台实现,就是在各种系统中布置JVM,然后java应用运行在JVM中,相 ...
- vue-cli、webpack提取第三方库-----DllPlugin、DllReferencePlugin
需要安装的插件有 extract-text-webpack-plugin assets-webpack-plugin clean-webpack-plugin npm install extract- ...
- java 报错及解决
java文件编译报错:error: unmappable character for encoding ASCII 解决: 编译时:javac -encoding utf-8 TestJava.jav ...
- [C++ Primer] : 第12章: 动态内存
动态内存与只能指针 静态内存用来保存局部static对象, 类static数据成员以及定义在任何函数之外的变量. 栈内存用来保存定义在函数内的非static对象. 分配在静态或栈内存中的对象由编译器自 ...
- linux中set的用法
功能说明:设置shell.语 法:set [+-abCdefhHklmnpPtuvx]补充说明:用set 命令可以设置各种shell选项或者列 出shell变量.单个选项设置常用的特性.在某些选项之后 ...
- ubuntu初次设置root密码
初次安装ubuntu创建的用户不是root用户,但是需要root权限的时候又需要密码,那么如何设置密码呢? 很简单.如下几步操作
- linux 异步信号的同步处理方式
关于代码的可重入性,设计开发人员一般只考虑到线程安全,异步信号处理函数的安全却往往被忽略.本文首先介绍如何编写安全的异步信号处理函数:然后举例说明在多线程应用中如何构建模型让异步信号在指定的线程中以同 ...
- 小峰servlet/jsp(4)EL表达式
一.EL表达式内置对象: 二.EL表达式访问4种范围属性: 寻找值的顺序: page-->request-->session-->application; 三.EL表达式接收请求参数 ...
- 1.环境搭建-mysql+tomcat+myeclipse安装并配置
一.安装mysql数据库并配置 下载地址:https://pan.baidu.com/s/1OJ3ggda7Cthl4GCxWKbTng 密码:sd6b 1.打开安装程序
- 1012 The Best Rank (25 分)
1012 The Best Rank (25 分) To evaluate the performance of our first year CS majored students, we cons ...