Varnish可以有效降低web服务器的负载,提升访问速度。根据官方的说法,Varnish是一个cache型的HTTP反向代理。 按照HTTP协议的处理过程,web服务器接受请求并且返回处理结果,理想情况下服务器要在不做额外处理的情况下,立即返回结果,但实际情况并非如此。 web服务器的实现千差万别,但典型的处理过程是相同的,都要经过一系列的步骤来处理接收到的每个请求。有可能需要启动一个进程来处理请求,有可能需要从磁盘上载入文件,或者启动内部线程来编译执行一些脚本。在执行脚本的过程中,还会有进行很多别的动作,比如进行数据库查询,读取文件等等。当成百上千个请求并发访问时,服务器的负载会很快上升,出现系统资源不够的情况。一种更糟的情况是,很多请求是重复的,但web服务器无法记住曾经作出的响应,还会重复上面复杂的处理过程。 当把Varnish部署上之后,web请求的处理过程会有一些变化。客户端的请求将首先被Varnish接受。Varnish将分析接收的请求,并将其转发到后端的web服务器上。后端的web服务器对请求进行常规的处理,并将依次将处理结果返回给Varnish。 但Varnish的功能并非仅限于此。Varnish的核心功能是能将后端web服务器返回的结果缓存起来,如果发现后续有相同的请求,Varnish将不会将这个请求转发到web服务器,而是返回缓存中的结果。这将有效的降低web服务器的负载,提升响应速度,并且每秒可以响应更多的请求。Varnish速度很快的另一个主要原因是其缓存全部都是放在内存里的,这比放在磁盘上要快的多。诸如此类的优化措施使得Varnish的相应速度超乎想象。但考虑到实际的系统中内存一般是有限的,所以需要手工配置一下缓存的空间限额,同时避免缓存重复的内容。 很多门户网站已经部署了varnish,并且反应都很好,甚至反应比squid还稳定,且效率更高,资源占用更少。相信在反向代理、web加速方面,varnish已经有足够能力代替squid

Varnish与squid的对比 Squid是一个高性能的代理缓存服务器,它和varnish之间有诸多的异同点,如下: 相同点: 1. 都是一个反向代理服务器 2. 都是开源软件 不同点,也是varnish的优点: 1. Varnish的稳定性很高,两者在完成相同负荷的工作时,squid服务器发生故障的机率要高于varnish,因为使用 squid要经常重启。 2. Varnish的访问速度更快,varnish采用了”visual page cache”技术,所有缓存数据都是从内存读取,而squid是从硬盘读取,因而vainish在访问时速度方面会更快。 3. Varnish可以支持更多的并发连接,因为varnish的TCP连接释放要比squid快。因而在高并发连接情况下可以支持更多的TCP连接。 4. Varnis可以通过端口,使用正则表达式批量删除部分缓存,而squid是做不到的。 5. Squid属于单进程使用单核cpu,但varnish是通过fork形式打开多进程来做处理,所以是合理的使用所有核来处理相应的请求。 当然,与传统的squid相比,varnish也是有缺点的,如下: 1. Varnish进程一旦挂起、崩溃或者重启,缓存数据库都会从内存中完全释放,此时所有的请求都会发送到后端服务器,在高并发情况下,会给后端服务器造成很大压力。 2. 在varnish使用中如果单个url的请求通过HA/F5(负载均衡)每次请求不同的varnish服务器中,被请求的服务器都会被穿透到后端,而且同样的请求会在多台服务器上缓存,也会造成varnish的缓存的资源浪费,也会造成资源浪费。 varnish官方网站:https://www.varnish-cache.org/ Varnish下载地址:https://www.varnish-cache.org/releases

