varnish—vcl语法
VCL
varnish配置语言
介绍
varnish是一个专门用于描述varnish请求处理和文件缓存策略规则的语言。
当一个新的配置加载后,varnishd管理进程将会将其转换为C代码并编译,然后加载到服务器进程中。
本文档侧重于VCL的语法。对于语法和语义的完整介绍,和示例可以参阅https://www.varnish-cache.org/docs/ 。
从varnish 4.0版本开始,每一个VCL文件都必须在文件开始处说明版本号VCL 4.0
。
运算符
在VCL中可以使用以下运算符:
=
赋值运算符==
比较运算符~
匹配运算符。既可以使用正则表达式,也可以使用ACLs。!
否定运算符。&&
逻辑与||
逻辑或
条件运算
VCL有if和else语句。嵌套的逻辑可以使用elseif来实现(elsif/elif/else if这几个是一样的)。
请注意,VCL中没有任何的循环和迭代器。
字符串、布尔值、时间、时间单位和整数
在varnish中有各种数据类型,你可以设置或者取消这些:
set req.http.User-Agent = "unknown";
unset req.http.Range;
字符串
基本的字符串都是以双引号包括,不得包含换行符。长字符串包括在{"..."}
中。他们可能会包含单双引号、换行符以及除了NUL(0x00)以外的其他控制字符。
布尔型
布尔型可以是true或者false。
时间
VCL中有时间类型,函数now
返回一个时间。持续的时间可以被添加到一个时间中,来成为另外一个时间。在字符串中它会返回一个格式化的字符串。
持续时间
持续时间可以使用一个数字加一个单位来限定。数量可以是实数,因此1.5w也是被允许的。
ms
毫秒s
秒m
分钟h
小时d
天w
周/星期y
年
整数
某些字段可能是整数,在字符串语境下,它会返回一个字符串。
实数
VCL中可以使用实数,和整数一样,在字符串的语境下,它会返回字符串。
正则表达式
varnish支持Perl兼容的正则表达式(PCRE)。有关完整的说明可以参见PCRE(3)手册。
要发送一个标识给PCRE引擎,例如做不区分大小写的匹配,括号内添加一个问号。例如:
# If host is NOT example dot com..
if (req.http.host !~ "(?i)example.com$") {
...
}
包含语句
在另外一个文件中包含一个VCL文件可以使用include关键字:
include "foo.vcl";
导入语句
导入语句主要用来加载varnish模块(VMODs)。
import std;
sub vcl_recv {
std.log("foo");
}
注释
单行注释可以使用//
或者#
。如果是多行注释的话可以使用/* block */
。例如:
sub vcl_recv {
// Single line of out-commented VCL.
# Another way of commenting out a single line.
/*
Multi-line block of commented-out VCL.
*/
}
后端定义
一个后端声明创建和初始化唯一后端对象。声明使用关键词backend后面跟一个后端名字。实际的声明是在大括号里:
backend name {
.attribute = "value";
}
唯一的一个强制必须有的属性是host。属性会从全局参数继承默认值。以下属性都是可用的:
host
(必须)
要使用的主机。ip地址或者可以解析为一个ip地址的hostname都是可以的。
port
varnish应该连接的服务器端口
host_header
添加的主机头
connect_timeout
连接超时时间
first_byte_timeout
varnish等待从后端接受第一个字节的超时时间,参考http://jolestar.com/varnish-timeout/
between_bytes_timeout
</