varnish

来源:互联网 发布:放弃后的心疼网络歌曲 编辑:程序博客网 时间:2024/06/10 18:32

本文毫无条理性,不建议阅读

varnish
帮助获取地址
官网:www.varnish-cache.org
varnoish设计架构
varnish程序设计架构
启动时启动 ManageMent进程
管理进程,从对应的配置文件中(DSL:varnish专用的配置语言)生成配置,调用编译器VCL compiler –> C compiler
应用新配置,
监控varnish子进程运行情况.
初始化varnish,
提供管理程序的CLI接口:
child/cache
提供命令行接口
进行哈希
记录日志
接受用户请求
与后端服务器建立连接
工作线程
缓存过期检测
Acceptor:接收新的连接请求;
worker threads:处理用户请求;
Expiry:清理缓存中的过期对象;
对于用户的访问,则开启一个线程进行访问.
而且处理用户连接请求的child/cache不止一个,而且并非所有的child/cache都进行用户请求的处理
vcl:域类型的配置语言
缓存策略配置接口,配置需要基于域进行配置 ,或是基于域的简单编程语言
日志
日志类型为:共享内存日志
共享的内存默认大小为90M
分为两部分:计数器,记录的访问信息
日志的结构为环形,当日志保存空间满后覆盖之前最开始的日志
varnish运行架构
varnish对请求的处理 ,使用了与iptables类似的机制.但是在varnish中称为状态引擎
状态引擎结构
3.0版本
client
发起请求
由varnish
接收请求
vcl.recv
接收请求
判断是否为缓存对象
为可缓存对象
val_hash
缓存中的对象为哈希存储,将请求进行哈希
进行缓存查询
缓存中不存在
vcl_miss()
缓存中存在
vcl_hit()
为不可缓存对象
val_felch()
负责到后端服务器获取内容
vcl_deliver()
构建客户端响应
进行响应
3.0版本状态引擎说明
vcl_recv
vcl_hash
vcl_hit
vcl_miss
vcl_fetch
vcl_deliver
vcl_pipe 当接收到的请求自身无法理解判断处理时,直接将请求发往后端,而发往后端使用 vcl_pipe
vcl_pass 当vcl_recv判断请求的资源是不能被缓存的资源时时,交由vcl_pass进行处理
vcl_error当 vcl_recv进行判断时,如果拒绝使用vcl_error合成错误页面
正常处理的流程
vcl_recv –> vcl_hash –> vcl_hit –> vcl_deliver
vcl_recv –> vcl_hash –> vcl_miss –> vcl_fetch –> vcl_deliver
vcl_recv –> vcl_pass –> vcl_fetch –> vcl_deliver
vcl_recv –> vcl_pipe
4.0版本
client
发起请求/重启请求
由varnish
接收请求
vcl.recv
接收请求
判断是否为缓存对象
为可缓存对象
val_hash
缓存中的对象为哈希存储,将请求进行哈希
进行缓存查询
缓存中不存在
vcl_miss()
miss
缓存中存在
使用了返回至hit-for-pass
使用了purge
vcl_purge
vcl_hit()
lookup
为不可缓存对象
val_felch()
负责到后端服务器获取内容
vcl_deliver()
构建客户端响应
进行响应
判断是否非无法理解对象
vcl_pipe
判断是否为不能缓存对象
vcl_pass
pass
4.0状态引擎说明
vcl_recv
vcl_pass
vcl_pipe
vcl_hash
vcl_hit
vcl_miss
vcl_backend_fetch
vcl_backend_response
vcl_backend_error
vcl_purge
vcl_synth
各引擎之间存一定程度上的相关性;前一个<状态引擎>如果可以有多种下游<状态引擎>,则上游<状态引擎>需要用return指明要转移的下游<状态引擎>;
varnish安装
使用yum安装
yum install epel-release
yum info varnish
查看版本,为4.0.5
yum install -y varnish
其中会安装jemalloc-3.6.0-1.el7.x86_64.rpm包在epel中提供
该包提供le新的内存创建回收机制而不使用系统自带的内存创建回收(malloc(), free())
yum安装后启动
/usr/lib/systemd/system/varnish.service
主服务程序
/usr/lib/systemd/system/varnishlog.service
从共享内存日志中抽取日志
/usr/lib/systemd/system/varnishncsa.service
抽取为ncsa的日志
varnish的缓存方式
file:
varnish创建一个大文件,类似于虚拟机的虚拟硬盘文件,在该文件上建立文件系统,varnish在该建立了文件系统的大文件上进行存储,该文件系统为特制文件系统.但是此种方式尽是把值放在了文件中.key依然在内存中,所以重启后失效
malloc
缓存在内存中,jemalloc为此方式服务.
在内存中缓存个缓存对象
在centos6 系统后如果,程序需要使用大内存,那么系统会自动进行大的系统内存分页,(将不在使用4K为页大小,而是使用4M或更大)但是大的内存分页,对于varnish的内存中的数据大小来说,大内存可能会降低varnish性能,
persistent:基于文件的持久存储;
在3前作为实验项目
配置
varnish的配置机制
varnish的配置可以分为程序运行的参数(程序监听的端口等信息);以及缓存管理的参数(如何管理缓存)
程序运行的参数配置:
即程序主进程的配置或者说程序运行时的选项,通过一种干他大爷的巧妙的方式在主程序运行时进行传递.
使用varnishd启动程序时,向varnishd传递的参数,varnishd为varnish的主程序.
也可配置在文件中:/etc/varnish/varnish.params (该文件的作用时在程序启动时,提供变量的值,在启动脚本中已经将选项指明,而选项后的值为变量.)
/usr/lib/systemd/system/varnish.service文件的信息
EnvironmentFile=/etc/varnish/varnish.params

