概念
- 程序的运行具有局部性特征:
- 时间局部性:一个数据被访问过之后,可能很快会被再次访问到;
- 空间局部性:一个数据被访问时,其周边的数据也有可能被访问到
局部性;
-
时效性:
-
缓存空间耗尽:LRU,最近最少使用;
-
过期:缓存清理
缓存命中率:hit/(hit+miss)(0,1) 页面命中率:基于页面数量进行衡量 字节命中率:基于页面的体积进行衡量
-
-
缓存与否:
- 私有数据:private,private cache;
- 公共数据:public, public or private cache;
-
缓存有效性判断机制:
- 过期时间:Expires
HTTP/1.0
Expires:过期
HTTP/1.1
Cache-Control: maxage=
Cache-Control: s-maxage= - 条件式请求:
Last-Modified/If-Modified-Since:基于文件的修改时间戳来判别;
Etag/If-None-Match:基于文件的校验码来判别;
- 过期时间:Expires
-
缓存层级:
- 私有缓存:用户代理附带的本地缓存机制;
- 公共缓存:反向代理服务器的缓存功能;
-
请求报文用于通知缓存服务如何使用缓存响应请求:
cache-request-directive =
“no-cache”,
| “no-store”
| “max-age” “=” delta-seconds
| “max-stale” [ “=” delta-seconds ]
| “min-fresh” “=” delta-seconds
| “no-transform”
| “only-if-cached”
| cache-extension -
响应报文用于通知缓存服务器如何存储上级服务器响应的内容:
cache-response-directive =
“public”
| “private” [ “=” <"> 1#field-name <"> ]
| “no-cache” [ “=” <"> 1#field-name <"> ],可缓存,但响应给客户端之前需要revalidation,即必须发出条件式请求进行缓存有效性验正;
| “no-store” ,不允许存储响应内容于缓存中;
| “no-transform”
| “must-revalidate”
| “proxy-revalidate”
| “max-age” “=” delta-seconds
| “s-maxage” “=” delta-seconds
| cache-extension
安装varnish
Manager进程
Cacher进程,包含多种类型的线程:
accept, worker, expiry, ...
shared memory log:
统计数据:计数器;
日志区域:日志记录;
varnishlog, varnishncsa, varnishstat...
配置接口:VCL
Varnish Configuration Language,
vcl complier --> c complier --> shared object
varnish的缓存存储机制( Storage Types):
-s [name=]type[,options]
· malloc[,size]
内存存储,[,size]用于定义空间大小;重启后所有缓存项失效;
· file[,path[,size[,granularity]]]
磁盘文件存储,黑盒;重启后所有缓存项失效;
· persistent,path,size
文件存储,黑盒;重启后所有缓存项有效;实验;
工作中一般使用磁盘储存(PCIE接口SSD)缓存
varnish程序的选项:
程序选项:/etc/varnish/varnish.params文件
-a address[:port][,address[:port][...],默认为6081端口;
-T address[:port],默认为6082端口;
-s [name=]type[,options],定义缓存存储机制;
-u user
-g group
-f config:VCL配置文件;
-F:运行于前台;
[root@CentOS7 ~]# yum install varnish -y
[root@CentOS7 ~]# rpm -ql varnish
/etc/varnish/default.vcl 配置各Child/Cache线程的缓存策略
/etc/varnish/varnish.params 配置varnish服务进程的工作特性
/usr/bin/varnishlog 日志格式
/usr/bin/varnishncsa 日志格式(任选其一即可)
/usr/sbin/varnishd 主程序
/usr/bin/varnishadm CLI interface
/usr/bin/varnishhist Shared Memory Log交互工具
/usr/bin/varnishlog
/usr/bin/varnishncsa
/usr/bin/varnishstat
/usr/bin/varnishtop
/usr/bin/varnishtest 测试工具程序:
/usr/sbin/varnish_reload_vcl VCL配置文件重载程序:
/usr/lib/systemd/system/varnish.service varnish服务
/usr/lib/systemd/system/varnishlog.service 日志持久的服务
/usr/lib/systemd/system/varnishncsa.service
配置
[root@varnish ~]# vim /etc/varnish/varnish.params
VARNISH_LISTEN_PORT=80 web端口为80
VARNISH_STORAGE="file,/data/varnish/cache,1G" 缓存位置及大小
[root@varnish ~]# mkdir -p /data/varnish/cache
[root@varnish ~]# chown -R varnish.varnish /data/varnish/cache/
[root@varnish ~]# ss -ntl
实验:配置后端服务器响应
配置文件相关:
vcl.list
vcl.load:装载,加载并编译;
vcl.use:激活;
vcl.discard:删除;
vcl.show [-v] <configname>:查看指定的配置文件的详细信息;
运行时参数:
param.show -l:显示列表;
param.show <PARAM>
param.set <PARAM> <VALUE>
缓存存储:
storage.list
后端服务器:
backend.list
[root@varnish ~]# vim /etc/varnish/default.vcl
backend default {
.host = "192.168.8.27";
.port = "80";
}
[root@varnish ~]# varnish_reload_vcl 加载
实验:实现命中率提示
vim /etc/varnish/default.vcl
sub vcl_deliver {
if (obj.hits>0) {
set resp.http.X-Cache="Hit Via " + server.ip;
} else {
set resp.http.X-Cache="Miss Via " + server.ip;
}
[root@varnish ~]# varnishadm -S /etc/varnish/secret -T 127.0.0.1:6082
Type 'help' for command list.
Type 'quit' to close CLI session.
·······