Varnish Configuration Language (VCL)是varnish配置缓存策略的工具,它是一种基于“域”(domain specific)的简单编程语言,它支持有限的算术运算和逻辑运算操作、允许使用正则表达式进行字符串匹配、允许用户使用set自定义变量、支持if判断语句,也有内置的函数和变量等。使用VCL编写的缓存策略通常保存至.vcl文件中,其需要编译成二进制的格式后才能由varnish调用。事实上,整个缓存策略就是由几个特定的子例程如vcl_recv、vcl_fetch等组成,它们分别在不同的位置(或时间)执行,如果没有事先为某个位置自定义子例程,varnish将会执行默认的定义。
VCL策略在启用前,会由management进程将其转换为C代码,而后再由gcc编译器将C代码编译成二进制程序。编译完成后,management负责将其连接至varnish实例,即child进程。正是由于编译工作在child进程之外完成,它避免了装载错误格式VCL的风险。因此,varnish修改配置的开销非常小,其可以同时保有几份尚在引用的旧版本配置,也能够让新的配置即刻生效。编译后的旧版本配置通常在varnish重启时才会被丢弃,如果需要手动清理,则可以使用varnishadm的vcl.discard命令完成。
varnish支持的缓存存储类型:
总体架构流程:
内建变量:
req.*:request,表示由客户端发来的请求报文相关;
req.http.*
req.http.User-Agent, req.http.Referer, ...
bereq.*:由varnish发往BE主机的httpd请求相关;
bereq.http.*
beresp.*:由BE主机响应给varnish的响应报文相关;
beresp.http.*
resp.*:由varnish响应给client相关;
obj.*:存储在缓存空间中的缓存对象的属性;只读;
常用变量:
bereq.*, req.*:
bereq.http.HEADERS
bereq.request:请求方法;
bereq.url:请求的url;
bereq.proto:请求的协议版本;
bereq.backend:指明要调用的后端主机;
req.http.Cookie:客户端的请求报文中Cookie首部的值;
req.http.User-Agent ~ "chrome"
beresp.*, resp.*:
beresp.http.HEADERS
beresp.status:响应的状态码;
reresp.proto:协议版本;
beresp.backend.name:BE主机的主机名;
beresp.ttl:BE主机响应的内容的余下的可缓存时长;
obj.*
obj.hits:此对象从缓存中命中的次数;
obj.ttl:对象的ttl值
server.*
server.ip:varnish主机的IP;
server.hostname:varnish主机的Hostname;
client.*
client.ip:发请求至varnish主机的客户端IP;
配置文件:
vim /etc/sysconfig/varnish
NFILES=131072 #最大打开文件数65536*2
MEMLOCK=82000 #默认日志文件大小,单位kB
NPROCS="unlimited" #最大线程数量
RELOAD_VCL=1 #设置为1可以使用reload代替restart加载vcl
## Alternative 3, Advanced configuration
VARNISH_VCL_CONF=/etc/varnish/default.vcl # 定义vcl配置文件
VARNISH_LISTEN_ADDRESS= # 定义varnish服务监听地址
VARNISH_LISTEN_PORT=6081 # 定义varnish服务监听端口
VARNISH_ADMIN_LISTEN_ADDRESS=127.0.0.1 # 定义允许进行进程管理地址
VARNISH_ADMIN_LISTEN_PORT=6082 # 定义管理进程监听端口
VARNISH_SECRET_FILE=/etc/varnish/secret # 定义密码文件
VARNISH_MIN_THREADS=50 # 定义varnish启动时最小线程数
VARNISH_MAX_THREADS=1000 # 定义varnish启动时最大线程数
VARNISH_THREAD_TIMEOUT=120 # 定义varnish线程响应超时时间
VARNISH_STORAGE_FILE=/var/lib/varnish/varnish_storage.bin # 定义varnish文件存储地址
VARNISH_STORAGE_SIZE=1G # 定义缓存使用文件大小,单位:k/M/G/T
# VARNISH_MEMORY_SIZE=64M # 定义缓存使用内存大小 VARNISH_STORAGE="file,${VARNISH_STORAGE_FILE},${VARNISH_STORAGE_SIZE}"# 使用文件缓存
VARNISH_STORAGE="malloc,${VARNISH_MEMORY_FILE}" # 使用内存缓存
VARNISH_TTL=120 # 设置后端超时时间
DAEMON_OPTS="-a"
${VARNISH_LISTEN_ADDRESS}:${VARNISH_LISTEN_PORT} \ # 变量调用
-f ${VARNISH_VCL_CONF} \
-T ${VARNISH_ADMIN_LISTEN_ADDRESS}:${VARNISH_ADMIN_LISTEN_PORT} \
-t ${VARNISH_TTL} \
-w ${VARNISH_MIN_THREADS},${VARNISH_MAX_THREADS},${VARNISH_THREAD_TIMEOUT} \
-u varnish -g varnish \
-S ${VARNISH_SECRET_FILE} \
-s ${VARNISH_STORAGE}"
简单示例:添加http首部,让客户端可知缓存是否从服务器中得到
修改后端主机:
vim /etc/varnish/defatult.vcl
backend default {
.host = "172.18.19.11";
.port = "80";
}
添加vcl语句:
vim /etc/varnish/defatult.vcl
sub vcl_deliver {
if (obj.hits > 0) {
set resp.http.X-Cache = "anuuy";
} else {
set resp.http.X-Cache = "sunny";
}
}
sub vcl_hit {
return (deliver);
}
通过命令行工具varnishadm重载配置
varnish> vcl.list
200
active 0 boot
varnish> vcl.load test1 /etc/varnish/default.vcl
200
VCL compiled.
varnish> vcl.use test1
200
varnish> vcl.list
200
available 0 boot
active 0 test1