Varnish(一)简介与原理
简介
Varnish是一款高性能且开源的方向代理服务器和HTTP加速器
Varnish架构
官方给出的架构图
图片来自 http://book.varnish-software.com/4.0/chapters/Tuning.html#varnish-architecture
Varnish主要运行2个进程,Management进程和Child进程
Management进程:主要实现应用新的配置、编译VCL、监控varnish、初始化varnish以及提供一个命令行接口等。Management进程会每隔几秒钟探测一下Child进程以判断其是否正常运行,如果在指定的时长内未得到Child进程的回应,Management将会重启此Child进程。
Child进程:主要是监听客户端请求,管理worker线程,建立缓存,更新统计计数器和记录流量
VCL(Varnish Configuration Language)是varnish配置缓存策略的工具,拥有它自己独立的一种编程语言。在策略启动前,会由Management进程转换为c代码(利用VCC,将VCL转换成C的编译器),然后通过gcc编译器编译成2进制程序。编译完成后Management负责将其连接到child进程,可以在varnish运行过程中动态切换缓存策略。
shared memory log(共享内存日志)为了与系统的其它部分进行交互,Child进程使用了可以通过文件系统接口进行访问的共享内存日志,因此,如果某线程需要记录信息,其仅需要持有一个锁,而后向共享内存中的某内存区域写入数据,再释放持有的锁即可。而为了减少竞争,每个worker线程都使用了日志数据缓存。
共享内存日志大小一般为90M,其分为两部分,前一部分为计数器,后半部分为客户端请求的数据。varnish提供了多个不同的工具如varnishlog、varnishncsa或varnishstat等来分析共享内存日志中的信息并能够以指定的方式进行显示。
varnishadm和vagent2是管理Management的一个管理接口
varnish处理流程
图片来自 http://book.varnish-software.com/4.0/chapters/VCL_Basics.html
- vcl_recv函数:在Varnish完成对请求报文的解码为基本数据结构后第一个要执行的子例程,它通常有四个主要用途:1.修改客户端数据以减少缓存对象差异性;比如删除URL中的www.等字符;2.基于客户端数据选用缓存策略;比如仅缓存特定的URL请求、不缓存POST请求等;3.为某web应用程序执行URL重写规则; 4.挑选合适的后端Web服务器;
- vcl_hash函数:默认VCL将主机名或IP地址以及请求的URL进行hash
- vcl_hit函数:在缓存中找到请求的内容后将自动调用该函数
- vcl_pass函数:此函数在进入pass模式时被调用,用户将请求直接传递至后端主机。后端主机在应答数据后将应答数据发送给客户端,但不进行任何缓存,在当前链接下每次都返回最新的内容。
- vcl_miss函数:在缓存中没有找到请求的内容时自动调用该方法。此函数可用于判断是否需要从后端服务器获取内容
- vcl_purge函数:移除缓存
- vcl_pipe函数:进入pipe模式时,用户将请求直接传递至后端主机,在请求和返回的内容没有改变的情况下,将不变的内容返回给客户端,直到这个链接被关闭。
- vcl_backend_fetch函数:可能是被vcl_miss或者vcl_pass调用。如果是被vcl_miss函数:调用则所获取的对象会被缓存,如果是被vcl_pass调用则获取的对象不会缓存
- vcl_deliver函数:将在缓存中找到请求的内容发送给客户端前调用此函数
- vcl_synth函数:创建合成响应,例如个性化定制错误消息,要调用此函数