官方文档:
Varnish TLS:4.1 4.0 下载地址:架构图: varnish的配置文件是C语言格式,要想被程序读取,必须把配置文件手动编译成二进制代码(执行一条命令就可以) Management每隔几秒钟会探测child/cache进程是否存活,(类似whtch dog) Accept:接收并相应请求,并不负责处理 Worker threads:负责处理请求,可能存在多进程.每个进程并发响应多请求. Log file:不指日志 而是在内存中用来保存日志所生成的工作区 (包括统计数据) varnishstat:用来查看统计数据 varnishncsa/varnishlog:用来查看日志信息 carnishtop:排名显示 整个child/cache模块中的进程必须共享数据才能协调工作,这块共享内存则可以成为log file/shared memory log(所以logfile中有锁机制) 每一个线程要想在log file中写数据 则必须有锁权限 varnish的工作特性: 当进程启动时,会占用大概90MB的内存空间,形成工作区,主要用来保存日志信息,(采用轮循机制),所以如果要保存日志,必须有进程负责读取工作区的数据并写入到硬盘中, *************************************************安装步骤********************* ]# yum install varnish************************************varnishde配置 程序环境 : Centos 7: /etc/varnish/varnish.params: 配置varnish服务进程的工作特性: Centos6 /etc/sysconfig/varnish* 大多数操作并不依赖于配置文件 而是基于varnish's command line进行配置和查询 /etc/varnish/default.vcl:配置child/Cache线程的工作属性: 主程序: /usr/sbin/varnishd CLI interface: /usr/bin/carnishadmin Shared Memory Log 交互工具: /usr/bin/varnishhist /usr/bin/varnishlog /usr/binvarnishncsa /usr/bin/varnishstat /usr/bin/varnishtop 测试工具: /usr/bin/varnishtest varnish_reload_vcl vcl文件重载程序启动服务: Stsremd Unit : /usr/lib/systemd/system/varnish.service carnish服务 /usr/lib/systemd/system/varnishlog.service /usr/lib/systemd/system/varrishncsa.service 日志持久化服务(用于把内存中的文件读取出来保存在磁盘上)用于不同格式的日志******************************************************************** varnish缓存数据机制: 1.malloc[,size] 存储在内存中 2.file[,parh[,size[,granularity]]] 存储到文件中 单个文件 黑盒机制(和nginx不同 是一个文件 不是bash分级)重启后失效 3. persistent,path,size 重启后依然有效 在开发阶段 不可用 (黑盒) ******************************************************************** Varnish程序的选项: man varnishd (配置服务的属性的) 程序选项:命令行选项 -a address[:port][,address[:port][...] 在指定的地址上监听请求 默认本机 -b host[:port] 指明后端服务器 ip地址 -T 管理接口 -s [name=]type[,options] : 定义缓存存储机制 -f 指明VCL配置文件 -F 运行与前台: ... 运行时参数: -r param[,param..]read only 设定参数只读 -p raram=value 设定运行的参数 大多数参数都有默认值.可以在配置文件 /etc/barnish/varnish.params定义: VARNISH_VCL_CONF=/etc/varnish/default.vcl 配置文件 VARNISH_LISTEN_PORT=6081 监听端口(代理接口) 如果是前段一级代理 则可改为80端口 VARNISH_ADMIN_LISTEN_ADDRESS=127.0.0.1 监听地址(管理) VARNISH_ADMIN_LISTEN_PORT=6082 管理监听地址 VARNISH_SECRET_FILE=/etc/varnish/secret varnishadmin的与共享密钥 VARNISH_STORAGE="file,/var/lib/varnish/varnish_storage.bin,1G" 默认缓存存储位置及类型 VARNISH_TTL=120 如果后端服务器没指明ttl 默认ttl缓存时常 VARNISH_USER=varnish 默认运行身份VARNISH_GROUP=varnish 组身份
DAEMON_OPTS="-p thread_pool_min=5 -p thread_pool_max=500 -p thread_pool_timeout=300" 其他参数 -p指明 其他项请参考 ]# man varnish******************************* 虽然内存速度很快 但久而久之会产生内存碎片 速度下降很严重 所以一般还是基于pcie接口的ssd做磁盘缓存 ******************************* VCL配置文件: default.vcl C语言格式. 配置cache的工作的机制的:"域"专有类型的配置语言(每个配置端有一个花括号) state engine:状态引擎: VCL有多个状态引擎,状态之间存在关联性,但彼此隔离 ,每个状态引擎使用return(x)指明 关联至哪个下一个引擎 ********************************************较老版本(3.0)的简单处理逻辑 方阔中是状态引擎 请求处理流程:(1) 接收请求:vcl_recv;判断其是否可缓存;
(a) 可缓存:vcl_hash
(i) 命中:vcl_hit
(ii)未命中:vcl_miss --> vcl_fetch
(b) 不可缓存:vcl_fetch
(2) 响应:vcl_deliver
vcl_recv --> vcl_hash --> vcl_hit --> vcl_deliver
vcl_recv --> vcl_hash --> vcl_miss --> vcl_fetch -->(有可能先缓存-->) vcl_deliver
vcl_recv --> vcl_fetch --> vcl_deliver 请求的是不可缓存数据 (不可缓存数据 是否做缓存要看规则)
vcl_recv --> vcl_pipe (客户端请求 varnish理解不了 直接发给后端服务器)
******************************************** 3.0版本图2 ***************************************************************** 完整处理逻辑
***********************************************以上为varnish3.0其他变更: 请参考
Varnish 4:vcl状态引擎切换流程;
request: vcl_recv --> vcl_hash
(1) hit: vcl_hit --> vcl_deliver
(2) pass, hit_for_pass: vcl_pass --> vcl_backend_fetch --> vcl_backend_response --> vcl_deliver
(3) miss: vcl_miss --> [ vcl_pass-->] vcl_backend_fetch --> vcl_backend_response --> vcl_deliver
(4) purge: vcl_purge --> vcl_synth
(5) pipe: vcl_pipe
(6) busy: vcl_waiting
两个特殊的引擎:
vcl_init:在处理任何请求之前要执行的vcl代码;主要用于初始化VMODs;
vcl_fini:所有请求都已经结束,在vcl配置被丢弃时调用;主要用清理VMODs;
***************************************************以上为varnish4.X模型**********************4.********************************实验过程 由于实验不使用nginx做反代.所以 varnish为一级代理 修改配置文件 /etc/barnish/varnish.params VARNISH_LISTEN_PORT=80 修改配置文件 /etc/varnish/defaut.vcl 执行命令: varnish_reload_vcl 将配置文件读取 修改后端服务器地址为C7R3 执行命令: varnish_reload_vcl 将配置文件读取
并在C7R3上安装httpd服务,给定主页内容 server test 1,启动服务;
直接请求 不经过varnish 首部如下: 继续请求 经过varnish 首部如下 代理缓存生效 ************************************varnishadmin管理命令 默认配置文件只允许从本机连入 Varnish命令 所以在本机上执行varnishadmin 命令 : 选项: -T 指明Varnish服务器地址 可以不用交互模式 -S 指明共享密钥 在本机执行或在授权机执行: ]# varnishadm -S /etc/varnish/secret -T 127.0.0.1:6082 (在本机可以直接执varnishadmin) 进入交互式模式 : help查看交互模式下的命令 vcl.list:显示列表 ist可能列出很多版本,但只能激活一个版本 vcl.load:加载并编译 vcl.use:激活 vcl.discard 删除(先反激活) 运行参数相关: param.show -l 显示列表 param.show <param> 显示指定参数 param.set < param><value> 设置参数的值 缓存存储列表 srorag.list 后端服务器: backend.lish ***********************************************VCL 文件格式****************vcl语法格式: vim /etc/varnish/defaut.vcl
(1) 支持注释符//,/*... */, #;
(2) sub $name:定义子例程;sub vcl_recv {...}; 通常指的是 cvl的状态引擎
(3) 不支持循环,支持条件判断;
(4) 有大量的内建变量,生效位置有特定要求;
(5) 使用终止语句return,来决定下一个状态引擎;没有返回值;
(6) 操作符:=,==, !, ~, &&, ||,>, <, >=, <=
例如修改:sub vcl_deliver {
if (obj.hits>0) { #obj.hits(内奸变量 当前资源的命中次数 真是当次请求 的变量)大于0
set resp.http.X-Cache = "HIT"; #设定resp.http.X-Cache=hit X-Cache首部不存在就加进去
} else {
set resp.http.X-Cache = "MISS"; #设定...MISS
}
} 这样请求资源就可看到是从cache返回的还是从 后端服务器返回的
要想生效配置:]#varnishadmin 执行 vcl.load test1 default.vcl #翻译default.vcl到配置test1列出当前配置列表 (active 表示当前生效 acailable 表示可用 并未生效)vcl.use test1 (使用test1 配置)vcl.list (查看状态) ********************再次用浏览器查看首部 varnish的服务器 X-Cache:MISS #因为是第一次访问 第二次访问 X-Cache:HIT ps:为毛我的浏览器跟shi一样坑....别人访问正常