varnish简单应用
web cache基础讲解
Varnish: 官网
cache:
程序的运行具有局部性特征:
时间局部特性
空间局部特性 衡量缓存服务器的命中率
数据具有热点:2 8法则
缓存命中率:hit/(hit+miss)
文档命中率:从文档个数进行衡量
字节命中率:从内容的大小进行衡量
缓存的生命周期:
缓存清理:
缓存项过期;
缓存空间用尽:LRU算法
缓存与否:
私有数据:不可缓存
缓存处理的步骤:
接受请求------>解析请求(提取请求的URL及各种首部)------>查询缓存(查询KEY)新鲜度检测----->构建响应报文----->发送响应----->记录日志
http cache:
squid varnish
httpd nginx
缓存控制机制:
过期日期: 有效期限验证,查看缓存数据有没有发生变化
(未命中)浏览器发生请求----->首先到达代理缓存,如果未命中-------->向后端php(application)请求资源,http状态码200,给到缓存服务器------->缓存服务器再给到浏览器
(命中后)浏览器发生请求----->首先到达代理缓存,如果命中-------->直接cache服务器返回内容给客户端浏览器
新鲜度检测机制:
有效性再验证:revalidate
如果原始内容为改变,则仅响应首部(不用附带body部分),响应码为304;
如果原始内容发生了变化,则正常响应为200
如果原始内容丢失,则响应为404,此时缓存命中的缓存项也应该删除
条件式请求首部:
if-modified-since:基于原始内容的最近一次修改的时间戳进行有效性验证
if-unmodified-since:
if-match
if-none-match:基于Etag的比较进行
浏览器发生请求----->首先到达代理缓存,如果命中-------->向后端php(application)做新鲜度检测,看缓存内容是否过期,http状态码200,给到缓存服务器------->缓存服务器再给到浏览器
提高缓存命中率(hash url)
vcl:
vcl存在多个状态引擎,状态之间存在相关性,但彼此间相互隔离;每个引擎使用return(x)来退出当前状态,进入下一状态
请求处理流程
1.请求的为可缓存:
a.命中:通过本地缓存响应
b.未命中:到后端服务器拉取相应的内容
缓存对象:
1.定义缓存时间
2.自定义缓存键
2.请求的为不可缓存
a.到后端服务器拉取相应的内容
vcl_recv
vcl_hash
hit:vcl_hit
miss:vcl_miss
purge:vcl_purge
pipe:vcl_pipe
pass:hit_for_pass vcl_pass
vcl_backend_fetch
vcl_backend_response
vcl_backend_error
vcl_synth
vcl_deliver
purge:修剪缓存
pipe:管道
busy:候车区,等待
pass:到后端服务器去拉取内容
步骤1.修改varnish.params文件,修改监听端口为80
2.修改vcl.default文件,修改
backend default {
.host = "192.168.172.138";
.port = "80";
}
为后端主机的地址,进行反代理
3.varnishadm -S /etc/varnish/secret -T 127.0.0.1:6082 #链接命令行工具
使用命令:vcl.list vcl.show boot(文件名) vcl.use boot(切换配置文件)
default.vcl配置实例:
sub vcl_recv {
# Happens before we check if we have this in cache already.
#
# Typically you clean up the request here, removing cookies you don't need,
# rewriting the request, etc.
if (req.url ~ "^/test.html$") {
return(pass); #注:只要请求test.html,直接return到pass,不差缓存
}
}
sub vcl_deliver {
# Happens when we have all the pieces we need, and are about to send the
# response to the client.
#
# You can do accounting or modifying the final object here.
if (obj.hits>0) {
set resp.http.X-Cache = "HIT via" + " " + server.ip;
} else {
set resp.http.X-Cache = "MISS via" + " " + server.ip;
}
} 注:判断请求次数大于0就缓存,缓存服务器的ip和miss服务器的ip地址