主机配置
backend www {
}
多个主机实现负载均衡。
director b2 random {
}
The random director(随即)
The round-robin director(轮询)
The client director 根据客户端(session COOKIE等)确认访问哪台服务器
The hash director(基于hash表来决定访问哪台服务器)
The DNS director
director directorname dns {
}
健康检查
backend www {
}
Or it can be defined separately and then referenced::
probe healthcheck {
}
backend www {
}
If you have many backends this can simplify the config a lot.
It is also possible to specify the raw HTTP request:
probe rawprobe {
}
An ACL declaration creates and initializes a named access control list which can later be used to match client addresses::
acl local {
}
if (client.ip ~ local) {
}
函数形式
sub pipe_if_local {
}
Subroutines in VCL do not take arguments, nor do they return values.
函数调用:
call pipe_if_local;
内置函数:
vcl_recv在请求开始的时候调用,判断是否处理该请求,怎样处理以及访问后台哪个服务器。
返回值可以为:
error code [reason]
返回指定错误代码,终止请求。
pass
切换到pass模式,调用vcl_pass函数。
pipe
切换到pipe模式,调用vcl_ pipe函数。
lookup
在缓存中查找请求对象,根据是否在缓存中调用vcl_hit or vcl_miss函数
vcl_pipe
在pipe模式下被调用,请求被传递到后台服务器,前台与后台直接多次交互,直到结束不写日志。
vcl_pass
在pass模式下被调用,请求被传递到后台服务器,前台与后台直接一次交互,不写日志。
The vcl_recv 会调用一下参数会停止。
error code [reason]
返回错误信息
pass
进入到pass模式
restart
重启事物。
vcl_hash
可以调用hash_data() 把数据添加到hash表中
vcl_hit
在cache中成功查找到数据会调用这个函数。
可以调用一下参数终止该函数
deliver
error code [reason]
pass
restart
vcl_miss
没有在内存中找到数据的时候调用这个函数,他的目的是是否从后台服务器上取数据,并且是从哪台服务器上取数据。
可以调用一下参数终止该函数
error code [reason]
pass
fetch
vcl_fetch
当后台服务器上的数据成功被加载到缓存中时调用。
可以调用一下参数终止该函数
deliver
数据被加载到cache中并传递给客户端。调用vcl_deliver
error code [reason]
pass
restart
vcl_deliver
缓存数据被传递给了客户端,调用这个函数。
可以调用一下参数终止该函数
deliver
error code [reason]
restart
vcl_error
当遇到后台或内部错误的时候会被调用。
可以调用一下参数终止该函数
deliver
Deliver the error object to the client.
restart
如果没有被定义会调用默认的。
函数样式:其中(?i)是正则表达式中不区分大小写的意思。
sub vcl_recv {
}
变量:
now
.host 源主机名或后台服务器IP地址
.port 源服务名或者服务端口号。
client.ip 客户端IP
server.hostname
server.identity
server.ip
server.port
req.request
req.url
req.proto
req.backend
req.backend.healthy
req.http.header
req.hash_always_miss 强迫varnish忽略这一请求,直接从元数据库取数据。
req.hash_ignore_busy 在cache lookup时,忽略忙的对象。
req.can_gzip
下面参数是varnish访问源数据库时使用:
bereq.request
bereq.url
bereq.proto
bereq.http.header
bereq.connect_timeout 等待连接源数据库的时间(以秒计算)
bereq.first_byte_timeout 连接后,得到第一个字节的时间(以秒计算)
bereq.between_bytes_timeout 在两个字节之间的时间(以秒计算)
从源数据库中得到数据,在写入cache之前使用的变量,也就是说:在vcl_fetch中使用的变量:
beresp.do_esi 解析ESI对象
beresp.do_gzip
beresp.do_gunzip 存储前是否解压缩
beresp.proto
beresp.status
beresp.response 由varnish返回的 HTTP status信息
beresp.ttl
目标对象被加载到cache中后,下面的变量可以使用,也就是说在 vcl_hit and vcl_deliver.函数中使用的变量:
obj.proto 对象检索时使用的http协议。
obj.status
obj.response由varnish服务器返回的http协议状信息。
obj.ttl
obj.lastuse 对象上次访问的大致时间
obj.hits
下面的变量在确定一个对象的hash值的时候可用。
req.hash
下面的变量在准备反应回给客户端的时候会被使用:
resp.proto response给客户端的HTTP 协议版本
resp.status
resp.response将被返回的HTTP协议状态信息
resp.http.header
变量实例:
sub vcl_recv {
}
HTTP headers can be removed entirely using the remove keyword::
sub vcl_fetch {
}
有时候我们的源数据库组织数据比较慢我们可以设定函数如下,这样,每个对象都会被保存在varnish cache中2分钟,这样就可以不用使用户一直等待了,虽然数据不是最新,但是总比用户无法访问强。
sub vcl_recv {
}
sub vcl_fetch {
}