Type=forking
PIDFile=/var/run/varnish.pid
PrivateTmp=true
ExecStart=/usr/sbin/varnishd \
-P /var/run/varnish.pid \
-f VARNISHVCLCONF a{VARNISH_LISTEN_ADDRESS}:VARNISHLISTENPORT T{VARNISH_ADMIN_LISTEN_ADDRESS}:VARNISHADMINLISTENPORT SVARNISH_SECRET_FILE \
-u VARNISHUSERgVARNISH_GROUP \
-s VARNISHSTORAGE DAEMON_OPTS

ExecReload=/usr/sbin/varnish_reload_vcl
/etc/varnish/varnish.params 文件中的变量
RELOAD_VCL=1
VARNISH_VCL_CONF=/etc/varnish/default.vcl
VARNISH_LISTEN_PORT=6081
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
被注释掉的-p 选项,使用一个变量进行统一存储

Other options, see the man page varnishd(1)

DAEMON_OPTS=”-p thread_pool_min=5 -p thread_pool_max=500 -p thread_pool_timeout=300”

            以上可见,实际上varnish的启动是 启动脚本 启动时添加进行选项与选项对用的参数但是参数使用了变量的形式,而变量的定义则在 varnish.params文件中        子程序的配置参数:

又称为运行时参数
可以在配置文件/etc/varnish/varnish.params中使用-p 进行指定
可以在程序运行中,通过其CLII进行配置;
缓存系统的缓存机制;
通过vcl配置文件进行配置;
先编译,后应用;
依赖于c编译器;
vcl配置文件
/etc/varnish/default.vcl
配置文件
/etc/varnish/目录下
/etc/varnish
/etc/varnish/default.vcl
/etc/varnish/varnish.params
该文件定义了在程序启动时,加载的程序运行的参数,即程序的环境变量
vcl配置
配置vcl的域的规则
vcl的配置文件语法格式使用了模块化的编程风格
使用sub声明一个域配置的语句模块
支持终止语句,return,指明下一个处理的域
支持的操作符 操作符:=, ==, ~, !, &&, ||
判断语句if 语法格式
if (判断条件) {
语句块
} else {
语句块2
}
判断条件
可以是判断表达式的值
可以是变量
变量时数值时 0为假
变量是字符串时 空为假
变量赋值声明
使用set进行赋值表达式的声明
使用unset 可以取消变量的值
格式 set name=value
格式 unset name
字符需要使用”” 进行声明
子主题 4
内置变量
req.http.请求首部某个键 :获取调用request报文中某个请求首部的值
子主题 1
req.request: 请求方法
client.ip: 客户端IP
变量种类
客户端请求报文
req.
服务器端响应报文
resp.
客户端的信息
client.
向后端服务器的请求
bereq.
bereq.http.请求报文首部
生成请求报文的首部
bereq.request
请求的方法
bereq.url
请求的报文url
bereq.proto
使用的协议版本
后端服务器的响应
beresp.
beresp.proto
后端服务器响应时的协议版本
beresp.status
后端响应的状态吗
beresp.backend.ip
后端服务器响应报文的ip地址
beresp.http.响应报文的首部
生成响应报文的首部
varnish 主机
server
响应给客户端的内容属性
obj.
storage
内置函数
regsub
字符串查找替换,替换第一次出现
regsuball
字符串查找替换,替换所有
ban
缓存对象清理
配置后端的web server主机
每个backend 声明一个后端主机
子主题 2
例:
backend default {
.host = “127.0.0.1”;
.port = “8080”;
}
4.0默认配置vcl_recv
sub vcl_recv {
if (req.method == “PRI”) {
/* We do not support SPDY or HTTP/2.0 */
return (synth(405));
}

if (req.method != "GET" &&  req.method != "HEAD" &&  req.method != "PUT" &&  req.method != "POST" &&  req.method != "TRACE" &&  req.method != "OPTIONS" &&  req.method != "DELETE") {    /* Non-RFC2616 or CONNECT which is weird. */    return (pipe);}if (req.method != "GET" && req.method != "HEAD") {    /* We only deal with GET and HEAD by default */    return (pass);}if (req.http.Authorization || req.http.Cookie) {    /* Not cacheable by default */    return (pass);}return (hash);

}
设置自定义的返回头部
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” + server.ip;
}else {
set resp.http.X-Cache = “MISS” + server.ip;
}
}
设置特定的资源不使用缓存
sub vcl_recv {
if (req.url ~ “^/1.html"||req.url "/2.html”) {
return (pass);
}
}
/admin
/login