下面搭建varnish 一、 安装依赖包,解决依赖关系 [root@iZ2ze4si6e76x4rgeg5gwoZ ~]#Yum -y install autoconf automake jemalloc-devel libedit-devel libtool ncurses-devel pcre-devel pkgconfig python-docutils python-sphinx 二、 去官网下载安装包(varnish官网:http://varnish-cache.org/) 三、 上传解压安装包 [root@iZ2ze4si6e76x4rgeg5gwoZ~]#tar -zxf varnish-4.0.5.tgz [root@iZ2ze4si6e76x4rgeg5gwoZ~]cd varnish-4.0.5 四、 编译安装 [root@iZ2ze4si6e76x4rgeg5gwoZ~]#./configure --prefix=/usr/local/varnish [root@iZ2ze4si6e76x4rgeg5gwoZ ~]#make && make install 五、 进入到varnish目录下创建varnish服务配置文件目录etc [root@iZ2ze4si6e76x4rgeg5gwoZ ~]#cd /usr/local/varnish/ [root@iZ2ze4si6e76x4rgeg5gwoZ v/etcarnish]# ll [root@iZ2ze4si6e76x4rgeg5gwoZ varnish]#mkdir etc 六、 拷贝varnish的配置文件模型到etc下并改名为default.vcl [root@iZ2ze4si6e76x4rgeg5gwoZ~]#cp share/doc/varnish/example.vcl etc/default.vcl 七、 配置文件做个软连接到/etc下面方便修改查看 [root@iZ2ze4si6e76x4rgeg5gwoZ~]#ln -s /usr/local/varnish/etc/default.vcl /etc/ [root@iZ2ze4si6e76x4rgeg5gwoZ ~]#ll /etc/default.vcl

八、 修改配置文件 [root@iZ2ze4si6e76x4rgeg5gwoZ ~]#Vim /etc/default.vcl 配置一个后端服务器 改: backend default { .host = "127.0.0.1"; .port = "80"; } 为: backend web1 { .host = "web1ip"; .port = "服务端口"; } 查看缓存命中情况 在: sub vcl_deliver {

return (deliver);

} 追加: sub vcl_deliver { if (obj.hits > 0) { set resp.http.X-Cache = "HIT from aaa cache"; } else { set resp.http.X-Cache = "MISS from aaa cache"; } return (deliver); }

保存退出 九、 启动varnish服务 [root@iZ2ze4si6e76x4rgeg5gwoZ~]#/usr/local/varnish/sbin/varnishd -f /etc/default.vcl -s malloc,100M -T 127.0.0.1:2000 -a 0.0.0.0:80 启动参数介绍: -f /etc/default.vcl -f 指定varnish使用哪个配置文件 -s malloc,100M -s 用来确定varnish使用的存储类型和存储容量,我使用的是malloc类型(malloc是一个C函数,用于分配内存空间),1G定义多少内存被malloecd -T 127.0.0.1:2000 Varnish有一个基于文本的管理接口,启动他的话可以在不停止 vainish的情况下来管理varnish,可以指定管理软件监听哪个接口,如果系统里有不完全信任的用户,可以通过防火墙规则来限制他的访问vainish的管理端口。 -a 0.0.0.0:80 这一句话的意思制定varnish监听所有IP发给80端口的http请求。

测试varnish 在web1上安装httpd并编写测试页面 [root@iZuf6863bn6nxym2pl0y07Z ~]#yum -y install httpd [root@iZuf6863bn6nxym2pl0y07Z ~]#echo aaa >/var/www/html/index.html [root@iZuf6863bn6nxym2pl0y07Z ~]#systemctl restart httpd

测试源站点: 在浏览器中访问Varnish的 ip 测试加速: 在浏览器中访问web的ip 测试缓存命中 [root@iZ2ze4si6e76x4rgeg5gwoZ ~]#Curl – ip(web) HTTP/1.1 200 OK Date: Mon, 27 May 2019 03:11:29 GMT Server: Apache/2.4.6 (CentOS) Last-Modified: Fri, 24 May 2019 08:21:56 GMT ETag: "13-5899de444f940" Content-Length: 19 Content-Type: text/html; charset=UTF-8 X-Varnish: 32932 Age: 0 Via: 1.1 varnish-v4 X-Cache: MISS from aaa cache Connection: keep-alive

X-Cache: MISS from aaa cache #未命中 X-Cache: HIT from aaa cache #命中