一、 varnish概述
Varnish是一款高性能的开源HTTP加速器,挪威最大的在线报纸 Verdens Gang (http://www.vg.no) 使用3台Varnish代替了原来的12台squid,性能居然比以前更好。
Varnish 的作者Poul-Henning Kamp是FreeBSD的内核开发者之一,他认为现在的计算机比起1975年已经复杂许多。在1975年时,储存媒介只有两种:内存与硬盘。但现在计算 机系统的内存除了主存外,还包括了cpu内的L1、L2,甚至有L3快取。硬盘上也有自己的快取装置,因此squid cache自行处理物件替换的架构不可能得知这些情况而做到最佳化,但操作系统可以得知这些情况,所以这部份的工作应该交给操作系统处理,这就是 Varnish cache设计架构。
处理缓存的顺序: 接受到请求 –- 分析请求(分析你的URL,分析你的首部) – hash计算 – 查找缓存 – 新鲜度检测 — 访问源 — 缓存 – 建立响应报文 – 响应并记录日志
varnish监听的端口号:6081
官方网址:https://www.varnish-cache.org/
varnish下载地址:https://www.varnish-cache.org/releases
1、 varnish基础概念详解
1)比起squid更加轻量级,大致有以下几个特点:
2)可以基于内存缓存,也可以在磁盘上缓存
3)如果期望内存大小超过几十个G,比如图片服务器,纯粹使用内存,性能未必好,这时候可以使用磁盘进行缓存,或使用SSD X 2 做RAID1避免磁盘损坏,在实现随机访问上 ssd硬盘要比机械硬盘要好的多,如果必须要缓存在磁盘上还是建议使用ssd磁盘
4)可以利用虚拟内存方式,IO性能会非常好
5)支持设置0-60秒 精确缓存时间
2、 支持VCL
其配置是通过vcl编程语言来完成的。 其配置需要先转换成C代码,所以使用vcl所写的配置,要先转换成C语言代码,因此要依赖于GCC 临时的编译vcl配置的,编译完之后才能运行起来
注: Varnish Configuration Language - VCL(varnish配置语言-VCL)。
Varnish使用区域配置语言,这种语言叫做“VCL”(varnish configuration language),在执行vcl时,varnish就把VCL转换成二进制代码。
VCL文件被分为多个子程序,不同的子程序在不同的时间里执行,比如一个子程序在接到请求时执行,另一个子程序在接收到后端服务器传送的文件时执行。
3、 独特的日志存储及管理机制
日志既然保存在内存中,日志可以供多个应用程序所访问,所以一般查看命中率,当前请求有多少get post 方法等等,都需使用专用的工具才可以查看,比如 varnishlog 等命令工具用来查看日志信息
4、 支持使用varnish状态引擎
通过巧妙的状态引擎的设计完成不同的引擎对用户的请求和缓存代理机制进行处理,用配置文件为状态引擎提供状态法则,完成缓存处理、完成代理处理等等
二、 varnish缓存原理
1、 vanish缓存数据机制
2、 VCL处理流程图
处理过程大致分为如下几个步骤:
(1)Receive状态,也就是请求处理的入口状态,根据VCL规则判断该请求应该是Pass或Pipe,或者进入Lookup(本地查询)。
(2)Lookup状态,在缓存中查找用户请求的对象,如果缓存中没有其请求的对象,后续操作很可能会将其请求的对象进行缓存;进入此状态后,会在hash表中查找数据,若找到,则进入Hit状态,否则进入miss状态。
(3)Pass状态,在此状态下,会进入后端请求,即进入fetch取状态。
(4)Fetch状态,在Fetch取状态下,对请求,进行后端的获取,发送请求,获得数据,并进行本地的存储。
(5)Deliver 提供状态, 将获取到的数据发送给客户端,然后完成本次请求。
注:
pass:绕过缓存,即不从缓存中查询内容或不将内容存储至缓存中;
pipe:不对客户端进行检查或做出任何操作,而是在客户端与后端服务器之间建立专用“管道”,并直接将数据在二者之间进行传送;此时,keep-alive连接中后续传送的数据也都将通过此管道进行直接传送,并不会出现在任何日志中;
流程:
总结:用户通过varnish加速时,有4条线路可以获取数据
三、 源码编译安装varnish
1、 安装依赖包
[root@xuegod120 ~]# yum install autoconf automake libedit-devel libtool ncurses-devel pcre-devel pkgconfig python-docutils python-sphinx graphviz –y
2、 源码安装varnish
上传varnish-6.2.0包到服务器
[root@xuegod120 ~]# tar xf varnish-6.2.0.tgz
[root@xuegod120 ~]# cd varnish-6.2.0/
[root@xuegod120 varnish-6.2.0]# ./configure --prefix=/usr/local/varnish/
错误提示:安装varnish6.2.0需要python的版本大于3.4,centos7.5,自带的python版本是2.7,所以需要先升级python版本,再进行安装
下载python最新版本,这里使用python3.7.4,下载之后,上传到服务器
源码编译安装python
安装依赖包:
[root@xuegod120 ~]# tar xf Python-3.7.4.tgz
[root@xuegod120 ~]# cd Python-3.7.4/
[root@xuegod120 Python-3.7.4]# ./configure
[root@xuegod120 Python-3.7.4]# make && make install
错误提示:
zipimport.ZipImportError: can’t decompress data; zlib not available
解决方法:yum -y install zlib*
错误提示:
ModuleNotFoundError: No module named ‘_ctypes’
解决方法:yum install libffi-devel –y
查看python版本
设置python3为默认版本
[root@xuegod120 Python-3.7.4]# mv /usr/bin/python /usr/bin/python.2.7
[root@xuegod120 Python-3.7.4]# ln -s /usr/local/bin/python3 /usr/bin/python
[root@xuegod120 Python-3.7.4]# python -V
Python 3.7.4
因为yum命令默认指向是Python2,升级Python后,yum命令无法使用,错误如下:
[root@xuegod120 ~]# yum list
File “/usr/bin/yum”, line 30
except KeyboardInterrupt, e:
^
SyntaxError: invalid syntax
修改/usr/bin/yum和/usr/libexec/urlgrabber-ext-down,将 #!/usr/bin/python 改为 #!/usr/bin/python2.7保存退出即可
继续安装varnish
[root@xuegod120 varnish-6.2.0]# ./configure --prefix=/usr/local/varnish
[root@xuegod120 varnish-6.2.0]# make && make install
3、 varnish配置文件
源码安装的varnish没有配置文件,需要手动创建复制一份
[root@xuegod120 ~]# cd /usr/local/varnish/
[root@xuegod120 ~]# mkdir etc/
[root@xuegod120 varnish]# cp share/doc/varnish/example.vcl etc/default.vcl
四、 yum安装varnish
参考资料:https://packagecloud.io/varnishcache/varnish62/install#manual-rpm
使用yum安装,手动创建yum源文件之后,使用yum命令安装,可以不远提前安装varnish的依赖包,会自动解决所有需要的依赖,python版本也不用升级,可以自动解决python版本问题。
1、 添加varnish的yum源文件
[root@xuegod120 ~]# vim /etc/yum.repos.d/varnishcache_varnish62.repo
[varnishcache_varnish62]
name=varnishcache_varnish62
baseurl=https://packagecloud.io/varnishcache/varnish62/el/7/$basearch
repo_gpgcheck=1
gpgcheck=0
enabled=1
gpgkey=https://packagecloud.io/varnishcache/varnish62/gpgkey
sslverify=1
sslcacert=/etc/pki/tls/certs/ca-bundle.crt
metadata_expire=300
[varnishcache_varnish62-source]
name=varnishcache_varnish62-source
baseurl=https://packagecloud.io/varnishcache/varnish62/el/7/SRPMS
repo_gpgcheck=1
gpgcheck=0
enabled=1
gpgkey=https://packagecloud.io/varnishcache/varnish62/gpgkey
sslverify=1
sslcacert=/etc/pki/tls/certs/ca-bundle.crt
metadata_expire=300
2、 使用yum安装varnish
[root@xuegod120 ~]# yum -y install varnish
3、 查看varnish的安装目录
[root@xuegod120 ~]# rpm -ql varnish
4、 varnish的配置文件
[root@xuegod120 ~]# ll /etc/varnish/default.vcl
五、 实战:缓存一个网站
1、 环境介绍
主机名 IP地址 作用
xuegod120 192.168.1.120 varnish服务器
xuegod140 192.168.1.140 web服务器
2、 配置xuegod120成为varnish服务器
上面已经配置完毕,这里省略。两种安装方式都可行。
3、 编辑varnish的配置文件
配置一个后端web服务器
[root@xuegod120 ~]# cd /usr/local/varnish/etc/
[root@xuegod120 etc]# vim default.vcl
改:
16 backend default {
17 .host = “127.0.0.1”;
18 .port = “8080”;
19 }
为:
16 backend web1 {
17 .host = “192.168.0.140”;
18 .port = “80”;
19 }
查看缓存命中情况:
改:
35 sub vcl_deliver {
36 # Happens when we have all the pieces we need, and are about to send the
37 # response to the client.
38 #
39 # You can do accounting or modifying the final object here.
40 }
为:
35 sub vcl_deliver {
36 if (obj.hits > 0) {
37 set resp.http.X-Cache = “HIT from xuegod cache”;
38 }
39 else {
40 set resp.http.X-Cache = “Miss from xuegod cache”;
41 }
42 return (deliver);
43 }
保存退出。
4、 配置varnish环境变量
yum方式安装,需要配置
[root@xuegod120 ~]# vim /etc/profile.d/varnish.sh
export PATH=/usr/local/varnish/bin:/usr/local/varnish/sbin:$PATH
[root@xuegod120 ~]# . /etc/profile.d/varnish.sh
5、 启动varnish服务
yum方式安装,直接使用如下命令
[root@xuegod120 ~]# systemctl start varnish
[root@xuegod120 ~]# netstat -antup | grep varnish
tcp 0 0 0.0.0.0:6081 0.0.0.0:* LISTEN 16152/varnishd
源码编译启动服务的方法:
[root@xuegod120 ~]# varnishd -a 192.168.0.120:80,HTTP -f /usr/local/varnish/etc/default.vcl
Debug: Version: varnish-6.0.3 revision 7d1ded3aa033a018317dbafc61587026ea2ef8a3
Debug: Platform: Linux,3.10.0-862.el7.x86_64,x86_64,-jnone,-sdefault,-sdefault,-hcritbit
Debug: Child (15386) Started
[root@xuegod120 ~]# netstat -antup | grep varnishd
tcp 0 0 127.0.0.1:44742 0.0.0.0:* LISTEN 15376/varnishd
tcp 0 0 192.168.0.120:80 0.0.0.0:* LISTEN 15376/varnishd
tcp6 0 0 ::1:41529 ::? LISTEN 15376/varnishd
注意:yum安装varnish默认使用6081端口,源码编译启动后的端口指定为80
6、 配置xuegod140为web服务器
[root@xuegod140 ~]# yum -y install httpd
[root@xuegod140 ~]# echo xuegod140.com > /var/www/html/index.html
[root@xuegod140 ~]# systemctl start httpd
7、 访问测试
测试源web站点:
测试加速站点:
8、 测试缓存命中
扩展:curl命令
curl是通过url语法在命令行下上传或下载文件的工具软件,它支持http,https,ftp,ftps,telnet等多种协议,常被用来抓取网页和监控Web服务器状态。
参数:
-I只取http响应头的信息,不取网页内容
例1:查看xuegod140web站点的服务器类型
[root@xuegod150 ~]# curl -I 192.168.0.140
HTTP/1.1 200 OK
Date: Thu, 01 Aug 2019 07:49:24 GMT
Server: Apache/2.4.6 (CentOS)
Last-Modified: Thu, 01 Aug 2019 07:46:18 GMT
ETag: “e-58f096fe53c29”
Accept-Ranges: bytes
Content-Length: 14
Content-Type: text/html; charset=UTF-8
例2:查看加速缓存命中
[root@xuegod150 ~]# curl -I 192.168.0.120
HTTP/1.1 200 OK
Date: Thu, 01 Aug 2019 07:47:59 GMT
Server: Apache/2.4.6 (CentOS)
Last-Modified: Thu, 01 Aug 2019 07:46:18 GMT
ETag: “e-58f096fe53c29”
Content-Length: 14
Content-Type: text/html; charset=UTF-8
X-Varnish: 10 7
Age: 52
Via: 1.1 varnish (Varnish/6.0)
X-Cache: HIT from xuegod cache #命中,因为之前用浏览器访问过
Accept-Ranges: bytes
Connection: keep-alive #长链接
未命中如下提示:
X-Cache: MISS from linuxidc cache
9、 开启apache长链接功能
[root@xuegod140 ~]# vim /etc/httpd/conf/httpd.conf
改: 76 KeepAlive Off
为: KeepAlive On
注意:如果 httpd.conf文件中没有KeepAlive Off,则需要手动添加。
[root@xuegod120 ~]# service httpd restart
10、 再次测试
[root@xuegod150 ~]# curl -I 192.168.0.120
HTTP/1.1 200 OK
Date: Thu, 01 Aug 2019 07:54:53 GMT
Server: Apache/2.4.6 (CentOS)
Last-Modified: Thu, 01 Aug 2019 07:46:18 GMT
ETag: “e-58f096fe53c29”
Content-Length: 14
Content-Type: text/html; charset=UTF-8
X-Varnish: 65538
Age: 0
Via: 1.1 varnish (Varnish/6.0)
X-Cache: Miss from xuegod cache #未命中
Accept-Ranges: bytes
Connection: keep-alive
再次测试
[root@xuegod150 ~]# curl -I 192.168.0.120
HTTP/1.1 200 OK
Date: Thu, 01 Aug 2019 07:54:53 GMT
Server: Apache/2.4.6 (CentOS)
Last-Modified: Thu, 01 Aug 2019 07:46:18 GMT
ETag: “e-58f096fe53c29”
Content-Length: 14
Content-Type: text/html; charset=UTF-8
X-Varnish: 65541 65539
Age: 19
Via: 1.1 varnish (Varnish/6.0)
X-Cache: HIT from xuegod cache #命中
Accept-Ranges: bytes
Connection: keep-alive
注:默认apache是没有开启长链接功能的,一段时间后,就会自动关闭
11、 修改yum方式安装varnish端口
[root@xuegod120 ~]# vim /usr/lib/systemd/system/varnish.service
修改里面的6081端口为80,重启varnish即可
[root@xuegod120 ~]# systemctl stop varnish
[root@xuegod120 ~]# systemctl start varnish
[root@xuegod120 ~]# !net
netstat -antup | grep varnish
tcp 0 0 127.0.0.1:35360 0.0.0.0:* LISTEN 16604/varnishd
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 16604/varnishd
tcp6 0 0 ::1:35870 ::? LISTEN 16604/varnishd
tcp6 0 0 :::80 ::? LISTEN 16604/varnishd
12、 varnish的其它用法
例1:清空页面缓存
[root@xuegod120 ~]# varnishadm -S /etc/varnish/secret -T 192.168.1.63:80 ‘ban req.url ~ /index.html’ #清除index.html页面缓存。
例2:清空目录缓存
[root@xuegod120 ~]# varnishadm -S /etc/varnish/secret -T 192.168.1.63:80 ‘ban req.url ~ /index/’ #也可以清除目录。
六、 实战:使用varnish缓存多个网站
1、 配置xuegod150为web服务器
[root@xuegod150 ~]# yum -y install httpd
[root@xuegod150 ~]# echo xuegod150.com > /var/www/html/index.html
[root@xuegod150 ~]# systemctl start httpd
2、 配置varnish服务器
改:
16 backend web1 {
17 .host = “192.168.1.64”;
18 .port = “80”;
19 }
为:
backend web1 {
.host = “192.168.0.140”;
.port = “80”;
}
backend web1 {
.host = “192.168.0.150”;
.port = “80”;
}
#当访问www.xuegod.cn域名时从web1上取数据,访问bbs.xuegod.cn域名时到web2取数据,访问其他页面报错。
[root@xuegod120 ~]# vim /etc/varnish/default.vcl #在之前的sub vcl_deliver { 。。。 } 之前,插入以下内容:
38 sub vcl_recv {
39 if (req.http.host ~ “^(www.)?xuegod.cn”){
40 set req.http.host = “www.xuegod.cn”;
41 set req.backend_hint = web1;
42 } elsif (req.http.host ~ “^bbs.xuegod.cn”) {
43 set req.backend_hint = web2;
44 }
45 }
3、 重启加载varnish的配置文件
[root@xuegod120 ~]# killall varnishd
[root@xuegod120 ~]# varnishd -a 192.168.0.120:80,HTTP -f /usr/local/varnish/etc/default.vcl
Debug: Version: varnish-6.0.3 revision 7d1ded3aa033a018317dbafc61587026ea2ef8a3
Debug: Platform: Linux,3.10.0-862.el7.x86_64,x86_64,-jnone,-sdefault,-sdefault,-hcritbit
Debug: Child (16250) Started
4、 访问测试
添加本地hosts文件
[root@xuegod150 ~]# vim /etc/hosts
192.168.0.150 xuegod150.com
192.168.0.120 www.xuegod.cn
192.168.0.120 bbs.xuegod.cn
[root@xuegod150 ~]# yum -y install elinks
例1:访问www.xuegod.cn和bbs.xuegod.cn
[root@xuegod150 ~]# elinks www.xuegod.cn --dump
xuegod140.com
[root@xuegod150 ~]# elinks bbs.xuegod.cn --dump
xuegod150.com
例2:查看命中
[root@xuegod150 ~]# curl -I www.xuegod.cn
HTTP/1.1 200 OK
Date: Thu, 01 Aug 2019 08:16:13 GMT
Server: Apache/2.4.6 (CentOS)
Last-Modified: Thu, 01 Aug 2019 07:46:18 GMT
ETag: “e-58f096fe53c29”
Content-Length: 14
Content-Type: text/html; charset=UTF-8
X-Varnish: 5 3
Age: 24
Via: 1.1 varnish (Varnish/6.0)
X-Cache: HIT from xuegod cache
Accept-Ranges: bytes
Connection: keep-alive
[root@xuegod150 ~]# curl -I bbs.xuegod.cn
HTTP/1.1 200 OK
Date: Thu, 01 Aug 2019 08:16:19 GMT
Server: Apache/2.4.6 (CentOS)
Last-Modified: Thu, 01 Aug 2019 08:04:15 GMT
ETag: “e-58f09b0150b2b”
Content-Length: 14
Content-Type: text/html; charset=UTF-8
X-Varnish: 32773 32771
Age: 29
Via: 1.1 varnish (Varnish/6.0)
X-Cache: HIT from xuegod cache
Accept-Ranges: bytes
Connection: keep-alive