`

Varnish

    博客分类:
  • web
 
阅读更多

1简介

Varnish是一款高性能的开源HTTP加速器,挪威最大的在线报纸 Verdens Gang 使用3台Varnish代替了原来的12台Squid,性能比以前更好。[1] 
Varnish 的作者Poul-Henning Kamp是FreeBSD的内核开发者之一,他认为现在的计算机比起1975年已经复杂许多。在1975年时,储存媒介只有两种:内存与硬盘。但现在计算机系统的内存除了主存外,还包括了CPU内的L1、L2,甚至有L3快取。硬盘上也有自己的快取装置,因此Squid Cache自行处理物件替换的架构不可能得知这些情况而做到最佳化,但操作系统可以得知这些情况,所以这部份的工作应该交给操作系统处理,这就是 Varnish cache设计架构。[1] 
varnish项目是2006年发布的第一个版本0.9.距今已经八年多了,此文档之前也提过varnish还不稳 定,那是2007年时候编写的,经过varnish开发团队和网友们的辛苦耕耘,现在的varnish已经很健壮。很多门户网站已经部署了 varnish,并且反应都很好,甚至反应比squid还稳定,且效率更高,资源占用更少。相信在反向代理,web加速方面,varnish已经有足够能力代替squid。
 

2总体架构

2.1 总体流程
主进程 fork 子进程,主进程等待子进程的信号,子进程退出后,主进程重新启动子进程
子进程生成若干线程
Accept 线程:接受请求,将请求挂在 overflow队列上
Work 线程: 多个,从对列上摘除请求,对请求进行处理,直到完成,然后处理下一个
请求
Epoll 线程: 一个请求处理称作一个 session,在 session 周期内,处理完请求后,会交给
Epoll 处理,监听是否还有事件发生。
Expire 线程:对于缓存的对象,根据过期时间,组织成二叉堆,该线程周期检查该堆的
根,处理过期的文件。
线程之间的关系:
2.1.1 accept 线程
监听端口,接受连接。
接受后组织成 struct ses(session 结构) ,看是否有空闲的工作线程,如果有,将请求给它,
pthread_cond_signal 信号通知它没有空闲线程,如果 overflow过大,则放弃该请求。否则,
将其挂在 overflow 上(需要更多工作线程,发通知)。
继续监听 2.1.2 work 线程
从 overflow队列上摘取请求(struct ses),进入状态机处理,处理结束后,通过 pipe通信,
将 struct ses发送给 epoll 线程。
2.1.3 Epoll 线程,得到传过来的 struct ses,若还没有过期,将 socket 放入 epoll 的事件中,事
件发生时,也会将其放入到 overflow中进行。
 

3工作流程

Varnish与一般服务器软件类似,分为master(management)进程和child(worker,主要做cache的工作)进程。master进程读入命令,进行一些初始化,然后fork并监控child进程。child进程分配若干线程进行工作,主要包括一些管理线程和很多woker线程。
针对文件缓存部分,master读入存储配置(-s file[,path[,size[,granularity]]] ),调用合适的存储类型,然后创建/读入相应大小的缓存大文件。接着,master初始化管理该存储空间结构体。这些变量都是全局变量,在fork以后会被child进程所继承(包括文件描述符)。
在child进程主线程初始化过程中,将前面打开的存储大文件整个mmap到内存中(如果超出系统的虚拟内存,mmap失败,进程会减少原来的配置mmap大小,然后继续mmap),此时创建并初始化空闲存储结构体,挂到存储管理结构体,以待分配。
接着,真正的工作开始,Varnish的某个负责接受新HTTP连接的线程开始等待用户,如果有新的HTTP连接过 来,它总负责接收,然后叫醒某个等待中的线程,并把具体的处理过程交给它。Worker线程读入HTTP请求的URI,查找已有的object,如果命中 则直接返回并回复用户。如果没有命中,则需要将所请求的内容,从后端服务器中取过来,存到缓存中,然后再回复。
分配缓存的过程是这样的:它根据所读到object的大小,创建相应大小的缓存文件。为了读写方便,程序会把每个object的大小变为最接近其大小的内存页面倍数。然后从现有的空闲存储结构体中查找,找到最合适的大小的空闲存储块,分配给它。如果空闲块没有用完,就把多余的内存另外组成一个空闲存储块,挂到管理结构体上。如果缓存已满,就根据LRU机制,把最旧的object释放掉。
释放缓存的过程是这样的:有一个超时线程,检测缓存中所有object的生存期,如果超初设定的TTL(Time To Live)没有被访问,就删除之,并且释放相应的结构体及存储内存。注意释放时会检查该存储内存块前面或后面的空闲内存块,如果前面或后面的空闲内存和该释放内存是连续的,就将它们合并成更大一块内存。
整个文件缓存的管理,没有考虑文件与内存的关系,实际上是将所有的object都考虑是在内存中,如果系统内存不足,系统会自动将其换到swap空间,而不需要varnish程序去控制。
 

4安装配置

wget -c http://repo.varnish-cache. org/source/varnish-3.0.1.tar.gz
tar xzvf varnish-3.0.1.tar.gz
cd varnish-3.0.1
./configure --prefix=/usr/local/varnish
make
make install
groupadd varnish
useradd -d /var/lib/varnish -g varnish -s /sbin/nologin varnish
ln -s /usr/local/varnish/sbin/varnishd /usr/sbin/varnishd
启动varnish:
varnishd -f /usr/local/varnish/etc/varnish/default.vcl -s malloc,1G -g varnish -u varnish -T 127.0.0.1:2000
关闭varnish:
pkill varnish
启动参数介绍:
-f /usr/local/etc/varnish/default.vcl
这个 –f 选项指定varnishd使用哪个配置文件。
-s malloc,1G
这个 –s 选项用来确定varnish使用的存储类型和存储容量,我使用的是malloc类型(malloc是一个C函数,用于分配内存空间), 1G 定义多少内存被malloced,1G = 1gigabyte。
-T 127.0.0.1:2000
Varnish有一个基于文本的 管理接口,启动它的话可以在不停止varnish的情况下来管理varnish。您可以指定管理软件监听哪个接口。当然您不能让全世界的人都能访问您的 varnish管理接口,因为他们可以很轻松的通过访问varnish管理接口来获得您的root访问权限。我推荐只让它监听本机端口。如果您的系统里有 您不完全信任的用户,您可以通过防火墙规则来限制他访问varnish的管理端口。
-a 0.0.0.0:8080
这一句的意思是制定varnish监听所有IP发给8080端口的http请求,如果在生产环境下,您应该让varnish监听80,这也是默认的。
vcl配置文件的介绍请执行如何命令查看:
man /usr/local/varnish/share/man/man7/vcl.7
 

5版本发布

2011年08月24日,Varnish 3.0.1 RC1 发布,HTTP加速器。[2] 
2011年08月30日,Varnish 3.0.1 正式版发布了,与 3.0 版本比较,改进包括:
对象以优雅和保持设置被错误地视为候选的短暂存储,但不会迅速清理,这表现为如果有一个内存泄漏。现在这是固定的。
当多个客户正在等待一个对象,所有客户端会醒来当一个物体变得可用,从而导致卡线程。这已经被修正
一个bug在XML实体是如何处理应急服务国际公司已经固定
文档目睹了大量的更新
varnishncsa现在更加稳定和支持显示任意请求和响应字段。[3] 
2011年10月26日,Varnish Cache 3.0.2 发布。[4] 
2012年08月20日,Varnish Cache 3.0.3 发布。
2013年06月17日,Varnish Cache 3.0.4 发布,为目前最新版本。
分享到:
评论

相关推荐

    squid、varnish、ngx_cache的性能测试对比报告

    本报告对比了Squid、Varnish和Ngx_cache三款缓存软件的性能。首先,从测试环境来看,本次测试所使用的Squid、Ngx_cache(也就是Varnish)、Nginx_cache均运行在具有单硬盘资源的服务器上,并为缓存分配了180G的存储...

    varnish-6.2.0.tgz

    例如,挪威最大的在线报纸 Verdens Gang 就通过使用Varnish减少了服务器数量,但提升了整体性能,这表明Varnish在处理高流量网站时具有显著优势。 在压缩包文件"varnish-6.2.0"中,可能包含了Varnish的源代码、编译...

    linux-varnish配置

    Linux Varnish 配置详解 Varnish 是一款高性能的开源HTTP缓存和代理服务器,主要用于提升网站的响应速度和处理能力。它通过缓存静态内容和动态内容的副本,减少对后端服务器的请求,从而提高了整体的Web性能。在...

    varnish+lighttpd配置

    Varnish和Lighttpd是两个非常重要的开源Web服务器软件,它们在Web性能优化和负载均衡方面发挥着关键作用。Varnish作为一个高性能的HTTP缓存代理,常用于减轻后端服务器的压力,提高网站响应速度;而Lighttpd则是一款...

    Varnish权威指南(中文)

    《Varnish权威指南》是一本深度探讨Varnish缓存服务器技术的专业书籍,中文版的出版使得更多国内用户能够无障碍地学习和掌握这一高效的内容分发和加速工具。Varnish作为一个开源的HTTP加速器,它在Web性能优化领域...

    Varnish 应用技术指南 V3.0 中文版

    在“Varnish应用技术指南 V3.0 中文版”中,你将深入了解到如何利用Varnish来提升你的在线业务效率。 1. Varnish基础:Varnish是基于内存的缓存系统,它可以快速地存储和检索HTTP对象(如HTML页面、图片、CSS和...

    Varnish权威指南(中文版).pdf

    但是,根据“【标题】”和“【描述】”中提供的信息,我们可以知道这是一本名为《Varnish权威指南(中文版)》的电子书,这本书是关于Varnish的,Varnish是一个高性能的开源Web应用加速器(也叫做HTTP反向代理服务器...

    varnish-5.2.1.tar.gz

    在互联网行业中,Varnish被广泛应用于高流量网站,以减轻后端服务器的压力,通过缓存静态和动态内容来降低延迟。 标题中的"varnish-5.2.1.tar.gz"表明这是一个Varnish软件的源代码包,版本号为5.2.1,采用tar.gz...

    varnish-4.0.3.tar.gz

    在标题中提到的"varnish-4.0.3.tar.gz"是一个源代码压缩包,其中包含了Varnish 4.0.3版本的所有源代码和其他相关文件,用户可以下载并编译来在自己的服务器上安装和运行Varnish。 Varnish的核心功能在于其高速的...

    varnish-3.0.7.tgz 源码安装包

    这个“varnish-3.0.7.tgz”源码安装包是Varnish软件版本3.0.7的源代码,适用于需要自定义编译和配置的环境。下面将详细介绍Varnish的原理、功能以及如何安装和使用3.0.7版本。 **Varnish基础概念** Varnish是一个...

    varnish.tar.bz2

    本资源包含Varnish的安装文件varnish-3.0.5-1.el6.x86_64.rpm 和varnish-libs-3.0.5-1.el6.x86_64.rpm,是搭建cdn的高性能HTTP加速器Varnish服务器必需的安装包,下载后解压即可,具体安装配置过程清移步我的博客

    Getting Started with Varnish Cache: Accelerate Your Web Applications

    Getting Started with Varnish Cache: Accelerate Your Web Applications by Thijs Feryn English | 13 Mar. 2017 | ASIN: B06XP3D6Z2 | 253 Pages | AZW3 | 720.91 KB How long does it take for your website to ...

    varnish-3.0.2.tar.gz

    在本文中,我们将深入探讨Varnish 3.0.2这个特定版本的特性和使用方法。 首先,Varnish 3.0.2是Varnish Cache项目的一个稳定版本,发布于2011年。它基于VCL(Varnish Configuration Language),这是一种强大的、...

    Varnish网站加速缓存代理

    在反向代理,web加速方面,varnish已经有足够能力代替squid。挪威最大的在线报纸 Verdens Gang 使用3台Varnish代替了原来的12台Squid,性能比以前更好。 2.作者:Poul-Henning Kamp是FreeBSD的内核开发者之一。

Global site tag (gtag.js) - Google Analytics