Varnish是反向HTTP代理,也是HTTP加速器或者Web加速器。
Varnish不仅仅是缓存内容以加速器服务器的反向HTTP代理。根据实际情况,Varnish也可以用作:
Web应用程序防火墙
DDoS攻击防御器
负载均衡器
HTTP路由器
Varnish
的优势:
Varnish的稳定性很高,与Squid相比,在运行在相同负荷的情况下,Squid服务器发生故障的几率要高于Varnish。
Varnish的访问速度更快,因为所有缓存数据都可以直接从内存读取,也可以从硬盘读取;比Squid更为灵活、
Varnish支持更多的并发连接。只需要调整thread_pools与thread_pool_max的值即可,不过要根据实际情况的CPU核心数以及服务器要被用来做什么而定。
Varnish
的劣势:
一旦Varnish遇到Crash或者重启进程,所有的缓存数据都会从内存中完全释放,此时所有的访问都不会被缓存命中,而请求都会被发送到后端服务器,在高并发的情况下,后端服务器很可能因此崩溃掉。
解决方案:
在访问量很大的情况下,我们可以使用Varnish的内存缓存方式,而且后端要配置多台Squid服务器。防止前端Varnish服务重启、服务器重启或者不可预知的误操作情况下,大量请求穿透Varnish,这样Squid可以充当第二层缓存。
也可以通过Keepalived+varnish+rsync+inotify达到高可用的状态,这样在主节点不繁忙的时候,将缓存的信息同步到另一台备用缓存服务器上。为了尽可能的利用资源,我们可以将两台varnish配置成”双主模式”
架构图
Varnish分为 Master进程和 Child进程;也就是主控进程和子进程,概念相当于nginx中worker进程
Master进程读入配置文件,根据配置文件中指定的缓存类型,选择存储类型,然后创建缓存文件;接着master初始化管理该存储空间的结构体,然后监控 child进程
对外管理接口有三种:CLI命令行接口、Telnet接口、Web接口(商业版)
同时在运行过程中修改的配置,可以由VCL编译器编译成C语言,并组织成共享对象(Shared Object)交由Child进程加载使用
Child进程
Child进程
分配若干线程进行工作,主要包括一些管理线程和很多worker线程
|
|
HTTP请求处理基本流程
Varnish处理HTTP请求的过程如下:
Receive(vcl_recv)状态:也就是请求处理的入口状态,根据VCL规则判断该请求是应该进入
pass(vcl_pass)
或者是pipe(vcl_pipe)
或者是lookup(缓存本地查询)
,还是purge(vcl_purge)
。Lookup 状态:进入该状态后,会在hash表中查找数据。若找到,则进入
hit
(vcl_hit)状态,否则进入miss
(vcl_miss)状态。Pass(vcl_pass)状态:在此状态下,对于请求会直接发往后端主机,进入到
backend_fetch
(vcl_backend_fetch)状态。Backend_Fetch(vcl_backend_fetch)状态:在此状态下,对请求会向后端服务器进行获取,发送请求,获得数据,并根据配置文件中对此类数据的缓存设置进行缓存或者其他操作。
Deliver(vcl_deliver)状态:将获取到的数据发送给客户端,完成本次请求。
子例程(内置函数)
- vcl_recv:用于接收和处理请求;当请求到达varnish,通过判断请求的数据来决定如何处理请求
- vcl_pipe:用于将请求直接传递至后端主机,并将后端响应原封不动返回给客户端
- vcl_pass:用于将请求直接传递给后端主机,但后端主机的响应并不缓存,而是直接返回给客户端
- vcl_hit:在缓存中找到请求的内容后自动调用
- vcl_miss:在缓存中没有找到请求的内容后自动调用。用于判断是否需要从后端服务器获取内容
- vcl_hash:在vcl_recv调用后为请求创建一个hash值时,调用。此hash值将作为varnish中hash表的key
- vcl_pruge:在收到 purge请求时,执行此函数,清空特定页面/资源的缓存。
- vcl_deliver:将在缓存中找到的请求的内容发送给客户端前调用。
- vcl_backend_fetch:向后端主机发送请求前,调用。可修改发往后端的请求
- vcl_backend_response:获得后端主机的响应后,调用。
- vcl_backend_error:当从后端主机获取资源时失败时,调用。
- vcl_init:VCL加载时调用此函数,用于初始化varnish模块(类似于awk中的BEGIN)
- vcl_fini:当所有请求都离开当前VCL,且当前VCL被弃用时,调用。用于清理varnish模块(类似于awk中的END)
VCL内建变量
变量类型详解:
|
|
- bereq以及req的子变量详解:
|
|
- beresp以及resp的子变量详解:
|
|
- obj子变量:
|
|
- server子变量:
|
|
- client子变量:
|
|
varnish.params配置文件
|
|
default.vcl配置文件
|
|
使用varnishadm命令查看配置信息
|
|
配置样本
|
|
varnishstat命令
Varnish Cache statistics 查看统计数据
命令选项:
|
|
实例:
|
|
varnishtop命令
Varnish log entry ranking 日志排序
命令选项:
|
|
varnishncsa命令
以NCSA的格式输出日志
使用方法:
|
|
本文出自Maxie’s Notes博客,转载请务必保留此出处。