什么是web cache?
Web缓存是指一个Web资源(如html页面,图片,js,数据等)存在与Web服务器和客户端(浏览器)直接的副本。缓存会根据进来的请求保存输出内容的副本;当下一个请求到来的时候,如果是相同的URL,缓存会根据缓存机制决定是直接使用副本响应访问请求还是向源服务器再次发送请求。 —–摘自Alloy Team
缓存命中率类型:
文档命中率:按文档数量进行衡量
字节命中率:按命中的字节数量进行衡量
缓存处理流程:
接受请求:接受来自client的访问请求
解析请求:提取client访问请求的URL中的头部信息
查询缓存:根据提取的头部信息查询缓存数据是否含有客户端访问的请求数据
新鲜度监测:如果缓存数据中含有客户端访问的数据,则检查数据的有效性
创建响应报文:当确定缓存命中的数据有效,则创建响应报文
发送响应报文:当响应报文构建完成之后,发送响应报文给客户端
记录日志:发送响应报文的同时记录日志信息
新鲜度监测的方法:
1、过期日期或有效性:
HTTP/1.0:使用Expries定义缓存过期的绝对时间
例如:Expires:Sat, 18 Jul 2015 03:41:04 GMT
HTTP/1.1: 利用Cache-Control定义文档的最大使用期限,是相对时长
例如:Cache-Control: max-age 1d: 缓存有效期为1天
2、服务器再验证:向服务器验证数据是否发送改变
1)如果原始内容没有改变,则服务器仅响应首部,不附带body部分,响应码为304;
2)如果原始内容发生改变,则正常响应,响应码为200;
3)若果原始内容已不存在,则响应码为404,此时缓存也应该清除缓存项;
3、条件式请求首部:
If-Modified-Since: 从指定时间之后的时间内,原始内容是否发生啦的改变
If-None-Match: 每个版本的文档都有一个标签ETag,当内容发生改变此ETag也会发送更改
控制缓存能力:
服务器端:Cache-Control
no-store: 不准缓存;
no-cache: 可以缓存,但在提供给请求者之前必须做新鲜度监测;
must-revalidate:可以缓存,但在提供给请求者之前必须做新鲜度监测;
max-age: 最大使用期限
Expires:过期的绝对时间
客户端新鲜度限制:Cache-Control
max-stale: 最大失效时间
max-stale=<s>:指定最大失效时间
min-fresh=<s>:最短有效时间
max-age=<s>:最大有效时间
注意:含有private、authentication、cookie等信息最好不要缓存;
varnish介绍:
varnish以一款开源的、高性能的http反向代理的缓存软件;
varnishi有两类线程:
management:
1)读入配置文件
2)调用合适类型的存储(有malloc内存、tmp、persisten三种存储类型)
3)创建/读入相应大小的缓存文件
4)初始化管理结构体空间
5)fork并监控child进程
child/cache:
1)将打开的存储文件映射进内存空间
2)创建并初始化空闲的结构体空间
varnish有九个状态引擎,如下图所示:
varnish配置文件介绍:
1)后端节点定义:
backend name { } ;
代理缓存:子进程定义
sub+状态引擎 { };
引擎之间都有相关性,前一个引擎通过return(x)定义退出状态,进而决定继续处理下一个引擎;
2)vcl:
vcl是基于“域”的简单编程语言;支持算术运算和逻辑运算,支持正则表达式,支持使用set、unset自定义变量或取消变量,支持if条件判断,有内置的函数和变量;
配置语法:
①注释://单行注释,/*…..*/多行注释
②sub $name 定义函数
③不支持循环
④支持终止语句return,没有返回值
⑤域专用
⑥操作符:=(赋值)、==(比较)、~(正则)、!(取反)、&&(和)、||(或者)
3)vcl的内置函数
regsub(str,regexp,sub):以regexp为模式匹配str,将匹配到的第一个替换为sub
regsuball(str,regexp,sub):以regexp为模式匹配str,将所有匹配到的都替换为sub
hash_date(str):做hash计算
purge:从缓存中挑出某对象并删除
return(x): 定义退出状态
4)内置变量:
req内置变量 | resp的内置变量 | bereq内置变量: |
---|---|---|
req.request: 请求方法req.url: 请求的urlreq.http.HEARDER: 请求的具体首部req.restarts: 请求报文重启次数server.ip: varnish服务器的ip地址server.port: varnish服务器的端口clinet.ip: 客户端ipserver.hostname: varnishi服务器名称req.backend: 请求时交由具体后端服务器 | resp.proto: 响应版本协议resp.status: 响应码resp.http.HEARDER:响应首部 | bereq.url: 请求的urlbereq.request: 请求方法bereq.http.HEADER: 请求的首部bereq.connect_timeout: 连接超时时长bereq.proto:向后端发起请求时使用的协议 |
beresp内置变量 | obj内置变量: | 相关说明: |
beresp.status: 后端响应码beresp.http.HEADER: 响应首部beresp.ttl: 响应ttl值,缓存时长beresp.backend.ip: 后端主机ipberesp.backend.port: 后端端口beresp.backend.name: 后端主机名 | obj.status: 缓存对象响应码obj.ttl: 缓存时长obj.hits: 缓存是否命中obj.http.HEARDER: 命中状态首部 | req: 是客户端发起的requestresp:是varnishi响应的responsebereq:是varnish向后端服务器发起请求beresp:是后端服务器响应给varnishobj:是缓存对象即将进入缓存 |
varnish配置:
1)安装
[root@varnish ~]# yum -y install varnish
2)配置varnish服务配置文件
[root@varnish ~]# vim /etc/sysconfig/varnish
# Configuration file for varnish
NFILES=131072 \\定义可以打开的最大文件数量
MEMLOCK=82000 \\定义log信息使用多大的内存空间,注意varnish log信息保存在内存中
NPROCS="unlimited" \\ 每个线程响应多少请求
# DAEMON_COREFILE_LIMIT="unlimited" \\ 保持默认即可
RELOAD_VCL=1 \\保持默认即可
# This file contains 4 alternatives, please use only one. \\有四种配置方法:
## Alternative 1, Minimal configuration, no VCL \\方法一
#
# Listen on port 6081, administration on localhost:6082, and forward to
# content server on localhost:8080. Use a fixed-size cache file.
#
#DAEMON_OPTS="-a :6081 \
# -T localhost:6082 \
# -b localhost:8080 \
# -u varnish -g varnish \
# -s file,/var/lib/varnish/varnish_storage.bin,1G"
## Alternative 2, Configuration with VCL \\方法二
#
# Listen on port 6081, administration on localhost:6082, and forward to
# one content server selected by the vcl file, based on the request. Use a
# fixed-size cache file.
#
#DAEMON_OPTS="-a :6081 \
# -T localhost:6082 \
# -f /etc/varnish/default.vcl \
# -u varnish -g varnish \
# -S /etc/varnish/secret \
# -s file,/var/lib/varnish/varnish_storage.bin,1G"
## Alternative 3, Advanced configuration \\方法三
#
# See varnishd(1) for more information.
#
# # Main configuration file. You probably want to change it <img src="http://www.178linux.com/wp-content/themes/d8-4.0/img/smilies/simple-smile.png" alt=":)" class="wp-smiley" style="height: 1em; max-height: 1em;" data-tag="bdshare" data-bd-imgshare-binded="1">
VARNISH_VCL_CONF=/etc/varnish/test.vcl \\定义主配置文件
#
# # Default address and port to bind to
# # Blank address means all IPv4 and IPv6 interfaces, otherwise specify
# # a host name, an IPv4 dotted quad, or an IPv6 address in brackets.
# VARNISH_LISTEN_ADDRESS=
VARNISH_LISTEN_PORT=80 \\定义监听端口,默认为6081
#
# # Telnet admin interface listen address and port
VARNISH_ADMIN_LISTEN_ADDRESS=127.0.0.1 \\管理varnish监听地址
VARNISH_ADMIN_LISTEN_PORT=6082 \\管理varnish的监听端口
#
# # Shared secret file for admin interface
VARNISH_SECRET_FILE=/etc/varnish/secret \\varnish加密文件
#
# # The minimum number of worker threads to start
VARNISH_MIN_THREADS=50 \\varnish最小进程数
#
# # The Maximum number of worker threads to start
VARNISH_MAX_THREADS=1000 \\varnish最大进程数
#
# # Idle timeout for worker threads
VARNISH_THREAD_TIMEOUT=120 \\varnish工作进程超时时长
#
# # Cache file location
VARNISH_STORAGE_FILE=/var/lib/varnish/varnish_storage.bin \\缓存文件存储类型,可以定义使用内存存储
#
# # Cache file size: in bytes, optionally using k / M / G / T suffix,
# # or in percentage of available disk space using the % suffix.
VARNISH_STORAGE_SIZE=1G \\定义存储空间大小
#
# # Backend storage specification
VARNISH_STORAGE="file,${VARNISH_STORAGE_FILE},${VARNISH_STORAGE_SIZE}" \\定义存储属性
#
# # Default TTL used when the backend does not specify one
VARNISH_TTL=120 \\缓存时长
#
# # DAEMON_OPTS is used by the init script. If you add or remove options, make
# # sure you update this section, too.
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}"
#
## Alternative 4, Do It Yourself. See varnishd(1) for more information. \\方法四
#
# DAEMON_OPTS="
3)配置varnish主配置文件,添加响应报文首部
[root@varnish sysconfig]# cd /etc/varnish/
[root@varnish varnish]# cp default.vcl test.vcl
[root@varnish varnish]# vim test.vcl
backend default { \\定义后端主
.host = "172.16.2.14"; \\后端主机地址
.port = "80"; \\后端主机监听端口
}
sub vcl_deliver { \\在vcl_deliver状态引擎中定义
if (obj.hits > 0) { \\如果缓存命中次数大于0
set resp.http.X-Cache = "HIT"; \\添加响应首部X-Cache;设置值为HIT;
} else {
set resp.http.X-Cache = "MISS"; \\ 添加响应首部X-Cache;设置值为MISS;
}
return (deliver); \\定义返回状态
}
应用此配置:
[root@varnish ~]# /etc/init.d/varnish start
root@varnish ~]# varnishadm -S /etc/varnish/secret -T 127.0.0.1:6082 \\进入varnish管理界面
200
-----------------------------
Varnish Cache CLI 1.0
-----------------------------
Linux,2.6.32-431.el6.x86_64,x86_64,-sfile,-smalloc,-hcritbit
varnish-3.0.7 revision f544cd8
Type 'help' for command list.
Type 'quit' to close CLI session.
varnish> vcl.load t1 /etc/varnish/test.vcl \\载入配置文件
200
VCL compiled.
varnish> vcl.use t1 \\使用配置文件
200
测试1:
测试2:
4)设置缓存时长:
sub vcl_fetch { \\在vcl.fetch状态引擎定义
if (bereq.http.Set-Cookie) { \\如果varnish请求有cookie信息
unset bereq.http.Set-Cookie; \\将cookie信息去掉
set beresp.ttl= 120s; \\设置缓存时长为120s
}
return (deliver); \\定义返回状态
}
应用此配置:
arnish> vcl.load t2 /etc/varnish/test.vcl
200
VCL compiled.
varnish> vcl.use t2
200
访问测试:
5)利用varnish自带着函数(purge)清空缓存
定义访问权限:
acl clean { \\定义acl名称
"127.0.0.1"; \\允许访问地址
"172.16.2.0"/24; \\允许访问的网段,注意网络长度写在引号外面;
}
sub vcl_recv { \\在vcl_recv状态引擎定义请求信息
if (req.request == "PURGE") { \\如果请求方式为"PURGE"
if (!client.ip ~ clean) { \\如果clinet端地址不是来自定义的合法(clean)ip
error 405 "Not allowed"; \\返回错误信息,告知不能访问
}
return (lookup); \\定义返回状态;
}
}
sub vcl_hit { \\在vcl_hit状态引擎中定义策略
if (req.request == "PURGE") { \\如果缓存命中且请求方法为"PURGE"
purge; \\执行内置函数purge
error 200 "Purged"; \\返回信息
}
}
sub vcl_miss { \\在vcl_miss中定义策略
if (req.request == "PURGE") { \\如果请求方法"PURGE"没有命中
error 200 "no cache"; \\则返回没有缓存
}
}
应用此配置文件:
varnish> vcl.load t3 /etc/varnish/test.vcl
200
VCL compiled.
varnish> vcl.use t3
200
测试:
正常访问测试:
[root@varnish varnish]# curl -I http://172.16.2.12
HTTP/1.1 200 OK
Server: Apache/2.2.15 (CentOS)
Last-Modified: Thu, 02 Jul 2015 10:21:42 GMT
ETag: "23fd60-16-519e1ce44df0b"
Content-Type: text/html; charset=UTF-8
Content-Length: 22
Accept-Ranges: bytes
Date: Thu, 02 Jul 2015 12:20:52 GMT
X-Varnish: 2144388607 2144388575
Age: 22
Via: 1.1 varnish
Connection: keep-alive
X-Cache: HIT
利用PURGE方式访问:
[root@varnish varnish]# curl -I -X PURGE http://172.16.2.12
HTTP/1.1 200 Purged \\返回成功信息
Server: Varnish
Content-Type: text/html; charset=utf-8
Retry-After: 5
Content-Length: 380
Accept-Ranges: bytes
Date: Thu, 02 Jul 2015 12:21:31 GMT
X-Varnish: 2144388608
Age: 0 \\保存时长为0
Via: 1.1 varnish
Connection: close
X-Cache: MISS \\访问没有被缓存命中
相关连接:
https://fr.wikipedia.org/wiki/Cache-Control
https://www.varnish-cache.org/docs/3.0/