Linux–varnish(一)
简介
varnish 是一款高性能且开源的反向代理服务器和 http 加速器,其采用全新的软件体系机构,和现在的硬件体系紧密配合,与传统的 squid 相比,varnish 具有性能更高、速度更快、管理更加方便等诸多优点;
目前最新版本是4.0.0,而3.x的版本也是可以生产环境下使用的稳定版本,但yum源中的2.x版本过于陈旧,不建议使用;
varnish与squid的对比
相同点
都是一个反向代理服务器;
都是开源软件;
varnish的优势
varnish的稳定性很高,两者在完成相同负荷的工作时,squid服务器发生故障的几率要高于varnish,因为使用squid要经常重启;
varnish访问速度更快,因为采用了“visual page cache”技术,所有缓存数据都直接从内存读取,而squid是从硬盘读取,因而varnish在访问速度方面会更快;
varnish可以支持更多的并发连接,因为varnish的tcp连接释放要比squid快,因而在高并发连接情况下可以支持更多tcp连接;
varnish可以通过管理端口,使用正则表达式批量的清除部分缓存,而squid是做不到的;
squid属于是单进程使用单核cpu,但varnish是通过fork形式打开多进程来做处理,所以可以合理的使用所有核来处理相应的请求;
varnish的劣势
varnish进程一旦hang、crash或者重启,缓存数据都会从内存中完全释放,此时所有请求都会发送到后端服务器,在高并发情况下,会给后端服务器造成很大压力;
在varnish使用中如果单个url的请求通过ha/f5等负载均衡,则每次请求落在不同的varnish服务器中,造成请求都会被穿透到后端;而且同样的请求在多台服务器上缓存,也会造成varnish的缓存的资源浪费,造成性能下降;
varnish劣势的解决方案
针对劣势一:在访问量很大的情况下推荐使用varnish的内存缓存方式启动,而且后面需要跟多台squid服务器。主要为了防止前面的varnish服 务、服务器被重启的情况下,大量请求穿透varnish,这样squid可以就担当第二层cache,而且也弥补了varnish缓存在内存中重启都会释 放的问题;
针对劣势二:可以在负载均衡上做url哈希,让单个url请求固定请求到一台varnish服务器上;
架构及文件缓存的工作流程
程序架构:
manager进程 管理进程
cacher进程,包含多种类型的线程:
accept, worker, expiry, ...
shared memory log:
统计数据:计数器;
日志区域:日志记录;
varnishlog, varnishncsa, varnishstat...
配置接口:vcl
varnish configuration language, dsl(domain specific language) 域专用语言
过程:vcl complier --> c complier --> bin shared object
vcl complier
1 转成c语言代码
2 编译成c语言模块
3 被varnish cache主进程装载使用
varnish配置文件
varnish配置由varnishadm工具来管理port:6081:6082(management)
http请求的方法:
http/1.1协议*定义了八种方法(有时也叫“动作”),来表明request-url指定的资源不同的操作方式
1、options
返回服务器针对特定资源所支持的http请求方法,也可以利用向web服务器发送‘*’的请求来测试服务器的功能性
2、head
向服务器索与get请求相一致的响应,只不过响应体将不会被返回。这一方法可以再不必传输整个响应内容的情况下,就可以获取包含在响应小消息头中的元信息。
3、get
向特定的资源发出请求。它本质就是发送一个请求来取得服务器上的某一资源。资源通过一组http头和呈现数据(如html文本,或者图片或者视频等)返回给客户端。get请求中,永远不会包含呈现数据。
4、post
向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。post请求可能会导致新的资源的建立和/或已有资源的修改。 loadrunner中对应post请求函数:web_submit_data,web_submit_form
5、put
向指定资源位置上传其最新内容
6、delete
请求服务器删除request-url所标识的资源
7、trace
回显服务器收到的请求,主要用于测试或诊断
8、connect
http/1.1协议中预留给能够将连接改为管道方式的代理服务器。
注意:
1)方法名称是区分大小写的,当某个请求所针对的资源不支持对应的请求方法的时候,服务器应当返回状态码405(mothod not allowed);当服务器不认识或者不支持对应的请求方法时,应返回状态码501(not implemented)。
2)http服务器至少应该实现get和head/post方法,其他方法都是可选的,此外除上述方法,特定的http服务器支持扩展自定义的方法。
varnish只缓存get head
varnish 处理 http 请求的过程如下
- receive 状态(vcl_recv):也就是请求处理的入口状态,根据 vcl 规则判断该请求应该 pass(vcl_pass)或是 pipe(vcl_pipe),还是进入 lookup(本地查询);
- lookup 状态:进入该状态后,会在 hash 表中查找数据,若找到,则进入 hit(vcl_hit)状态,否则进入 miss(vcl_miss)状态;
- pass(vcl_pass)状态:在此状态下,会直接进入后端请求,即进入 fetch(vcl_fetch)状态;
- fetch(vcl_fetch)状态:在 fetch 状态下,对请求进行后端获取,发送请求,获得数据,并根据设置进行本地存储;
- deliver(vcl_deliver)状态:将获取到的数据发给客户端,然后完成本次请求;
注:varnish4中在vcl_fetch部分略有出入,已独立为vcl_backend_fetch和vcl_backend_response2个函数;
内置函数(也叫子例程)
- vcl_recv:用于接收和处理请求;当请求到达并成功接收后被调用,通过判断请求的数据来决定如何处理请求;
- vcl_pipe:此函数在进入pipe模式时被调用,用于将请求直接传递至后端主机,并将后端响应原样返回客户端;
- vcl_pass:此函数在进入pass模式时被调用,用于将请求直接传递至后端主机,但后端主机的响应并不缓存直接返回客户端;
- vcl_hit:在执行 lookup 指令后,在缓存中找到请求的内容后将自动调用该函数;
- vcl_miss:在执行 lookup 指令后,在缓存中没有找到请求的内容时自动调用该方法,此函数可用于判断是否需要从后端服务器获取内容;
- vcl_hash:在vcl_recv调用后为请求创建一个hash值时,调用此函数;此hash值将作为varnish中搜索缓存对象的key;
- vcl_purge:pruge操作执行后调用此函数,可用于构建一个响应;
- vcl_deliver:将在缓存中找到请求的内容发送给客户端前调用此方法;
- vcl_backend_fetch:向后端主机发送请求前,调用此函数,可修改发往后端的请求;
- vcl_backend_response:获得后端主机的响应后,可调用此函数;
- vcl_backend_error:当从后端主机获取源文件失败时,调用此函数;
- vcl_init:vcl加载时调用此函数,经常用于初始化varnish模块(vmods)
- vcl_fini:当所有请求都离开当前vcl,且当前vcl被弃用时,调用此函数,经常用于清理varnish模块;
varnish程序的运行具有局部性特征:
时间局部性:一个数据被访问过之后,可能很快会被再次访问到;
空间局部性:一个数据被访问时,其周边的数据也有可能被访问到
cache:命中
热区:局部性;
时效性:
缓存空间耗尽:lru,最近最少使用;
过期:缓存清理
缓存命中率:hit/(hit+miss)
(0,1)
页面命中率:基于页面数量进行衡量
字节命中率:基于页面的体积进行衡量
缓存与否:
私有数据:private,private cache;
公共数据:public, public or private cache;
cache-related headers fields
the most important caching header fields are:
expires:过期时间;
expires:thu, 22 oct 2026 06:34:30 gmt
cache-control:max-age=
etag
if-none-match
last-modified
if-modified-since
vary
age
缓存有效性判断机制:
过期时间:expires
http/1.0
expires:过期
http/1.1
cache-control: maxage=
cache-control: s-maxage=
条件式请求:
last-modified/if-modified-since:基于文件的修改时间戳来判别;
etag/if-none-match:基于文件的校验码来判别;
1 expires:thu, 13 aug 2026 02:05:12 gmt 2 3 cache-control:max-age=315360000 4 5 etag:"1ec5-502264e2ae4c0" 6 7 last-modified:wed, 03 sep 2014 10:00:27 gmt 8
缓存层级:
私有缓存:用户代理附带的本地缓存机制;
公共缓存:反向代理服务器的缓存功能;
user-agent <--> private cache <--> public cache <--> public cache 2 <--> original server
cache-control: key=value, key=value
请求报文用于通知缓存服务如何使用缓存响应请求:
1 cache-request-directive = 2 3 "no-cache", //不能直接用缓存响应 4 5 | "no-store" //不能直接用缓存响应,要去远程服务器去取新的。 6 7 | "max-age" "=" delta-seconds 8 9 | "max-stale" [ "=" delta-seconds ] //过期的缓存,最大允许过期多长时间的缓存来响应 10 11 | "min-fresh" "=" delta-seconds //指示客户机可以接收响应时间小于当前时间加上指定时间的min-fresh。 12 13 | "no-transform" 14 15 | "only-if-cached" 16 17 | cache-extension 18
响应报文用于通知缓存服务器如何存储上级服务器响应的内容:
1 cache-response-directive = 2 3 "public" 4 5 | "private" [ "=" <"> 1#field-name <"> ] 6 7 | "no-cache" [ "=" <"> 1#field-name <"> ],//可缓存,但响应给客户端之前需要revalidation,即必须发出条件式请求进行缓存有效性验正; 8 9 | "no-store" ,//不允许存储响应内容于缓存中; 10 11 | "no-transform" 12 13 | "must-revalidate" 14 15 | "proxy-revalidate" 16 17 | "max-age" "=" delta-seconds //私有缓存能缓存多长时间 18 19 | "s-maxage" "=" delta-seconds //公共缓存能缓存多长时间 20 21 | cache-extension 22
下一篇: 视频营销推广的方案(附:视频营销软件)