下面介绍的是varnish缓存
一、缓存基础
1、缓存的时效性
缓存有三种时效性机制,分别是过期清理(purge)、溢出清理(lru)、修改清理。
2、缓存的命中率
页面命中率(页面数量)、字节命中率(页面体积)。
3、数据的缓存位置
私有数据:【浏览器】完成缓存;
公有数据:【反代】上缓存。
4、缓存步骤(6步):
- 缓存服务器接收请求;
- 缓存服务器解析请求;缓存服务器从http协议首部中提取URL等首部信息;
- 查找缓存;
- 检查缓存是否有效,若是有效就构建相应的响应报文,并发送给客户端;
- 若是缓存无效,就调度到后端server,并返回请求数据,缓存服务器进行缓存后,再发送相应数据给客户端;
- 记录日志
二、varnish
1、varnish缓存组织架构:主进程/子进程。
manage进程:主进程,管理子进程,初始化缓存;
cache进程:子进程,多种线程模型。
varnish的配置接口为:vcl。
2、varnish程序环境
配置文件作用:
/etc/varnish/varnish.params:运行参数
/etc/varnish/default.vcl:子线程属性
主要命令:/usr/bin/
varnishd:varnish主程序
varnishadm:命令行接口
varnishtest:测试
varnish_reload_vcl:重载vcl配置文件
varnish.service:管理主进程
3、/usr/bin/varnishd --------------主程序
-a:服务地址(端口),默认127.0.0.1:6081;
-T:管理地址和接口,默认127.0.0.1:6082;
-s:缓存机制,malloc/file/persistent/path/size;
-f:指明vcl配置文件;
-p param=value:运行时参数及其值;
-r:运行时参数为可读。
4、/etc/varnish/varnish.params ----------运行时参数文件
DAEMON_OPTS = '-p param1=value1 -p ...'
thread_pool_min=
thread_pool_max=
thread_pool_timeout= //线程销毁的等待时间
线程模型:
cache-worker:处理请求
cache-main:启动cache功能
ban lurker:修剪
acceptor:新连接请求
epool/kqueue:线程池管理
expire:清理过期缓存
backend poll:后端服务器健康检测
5、varnishadm命令
常用选项:
-S:命令行工具
-T:管理地址和管理端口
varnishadm -S /etc/varnish/secret -T 127.0.0.1:6082
varnish>
vcl.list
vcl.load conf1 default.vcl //装载并编译acl文件
vcl.use conf1 //激活配置文件
vcl.list
vcl.discard //删除配置文件
param.show //显示运行时参数
param.set //设置运行时参数
storage.list //缓存存储相关
backend.list //后端服务器列表
6、vcl引擎(vcl不支持循环)
vcl_recv
vcl_hash
vcl_hit
vcl_deliver
vcl_pass
vcl_miss
vcl_backend_fetch
vcl_backend_error
vcl_backend_response
vcl_purge //修剪
vcl_pipe
vcl_synth
特殊引擎:
vcl_init:处理请求前执行的vcl代码,初始化vmods;
vcl_fini:结束时使用,清理vmods。
vcl内建变量:req., bereq., resp., beresp., obj.*
req.url <--> bereq.url
req.request <--> bereq.request
req.proto <--> bereq.proto
resp.status <--> beresp.status
7、缓存特定类型的资源,长时间不变的资源。
varnish调度到特定的资源上时,由于资源比较稳定,可以在varnish缓存调度器上进行缓存资源,以便其他客户端进行访问。对于匹配的bereq.url,进行unset beresp.http.Set-Cookie,并设置beresp.ttl。
8、purge
对于缓存修剪,在vcl_recv里面进行修剪匹配操作,使用大量的if语句进行修剪条件,其中可以使用req.method、client.ip等,可以使用return(synth(...))进行修改执行。
9、backend
对于varnish后端主机,我用backend {...}来进行设置,其中需要设置IP和端口号,也要设置probe{...}检测机制,对于检测机制来说,可以是动态的,也可以是静态的,还可以是图片等特殊资源,还可以进行健康状态检查,具体看怎么设置url。
10、varnish日志
- varnishstat命令
功能:varnish缓存状态
常用选项:
-1:批量显示所有信息
-1 -f filed_name:特定属性信息 - varnishstop命令
功能:
-1:批量显示
-i:显示指定的标签的信息
-I:显示指定字段的信息
-x:排除在外(指定的标签)
-X:排除所有匹配到的内容 - varnishlog命令
功能:显示相关日志 - varnishncsa命令
功能:显示相关日志,易读格式
11、varnish的内建函数
regsub:替换匹配到的第一个
regsuball:替换所有匹配的
ban:修剪所有匹配值
hash_data:指明做哈希的数据
synthetic:执行修剪
12、varnish配置总结
- 在varnish配置段中,需要先导入directors,类似Python语言的模块调用需要导入一样,后端配置都是在此基础上进行的。
- 然后是使用probe{...}定义检测机制,以便在后面定义backend时进行调用,其中可以设置URL、时间相关、次数相关内容。
- 接下来就是写后端backend{...},在backend字段中,需要定义后端主机和检测机制。
- 然后使用vcl_init{...}创建后端主机组,在主机组中设置具体的调度算法,具体怎么调度。
- 然后就是定义访问规则和引擎的使用,利用vcl_recv{...}来定义,在里面我们利用不同的if语句来进行不同的后端server匹配,并根据引擎进行相关服务器调度。