三、
Varnish
参考手册
●VCL
(varnish configuration language
)
Author: Dag-Erling Smørgrav
Author: Poul-Henning Kamp
Author: Kristian Lyngstøl
Author: Per Buer
Date: 2010-06-02
Version: 1.0
Manual section: 7
DESCRIPTION
描述
VCL
语言是
varnish
(
HTTP
加速器)的一种限定域语言,目的在于规定请求的处理和内容的缓存策略。
当一个新的配置文件被加载,
varnish
管理进程把
vcl
转换成
c
代码,然后编译成动态共享库连接到服务器进程。
SYNTAX
语法
VCL
的语法相当简单,和
c
,
perl
相似。使用花括号做界定符,使用分号表示声明结束。注释和
C
、
C++
、
perl
语法一样,你可以自己选择。
除此之外还类似
c
语法,比如赋值(
=
)、比较(
==
)、和一些布尔值(!、
&&
、
||
),
VCL
支持正则表达式,
ACL
匹配使用
~
操作。
不同于
C
和
perl
的地方,反斜杠(
\
)在
VCL
中没有特殊的含义。只是用来匹配
URLs
,所以没有反斜线,请大家自由使用正则表达式。
把所有的字符串都连接在一起,并不对他们做任何操作。
分配和介绍设置关键字,
VCL
没有用户定义的变量,只能给
backend
、请求、内容这些目标的变量赋值,这些内容大部分是手工输入得,而且给这些变量分配值的时候,必须有一个
VCL
兼容的单位
VCL
有
if
测试,但是没有循环。
Backend declarations
(声明backend
)
一个
backend
申明创建和初始化一个
backend
目标:
backend www {
.host = "www.example.com";
.port = "http";
}
一个请求可以选着一个
Backend
:
if (req.http.host ~ "^(www.)?example.com$") {
set req.backend = www;
}
为了避免后端服务器过载,
.max_connections
可以设置连接后端服务器得最大限制数。
在
backend
中申明的
timeout
参数可以被覆盖,
.connect_timeout
等待连接后端的时间,
.first_byte_timeout
等待从
backend
传输过来的第一个字符的时间,
.between_bytes_timeout
两个字符的间隔时间
。
示例:
backend www {
.host = "www.example.com";
.port = "http";
.connect_timeout = 1s;
.first_byte_timeout = 5s;
.between_bytes_timeout = 2s;
}
DIRECTORS
Directors
基于健康状态和
per-director
算法选择不同的客户端。现在存在随机和循环两种
director
。
定义
Directors
:
director b2 random {
.retries = 5;
{
// We can refer to named backends
.backend = b1;
.weight = 7;
}
{
// Or define them inline
.backend = {
.host = "fs2";
}
.weight = 3;
}
}
The random director
任意的
director
使用
.retries.
这个参数指定查找可用后端的次数。默认
director
中的所有后端的
.retries
相同。
每个后端的选项
.weight ,
和发送多少流量到这个后端有关。
THE round-robin director
Round-robin
没有什么选项。
Bckend probes
(后端探针)
探测后端,确定他们是否健康。返回的状态使用
req.backend.healthy
核对。
.window
我们检查到的最近的
polls
数量。
.threshold
多少
polls
成功,我们就认为后端是健康的。
.intial
是多少探针确定
varnish
状态正常,默认和
threshold
值一样。
一个后端定义探针示例:
backend www {
.host = "www.example.com";
.port = "http";
.probe = {
.url = "/test.jpg";
.timeout = 0.3 s;
.window = 8;
.threshold = 3;
.initial = 3;
}
}
他可以指定原始的
http
请求:
backend www {
.host = "www.example.com";
.port = "http";
.probe = {
# NB: \r\n automatically inserted after each string!
.request =
"GET / HTTP/1.1"
"Host: www.foo.bar"
"Connection: close";
}
}
ACLS
一个
ACL
给一个访问控制列表命名,随后可以通过调用
ACL
名字来匹配对应的客户端地址。
acl local {
"localhost"; // myself
"192.0.2.0"/24; // and everyone on the local network
! "192.0.2.23"; // except for the dialin router
}
如果一个
ACL
中指定一个主机名,
varnish
不能解析,他将解析匹配到所有地址。
果你使用了一个否定标记(!),那么将拒绝匹配所有主机。
下面是一个匹配的示例:
if (client.ip ~ local) {
pipe;
}