Varnish 是一款高性能的开源 HTTP 加速器,可以有效降低 web 服务器的负载,提升访问速度。根据官方的说法,Varnish 是一个 cache 型的 HTTP 反向代理。
Varnish 的作者Poul-Henning Kamp是FreeBSD的内核开发者之一,他认为现在的计算机比起1975年已经复杂许多。在 1975 年时,存储媒介只有两种:内存与硬盘。但现在计算机系统的内存除了主存外,还包括了 cpu 内的 L1、L2,甚至有 L3 快取。硬盘上也有自己的快取装置,因此 squid cache 自行处理物件的架构不可能得知这些情况而做到最佳化,但操作系统可以得知这些情况,所以这部分的工作交给操作系统处理,这就是 Varnish cache 设计架构。
当把 Varnish 的功能并非仅限于此。 Varnish 的核心功能是将后端 web 服务器返回的结果缓存起来,如果发现后续有相同的请求,Varnish 将不会将这个请求转发到 web 服务器,而是返回缓存中的结果。 这将有效的降低 web 服务器的负载,提升响应速度,并且每秒可以响应更多的请求。Varnish 速度很快的另一个主要原因是 其缓存全部都是放在内存里的,这比放在磁盘上要快的多。诸如此类的优化措施使得 Varnish 的响应速度超乎想象。但考虑到实际的系统中内存一般是有限的,所以需要手工配置一下缓存的空间限额,同时避免缓存重复的内容。
处理缓存的顺序:接受到请求 — 分析请求(分析你的URL,分析你的首部) — 哈希计算 — 查找缓存 — 新鲜度检测 — 访问源 — 缓存 — 建立响应报文 — 响应并记录日志。
监听端口 6081,管理进程 management,子进程 child/cache,官网 https://www.varnish-cache.org/。
Varnish 特点:
Varnish 与 Squid 的对比:
相同点:
Varnish 相较于 Squid 的优点:
Varnish 相较于 Squid 的缺点:
youxi1 192.168.1.6 源码包安装
youxi2 192.168.1.7 yum安装实例、Web后端
youxi3 192.168.1.8 Web后端
youxi1 上源码安装 varnish
//安装依赖包
[root@youxi1 ~]# yum -y install make autoconf automake libedit-devel libtool ncurses-devel pcre-devel pkgconfig python3-docutils python3-sphinx graphviz
[root@youxi1 ~]# tar xf varnish-6.2.0.tgz -C /usr/local/src/
[root@youxi1 ~]# cd /usr/local/src/varnish-6.2.0/
[root@youxi1 varnish-6.2.0]# ./configure --prefix=/usr/local/varnish
[root@youxi1 varnish-6.2.0]# make && make install
[root@youxi1 varnish-6.2.0]# echo $?
0
[root@youxi1 varnish-6.2.0]# cd /usr/local/varnish/
[root@youxi1 varnish]# mkdir etc
[root@youxi1 varnish]# cp share/doc/varnish/example.vcl etc/default.vcl //生成vcl配置文件
youxi2 上 yum 安装 varnish
[root@youxi2 ~]# 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
[root@youxi2 ~]# yum clean all && yum list //清除yum缓存,并重新生成
[root@youxi2 ~]# yum -y install varnish
配置youxi1上的Varnish缓存youxi2上的网站
youxi1 修改 vcl 配置文件
[root@youxi1 ~]# vim /usr/local/varnish/etc/default.vcl
backend default { //第16~19行
.host = "192.168.1.7"; //修改Web后端网站的IP地址
.port = "80"; //修改Web后端网站的端口号
}
sub vcl_deliver { //第35行开始,缓存命中情况
if (obj.hits > 0) {
set resp.http.X-Cache = "HIT cache";
}
else {
set resp.http.X-Cache = "Miss cache";
}
}
配置环境变量
[root@youxi1 ~]# vim /etc/profile.d/varnish.sh
export PATH=/usr/local/varnish/bin:/usr/local/varnish/sbin:$PATH
[root@youxi1 ~]# . /etc/profile.d/varnish.sh //加载环境变量
启动 Varnish
[root@youxi1 ~]# varnishd -a 192.168.1.6:80,HTTP -f /usr/local/varnish/etc/default.vcl
Debug: Version: varnish-6.2.0 revision b14a3d38dbe918ad50d3838b11aa596f42179b54
Debug: Platform: Linux,3.10.0-957.el7.x86_64,x86_64,-jnone,-sdefault,-sdefault,-hcritbit
Debug: Child (18374) Started
[root@youxi1 ~]# ps aux | grep varnishd
root 18364 0.0 0.0 22188 1532 ? SLs 22:59 0:00 varnishd -a 192.168.1.6:80,HTTP -f /usr/local/varnish/etc/default.vcl
root 18374 1.8 4.4 1029912 89468 ? SLl 22:59 0:00 varnishd -a 192.168.1.6:80,HTTP -f /usr/local/varnish/etc/default.vcl
root 18593 0.0 0.0 112724 992 pts/0 S+ 23:00 0:00 grep --color=auto varnishd
[root@youxi1 ~]# firewall-cmd --permanent --zone=public --add-port=80/tcp && firewall-cmd --reload
success
success
youxi2 上搭建测试 Web 后端
[root@youxi2 ~]# yum -y install httpd
[root@youxi2 ~]# echo youxi2 > /var/www/html/index.html
[root@youxi2 ~]# systemctl start httpd
[root@youxi2 ~]# firewall-cmd --permanent --zone=public --add-port=80/tcp && firewall-cmd --reload
success
success
最后测试
然后使用 curl 命令做缓存命中测试, -I 选项只取 响应头信息,不取网页内容
[root@youxi1 ~]# curl -I 192.168.1.7 //这是直接访问youxi2
HTTP/1.1 200 OK
Date: Sun, 04 Aug 2019 15:14:16 GMT
Server: Apache/2.4.6 (CentOS)
Last-Modified: Sun, 04 Aug 2019 14:56:47 GMT
ETag: "7-58f4bccfca680"
Accept-Ranges: bytes
Content-Length: 7
Content-Type: text/html; charset=UTF-8
[root@youxi1 ~]# curl -I 192.168.1.6 //第一次访问youxi1
HTTP/1.1 200 OK
Date: Sun, 04 Aug 2019 15:14:19 GMT
Server: Apache/2.4.6 (CentOS)
Last-Modified: Sun, 04 Aug 2019 14:56:47 GMT
ETag: "7-58f4bccfca680"
Content-Length: 7
Content-Type: text/html; charset=UTF-8
X-Varnish: 12
Age: 0
Via: 1.1 varnish (Varnish/6.2)
X-Cache: Miss cache //这次是未命中
Accept-Ranges: bytes
Connection: keep-alive
[root@youxi1 ~]# curl -I 192.168.1.6 //第二次访问youxi1
HTTP/1.1 200 OK
Date: Sun, 04 Aug 2019 15:16:39 GMT
Server: Apache/2.4.6 (CentOS)
Last-Modified: Sun, 04 Aug 2019 14:56:47 GMT
ETag: "7-58f4bccfca680"
Content-Length: 7
Content-Type: text/html; charset=UTF-8
X-Varnish: 15 32773
Age: 2
Via: 1.1 varnish (Varnish/6.2)
X-Cache: HIT cache //这一次命中缓存了
Accept-Ranges: bytes
Connection: keep-alive
缓存时间较短,可以尝试配置 httpd 长连接功能(配置文件中设置 Keepalive On 然后重启)
配置 youxi1 上的 Varnish 缓存多个网站(youxi12,youxi3)
youxi1 修改 vcl 配置文件
[root@youxi1 ~]# vim /usr/local/varnish/etc/default.vcl
backend youxi2 { //原本的default改为主机名
.host = "192.168.1.7";
.port = "80";
}
backend youxi3 { //多创建一个
.host = "192.168.1.8";
.port = "80";
}
sub vcl_recv { //在vcl_recv里添加
if (req.http.host ~ "^(www.)?you.cn"){ //正则匹配
set req.http.host = "www.you.cn";
set req.backend_hint = youxi2; //指向youxi2后端
} elsif (req.http.host ~ "^bbs.you.cn") { //正则匹配
set req.backend_hint = youxi3; //指向youxi3后端
}
}
重启 Varnish ,需要时用 killall 命令,安装 psmisc 包
[root@youxi1 ~]# yum -y install psmisc
[root@youxi1 ~]# killall varnishd
[root@youxi1 ~]# varnishd -a 192.168.1.6:80,HTTP -f /usr/local/varnish/etc/default.vcl
Debug: Version: varnish-6.2.0 revision b14a3d38dbe918ad50d3838b11aa596f42179b54
Debug: Platform: Linux,3.10.0-957.el7.x86_64,x86_64,-jnone,-sdefault,-sdefault,-hcritbit
Debug: Child (19017) Started
youxi3 上搭建测试 Web 后端
[root@youxi3 ~]# yum -y install httpd
[root@youxi3 ~]# echo youxi3 > /var/www/html/index.html
[root@youxi3 ~]# systemctl start httpd
[root@youxi3 ~]# firewall-cmd --permanent --zone=public --add-port=80/tcp && firewall-cmd --reload
success
success
youxi1 编辑 /etc/hosts 文件
[root@youxi1 ~]# vim /etc/hosts
192.168.1.6 www.you.cn
192.168.1.6 bbs.you.cn
测试
[root@youxi1 ~]# curl www.you.cn //第一次访问,可以看到是指向的是youxi2
youxi2
[root@youxi1 ~]# curl -I www.you.cn //第二次访问,只取http响应头,可以看到击中缓存
HTTP/1.1 200 OK
Date: Sun, 04 Aug 2019 16:09:19 GMT
Server: Apache/2.4.6 (CentOS)
Last-Modified: Sun, 04 Aug 2019 14:56:47 GMT
ETag: "7-58f4bccfca680"
Content-Length: 7
Content-Type: text/html; charset=UTF-8
X-Varnish: 5 32772
Age: 12
Via: 1.1 varnish (Varnish/6.2)
X-Cache: HIT cache //击中缓存
Accept-Ranges: bytes
Connection: keep-alive
[root@youxi1 ~]# curl bbs.you.cn //第一次访问,可以看到指向的是youxi3
youxi3
[root@youxi1 ~]# curl -I bbs.you.cn //第二次访问,只取http响应头,可以看到击中缓存
HTTP/1.1 200 OK
Date: Sun, 04 Aug 2019 16:09:49 GMT
Server: Apache/2.4.6 (CentOS)
Last-Modified: Sun, 04 Aug 2019 16:07:43 GMT
ETag: "7-58f4ccaa0e583"
Content-Length: 7
Content-Type: text/html; charset=UTF-8
X-Varnish: 32774 8
Age: 6
Via: 1.1 varnish (Varnish/6.2)
X-Cache: HIT cache
Accept-Ranges: bytes
Connection: keep-alive