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为网站加速_第1张图片
Varnish下载地址:https://www.varnish-cache.org/releases
使用varnish为网站加速_第2张图片

下面搭建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 #命中