varnish
Posted huxl1
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了varnish相关的知识,希望对你有一定的参考价值。
第一节
缓存一般是缓存热区的数据(访问量大是数据区)
缓存分为:
共有缓存:是多个用户共同使用共享
私有缓存:是独自使用的缓存
局部性:一般缓存热区的数据
时效性:缓存的数据具有时效性,过时还自动清理
缓存命中率:
页面命中率:基于页面数量衡量
字节命中率:基于页面大小体积衡量
缓存模式:
代理缓存:在客户端查询是查询缓存数据,若缓存数据没有时,缓存服务器会代理客户端去服务器端取数据后返回给客户端
旁观缓存:在客户端查询是查询缓存数据,若缓存数据没有时,需要客户端自己去服务器拿去数据,后有服务器决定要不要进行缓存。
Varnish是一款高性能、开源的反向代理服务器和缓存服务器。Varnish使用内存缓存文件来减少响应时间和网络带宽消耗。
varnish还可以通过端口进行管理,使用正则语句做到清除指定缓存的功能,
第二节
缓存有效判断机制:
过期时间:在响应报文首部给一个过期时间
Cache-Control: max-age=315360000
条件式请求控制逻辑:
当客户请求浏览器,它向请求上级服务器,看上次访问的时间戳多少,若没有改变,则返回304响应吗,浏览器直接缓存响应 (Last-Modified:Mon, 07 Nov 2016 07:51:11 GMT)
若返回200响应吗表改变过更新自己缓存,(Status Code:200 OK)
若不希望从缓存中响应在Cache-Control:no-cache 不从缓存响应
响应报文用于如何缓存的:
cache-response-directive=
private 可用公共缓存
nocache 可缓存但不直接响应 (在响应是必需先进行有效的认证)
no-store 不允许缓存
proxy-revalidate 有代理服务器校验
varinsh 架构:
varnishd是主程序,启动后生成两个进程,Manager Process(父进程)和Cacher Process(子进程),前者在启动时读入配置文件(稍后会讲到)并fork()出后者,同时具有CLI接口接收管理员的指令以用于管理后者,后者是真正处理缓存业务的进程,其下又可以生成若干线程,这些线程各司其职,完成缓存业务的处理并记录日志
安装vanish
yum install varnish-libs-3.0.7-1.el7.centos.x86_64.rpm varnish-libs-devel-3.0.7-1.el7.centos.x86_64.rpm varnish-docs-3.0.7-1.el7.centos.x86_64.rpm
yum install varnish-3.0.7-1.el7.centos.x86_64.rpm –y
启动:systemctl status varnish
配置文件:
/etc/varnish
/etc/varnish/default.vcl 配置缓存策略的
/usr/bin/varnishadm cli配置进程
varnish 的进程:
varinshd -s[name] type [options]
malloc [size] :内存存储 size定义空间大小重启后所有消失
file [path[size[granlarity]]] 文件存储重启后时效
persistent,path,size 文件存储 重启后缓存有效
yum info jemalloc 完成自己的内存分配
配置文件:
default.val 配置缓存策略的
varnish.params 进程配置的工作特性如环境端口
编译安装:
yum install -y automake autoconf libtool ncurses-devel libxslt groff pcre-devel pkgconfig
wget http://repo.varnish-cache.org/source/varnish-3.0.4.tar.gz tar
]# tar -zxvf varnish-4.0.5.tgz
# cd varnish-4.0.5
./configure --prefix=/usr/local/varnish
make&&make install
报:make: *** No targets specified and no makefile found. Stop.
将varnish安装目录改为root权限
实验 两台服务器器
rs:web服务器
1 时间同步:
vim /etc/chronyd.conf
systemctl restart chronyd.service
chronys sources 查看
varnish 程序选项 /etc/varnish/varnish.params
-a : 默认端口6081
-T : 默认管理端口6082 支持远程管理
-s : 定义缓存存储机制
-u:
-g:
-f : 定义vcl的配置文件
-F :运行与前台
运行时的参数设定在/etc/varnish/varnish.param 中最后一行
DHEMON_OPTS= “-p thread_pool_min=5 -p thread_pool_max=500 -p thread_pool_timeout = 300 “
-p : 设定参数的
-r param[,param] 设定参数为只读状态
设定varnish.param
vim /etc/varnish/varnish.param
VARNISH_LISTEN_PORT=80
VARNISH_STORAGE= “file,/date/varnish/cache, 1g”
mkdir /date/varnish/cache
chown –R varnish.varnish /date/varnish/cache
systemctl start varnish.service
ss –tnlp
2 定义后端服务器
]# vim /etc/varnish/default.vcl
重新加载
# varnish_reload_vcl
]# varnishadm -S /etc/varnish/secret -T 127.0.0.1:6082 开启命令行工具
help 获取帮助
status 状态查看
vcl.list
vcl.show
vcl 配置总结
vcl有多个状态引擎,状态之间存在相关性,但状态引擎彼此间相隔离,每个状态引擎可使用return()指明关联至那个下一级引擎,每个状态引擎对应cvl文件中配置段即为subroutine
第三节 配置 /etc/varnish/default.vcl
vcl_recv : 收到请求
vcl_pass : 判定(不能查缓存,可以查缓存)
vcl_hit : 命中
vcl_miss : 没有命中
vcl_purge: 清0
服务端状态引擎:
vcl_backend_fetch 取缓存
vcl_backend_reponse 取得能不能缓存
vcl_backend_error 错误, 取不到
函数构建:
regsub (str,regex,sub) 正则表达式查找替换
regsuball (str,regex,sub) 全部查找替换
ban ( boolean ,expression) 做bash 运算
两个特殊的引擎:
vcl_init : 在处理任何请求之前要执行vc l 代码,主要用于初始化
vcl_fini: 所有请求结束在cvl配置被丢弃是调用,主要用于清理
操作符: == != > >= < <=
逻辑符; && || !
内建变量:
rep.* : 表示由客户端发来的请求报文相关
req.url
bereq.* : 由varnish 发往BE主机的响应报文相关
resp.* : 由varnish响应给客户端报文相关
obj.* : 存储在缓存空间中的缓存对象属性,只读
beresp : 由BE主机响应varnish服务器的响应报文
常内变量:
bereq.request : 请求方法
bereq.url : 请求的url
bereq.protr : 请求的协议版本
bereq.backend : 指明调用的后端主机
req.http.cookie : 客户端的请求报文中cookie 首部值
beresp.status : 响应状态码
beresp.backend.name BE主机的主机名
beresp.ttl BE主机响应的内容的余下可缓存时长
obj.hits ; 从缓存中命中次数
obj.ttl : 对象ttl值
实例:
sub vcl_recv {
if (req.url ~ “(?i)^/(login|admin)”) {
return (pass);
}
}
(?i) 不分大小写
匹配到不查缓存
在varnishadm 命令行中
vcl.load test2 default.vcl
vcl.use test2
重新加载
访问:
curl -I http://ip/index.html
实例2
sub vcl_recv {
if (req.http.user_Agent ~ “(?i)curl”) {
return(synth(405));
}
}
用curl访问 拒绝访问
实例3
对特定类型资源,列入公开的图片等,取消其私有标识,并强行设定其可以由varnish缓存时长。
vcl_backend_response {
if (beresp.http.cache-contorl !~ “s-maxage”) {
if (bereq.url ~ “(?i) .(jpg|png|gif)$”) {
set beresp.ttl=3600s;
unset beresp.http.set-cookie;
}
}
}
第四节 缓存对象的修建
手动清理缓存 ;基于purge , ban 来清理
purge: 用vcl_purge 来定义让那些对象让缓存中清除
ban:用ban() 函数 通过正则表达式模式来从缓存中移除
实例:
定义purge
sub vcl_purge {
return (synth(200,”purged”));
}
调用:
sub vcl_recv {
if (req.method=”purge”) {
return(purge);
}
}
重新加载:
vcl.loal test7 default.vcl
vcl.use test7
访问:
curl -I http://192.16.0.6/index.html
curl -x http://192.16.0.6/index.html -x 如果命中缓存,就将缓存删除
对 purge 做控制:
实例2
acl purgers {
“172.0.0.0”/8; 只允许这个网段做purgers
“192.168.0.0”/24;
}
sub vcl_recv {
if (!client.ip ~ purgers) {
return (synth(405 “purges not allowed for client.ip”));
}
return(synth(200,”purged”));
}
访问: curl -x PURGE http://ip/index.html
ban 实例 临时按需清理的在命令行下进行输入
varnish> ban req.url ~ ^/javascripts
200
ban req.url ~ .js$
200
ban req.url == 1 && req.http.host ~ "ilinux.io" 清空一个域的缓存
200
也可以配置配置文件:
sub vcl_recv {
if (req_method == “BAN”) {
ban (“req.http.host == “+req.http.host+” && req.url == “req.url” ”);
return (synth(200,”ban added”));
}
}
访问:curl -x ban http://ip/index,html
如何在代理后端多台主机服务器
用directors 功能 需要加载director模块 :import directors
定义后端主机:
backend one {
host = “localhost”;
port = “80”;
}
定义组
sub vcl_init {
new 组名 = directors.round_robin();
组名.add_backend (one);
}
或者用random()来定义
new random_director = director.random();
random_director.add_backend(one,10);
random_director.add_backend(two,5);
调用:
sub vcl_recv {
set req.backend_hint=组名.backend();
}
实例: 动静分离
定义主机:
backend lmgsrvl {
host = “192.168.10.11”;
post = “80”;
}
backend lmgsrvl2 {
host = “192.168.10.12”;
post = “80”;
}
backend appsrvl {
host = “192.168.10.21”;
post = “80”;
}
backend appsrvl2 {
host = “192.168.10.22”;
post = “80”;
}
定义组:
sub vcl_init {
new imgsrvs= directors.random();
imgsrvs.add_backend(imgsrv1,10);
omgsrvs.add_backend(imgsrv2,20);
new appsrvs = directors.round_robin();
appsrvs.add_backend(appsrvl1);
appsrvs.add_backend(appsrvl2);
}
调用:
sub vcl_recv {
if (req.url ~ “(?i).(jpg|jpeg|png)$”) {
set req.backend_hint = lmgsrvs.backend();
}else {
set req.backend_hint=appsrvs.backend();
}
}
实例3 也可以基于cookie的回话
主机定意
定义组:
sub vcl_init {
new h = directors.hash();
h.add_backend(one,1);
h.add_backend(two,1);
}
调用:
sub vcl_recv {
set req.backend_hint= h.backend(req.http.cookie);
}
实例4 对后端做健康检查 用probe 来定义
backend one {
host= “192.168.0.103”;
probe={
.url=”/” ; 对/发动检查
.timeout=1s ; 超时时长
.interval=4 s ; 每多久发动一次检查
.window=5; 基于几次
.treshold=3 ; 折几次中至少有3次成功
}
也可以单独定义probe 再调用
probe www {
.url=”/” ; 对/发动检查
.timeout=1s ; 超时时长
.interval=4 s ; 每多久发动一次检查
.window=5; 基于几次
.treshold=3 ; 折几次中至少有3次成功
}
调用 :
backend one {
host=”192.168.0.1”
.probe=www;
}
backend.list 命令可以查看
第五节性能参数
# varnishadm -S /etc/varnish/secret -T 127.0.0.1:6082 命令行
param.show [-l] [<param>]
param.set <param> <value>
thread_pools 2 线程池数量默认2
thread_pool_add_delay 0 新增线程数
thread_pool_fail_delay 0.2 创建失败时隔多久重新创建线程
thread_pool_max 5000 最大线程数
thread_pool_min 100 每个池最小线程数
thread_pool_timeout 300s 空间线程超时时长超出会被杀掉
time计数器参数:
connect_timeout 3s
first_byte_timeout 60s
send_timeout 600 发送响应客户端的超时时长
timeout_idle 5 保持连接的超时时长
timeout_req 2 客户请求报文的首部的超时时长
日志区域:
前一部分:varnishstat 查看计数统计
后一部分:varnishlog 查看实时的日志内容
varnishncsa
varnishtop 排序显示
做压力测试
ab -n 100 -c 10 http://ip
命令:
varnishstat -1 -f MAIN.cache_hit
-1 显示一次 显示所有内容
-f 指定查看选项
常查看的有:
MAIN.threads 400 一共多少的线程
MAIN.cache_hit 235 命中数
MAIN.client_req 297 请求数
varnishtop 命令
-I 过滤单独标签
-x ---- 排除---- 后显示
-T ^resp (正则表达式)
启动日志进程:
systemctl start varnishncsa.service
systemctl enable varnishncsa.service
查看文件
tail /var/log/varnish/varnishncsa.log
以上是关于varnish的主要内容,如果未能解决你的问题,请参考以下文章