varnish入门
Varnish是一款高性能的开源HTTP加速器,挪威最大的在线报纸 Verdens Gang 使用3台Varnish代替了原来的12台Squid,性能比以前更好。
1:缓存命中率:
在memcached服务器中,get_hits的值表示缓存命中的次数,get_misses的值表示没有命中的次数,那么命中率的计算公式就是:命中率=get_hits/(get_hits+get_misses)
终端用户访问加速节点时,如果该节点有缓存住了要被访问的数据时就叫做命中,如果没有的话需要到原服务器取,就是没有命中。取数据的过程与用户访问是同步进行的,所以即使是重新取的新数据,用户也不会感觉到有延时。 命中率=命中数/(命中数+没有命中数), 缓存命中率是判断加速效果好坏的重要因素之一。
2:命中率有两种衡量指标
文档命中率:从命中的文档数量角度来衡量
字节命中率:从命中的字节大小角度来衡量
1:静态资源中的公共资源缓存
2:静态资源中的私有资源不缓存
3:动态资源中的公共资源缓存
4:动态资源中的私有资源不缓存
缓存的超时时长
参考 http://www.51testing.com/html/28/116228-238337.html
HTTP/
1.0 响应首部
Expires
HTTP/
1.1 响应首部
Cache
-Control:
max
-age=
60
(三)varnish进阶
RPM包
yum install -y varnish
编译安装
wget http:
//varnish-cache.org
/_downloads/varnish-
4.0.
5.tgz
http://varnish-cache
.org
1)Malloc 通过malloc获取内存,及分配内存。
2)Mmap file 创建大文件,通过二分法分段映射成
1G以内的大块。
default
.vcl :主配置文件
varnish
.params :服务器参数配置文件
(四)varnish配置文件详解
配置varnish进程参数的配置文件/etc/varnish/varnish.params,在启动varnish的时候,就会调用这个文件,可以在/usr/lib/systemd/system/varnish.service文件中看到,启动是确实调用了这个参数文件
RELOAD_VCL=
1
VARNISH_VCL_CONF=/etc/varnish/default.vcl
VARNISH_LISTEN_PORT=
7000
VARNISH_ADMIN_LISTEN_ADDRESS=
127.0.
0.1
VARNISH_ADMIN_LISTEN_PORT=
6082
VARNISH_SECRET_FILE=/etc/varnish/secret
VARNISH_STORAGE=
"malloc,256M"
VARNISH_USER=varnish
VARNISH_GROUP=varnish
DAEMON_OPTS=
"-p thread_pools=6 -p thread_pool_min=5 -p thread_pool_max=500 -p thread_pool_timeout=300"
请求处理流程
(1)请求的为可以缓存对象
1:缓存命中:通过本地缓存响应客户端
2:缓存未命中:varnish扮演为客户端的角色,发送请求报文,向后端服务器请求资源对象,可以缓存的对象先缓存再响应给客户端,不可以缓存的对象,不缓存直接响应给客户端
(2)请求的为不可以缓存对象
1:varnish扮演为客户端的角色,发送请求报文,向后端服务器请求资源对象
ACL控制机制图示
- 图示中所有的椭圆表示一个状态引擎,每一个状态引擎都会返回一个值,这个值来决定varnish内部的程序过程流向那个状态引擎。蓝色的矩形中的执行策略表示varnish如果去后端取得客户端请求的资源对象
1:req.:由客户发来的http请求相关
req
.http.:拿到请求报文各个首部值
例如:req
.http
.Cookie 拿到请求报文中的Cookie首部的值
2:resp.:由varnish响应给client的http响应报文
resp
.http. :响应报文的各个首部
例如:set resp
.http
.X-Cache =
"HIT from " + server
.hostname 给X-Cache首部赋值
3:bereq.:由varnish向backend主机发出的http请求 (backend request:后端主机的请求报文)
bereq
.http. :向backend主机发送的请求报文的对象
4:beresp.:由backend主机发来的http响应报文
beresp
.http. :由backend主机发来的http的响应报文的对象
5:obj. :存储在缓存空间中的缓存对象属性
在编写vcl配置文件中,常用的对象,已经对象的意义说明
1:
req
req
.method:请求的方法
req
.url:请求的
URL
2:
bereq
bereq
.http
.HEADERS:
varnish的请求报文首部
bereq
.request:请求方法
bereq
.url:请求的
URL
bereq
.proto:协议版本
bereq
.backend:指明要调用的后端主机
3:
beresp
beresp
.proto:后端主机响应给
varnish的协议版本
beresp
.status:响应状态码
beresp
.backend
.name:后端主机的主机名
beresp
.http
.HEADERS:后端主机响应报文的首部
beresp
.ttl:后端主机响应内容
ttl值
4:
obj
obj
.hits:对象在缓存中命中的次数
obj
.ttl:对象的
ttl值
5:
server:
server
.ip:主机的
IP
server
.hostname:主机名
vcl
4.0;
# 导入调度器模块
import directors;
#############################(一)################################
# 指定调度到后端的主机
backend web1 {
.host =
"192.168.23.21";
.port =
"8000";
.probe = {
# 指定做健康状态检查的URL,既然给了这个URL,一定需要让后端主机的站点目录里面有这个URL,如果没有varnish将不会将请求调度到这台主机上
.url =
"/health.html";
# 指定检查的超时时长
.timeout =
2s;
# 检查每次检查的时间间隔
.interval =
4s;
# 指定一个检测多少次
.window =
5;
# 指定最少成功多少次认为后端主机有效
.threshold =
1;
}
}
backend web2 {
.host =
"192.168.23.22";
.port =
"8000";
.probe = {
# 指定做健康状态检查的URL
.url =
"/health.html";
# 指定检查的超时时长
.timeout =
2s;
# 检查每次检查的时间间隔
.interval =
4s;
# 指定一个检测多少次
.window =
5;
# 指定最少成功多少次认为后端主机有效
.threshold =
1;
}
}
#############################(二)################################
# 定义负载均衡调度器
sub vcl_init {
# 创建一个调度器对象,directors.round_robin()指定了轮询调度算法
new static = directors.round_robin();
static.add_backend(web1);
static.add_backend(web2);
}
#############################(三)################################
# 第一个子历程,当收到请求处理的子历程
sub vcl_recv {
# 指定varnish接受到的请求,如果缓存没有命中,直接全部发往后端的static主机组
set req.backend_hint = static.backend();
# 如何请求方法是pri,直接返回synth子历程
if (req.method ==
"PRI") {
return (synth(
405));
}
# 如果不是一下七中方法的任意一个,直接返回pipe子历程
if (req.method !=
"GET" &&
req.method !=
"HEAD" &&
req.method !=
"PUT" &&
req.method !=
"POST" &&
req.method !=
"TRACE" &&
req.method !=
"OPTIONS" &&
req.method !=
"DELETE") {
return (pipe);
}
# 如果不是get或者head方法,我们就不用去查缓存,直接交由后端主机处理就是
if (req.method !=
"GET" && req.method !=
"HEAD") {
return (pass);
}
# 如果客户端的请求报文中的http首部包含认证信息或cookie信息,也直接交由后端主机处理,这是保密的静态内容
# 由于在haproxy对于动态请求都会在用户的浏览器中设置cookie信息,因此,下面这项先将其注释掉,以免请求都不能查询缓存
#
if (req.http.Authorization || req.http.Cookie) {
#
# return (pass);
#}
# 否则其他的请求都通过hash子历程处理
return (hash);
}
#############################(四)################################
# 对后端主机响应的响应报做修改
sub vcl_backend_response {
# 如何发往后端主机的请求报文的http首部中没有s-maxage参数,那么做两个
if判断
#
1:如果请求的是css样式代码,设置响应回来的资源对象的ttl值为
7200s,并且删除Set-Cookie参数
#
2:如果请求的是jpg图片,设置响应回来的资源对象的ttl值为
7200s,并且删除Set-Cookie参数
# 其他的请求都交由deliver子历程处理
if (beresp.http.cache-control !~
"s-maxage"){
# 这里要写为bereq.url,如果写成beresp.url会报错
if (bereq.url ~
"(?i)\.css$") {
set beresp.ttl =
7200s;
unset beresp.http.Set-Cookie;
}
if (bereq.url ~
"(?i)\.js$") {
set beresp.ttl =
7200s;
unset beresp.http.Set-Cookie;
}
if (bereq.url ~
"(?i)\.jpg$") {
set beresp.ttl =
7200s;
unset beresp.http.Set-Cookie;
}
}
return (deliver);
}
#############################(五)################################
# 这一条子历程是最后一个子历程
# 在deliver子历程中可以修改响应报文http的首部
sub vcl_deliver {
# 如果客户端的请求被缓存命中,那么加一个http的首部参数,明确告诉用户请求的资源是从缓存加载的
if (obj.hits>
0)
{
set resp.http.X-Cache =
"HIT from " + server.hostname;
}else{
set resp.http.X-Cache =
"MISS from " + server.hostname;
}
}
(五)varnish工具介绍
(对于缓存服务器,修改了配置,千万不能重启,重启就会清空所有的内存)
# 获取帮助
varnishadm -h
# 登入到varnishadm的命令行接口
varnishadm -S /etc/varnish/secret -T
127.0
.0
.1:
6082
# 获取命令帮助
help
# 装载指定的配置文件
vcl.load
例如:vcl.load config1
default.vcl
# 使用指定的配置文件
vcl.use
例如:vcl.use config1
# 删除配置文件
vcl.discard
例如:vcl.discard boot
# 列出所有可用的配置文件
vcl.list:
例如:vcl.list
# 显示配置文件的内容
vcl.show [-v]
例如:vcl.show config1
# 列出后端可用的主机
backend.list
查看varnish服务器的状态信息