if (req.url ~ “(?i)^/login” || req.url ~ “(?i)^/admin”) {
return(pass);
}
使用 ~ 表示进行正则匹配,
使用(?i) 表示不区分大小写
配置后端集群主机
进行主机声明
backend default {
.host = “172.16.251.19”;
.port = “80”;
}

backend imgsrv {
.host = “172.16.251.37”;
.port = “80”;
}
将后端主机定义为组
import directors;
sub vcl_init {
new 组名称 = directors.调度方法();
组名称.add_backend (定义的主机);
组名称.add_backend (定义的主机);
在 vcl.recv中定义转发到的组
set req.backend_hint = dongge.backend();
负载均衡调度算法:
fallback, random, round_robin, hash
设置健康检测
声明关键字
probe
关于主机的健康检测可以使用两种方式进行声明,一种是直接在主机中声明,一种是在外面声明然后在主机中进行调用.
backend default {
.host = “172.16.251.19”;
.port = “80”;
.probe = {
.url = “/1.html”;
}
}

backend imgsrv {
.host = “172.16.251.37”;
.port = “80”;
.probe = {
.url = “/1.html”;
}
}
管理工具
varnishd
主程序
varnishd -f :
指定vcl文件的位置
varnishd -a:
监听的端口以及地址(服务端口)
默认监听的端口为6081 (服务接口),6082(管理接口)
varnishd -T
设置管理接口
varnishd -d:
运行在调试模式
varnishd -g:
运行程序的用户组
varnishd -u:
发起进程的用户的身份
varnishd -p:
设定新的 param=value
varnishd -s
指明使用的缓存存储方式
格式:
-s [name=]type[,options
· malloc[,size]
· file[,path[,size[,granularity]]]
· persistent,path,size
varnishadm
连接管理器,类似于mysql的管理方式
连接: varnishadm -S /etc/varnish/secret -T 127.1:6082
-S 指明秘钥文件
-T 指明连接的端口
连接后
help 获取可以使用的命令,列表
ping 探测服务器是否还活着
status 显示当前服务器的状态
start/stop:启动停止子进程
vcl.list :显示当前的可用配置列表
vcl.use : 指明使用的配置
vcl.discard :删除指明的配置
vcl.load :编译配置文件,并装载
vcl.show : 显示指定的配置文件,编译前的代码
param.show :显示运行时的参数
param.set :设置运行时的参数,等价于在varnish.params 文件中的-p,但是如果使用-r声明过的参数无法更改
panic.show : 显示崩溃的信息
panic.clear : 清除崩溃的信息
backend.list :显示后端服务器的列表
backend.set : 设置后端主机的状态
ban :清理缓存中的缓存对象
ban.list :显示设定的ban规则列表
nmcli的链接概念
生效的不是配置文件,而是配置文件生成的配置
varnishlog
显示varnish日志
varnishncsa
显示varnish的ncsa类型的日志
varnishtop
显示排序信息,马哥说不用了解的那么清楚
varnishstat
显示varnish状态信息
读取共享内存空间获取

原创粉丝点击