使用Varnish为网站加速

(1).Varnish概述

Varnish是一款高性能的开源HTTP加速器,可以有效降低web服务器的负载,提升访问速度。根据官方的说法,Varnish是一个cache型的HTTP反向代理。

Varnish的作者Poul-Henning Kamp是FreeBSD的内核开发者之一,他认为现在的计算机比起1975年已经复杂许多。在1975年时,储存媒介只有两种:内存与硬盘。但现在计算 机系统的内存除了主存外,还包括了cpu内的L1、L2,甚至有L3快取。硬盘上也有自己的快取装置,因此squid cache自行处理物件替换的架构不可能得知这些情况而做到最佳化,但操作系统可以得知这些情况,所以这部份的工作应该交给操作系统处理,这就是Varnish cache设计架构。

当把Varnish部署上之后,web请求的处理过程会有一些变化。客户端的请求将首先被Varnish接受。Varnish将分析接收的请求,并将其转发到后端的web服务器上。后端的web服务器对请求进行常规的处理,并将依次将处理结果返回给Varnish。

但Varnish的功能并非仅限于此。Varnish的核心功能是将后端web服务器返回的结果缓存起来,如果发现后续有相同的请求,Varnish将不会将这个请求转发到web服务器,而是返回缓存中的结果。这将有效的降低web服务器的负载,提升响应速度,并且每秒可以响应更多的请求。Varnish速度很快的另一个主要原因是其缓存全部都是放在内存里的,这比放在磁盘上要快的多。诸如此类的优化措施使得Varnish的相应速度超乎想象。但考虑到实际的系统中内存一般是有限的,所以需要手工配置一下缓存的空间限额,同时避免缓存重复的内容。

处理缓存的顺序:接受到请求 –- 分析请求(分析你的URL,分析你的首部) — hash计算 — 查找缓存 — 新鲜度检测 — 访问源 — 缓存 – 建立响应报文 – 响应并记录日志。

监听端口6081,管理进程management,子进程child/cache,官网https://www.varnish-cache.org/

(2).Varnish特点与Squid的对比

Varnish特点:

基于内存缓存,重启后数据将消失。
利用虚拟内存方式,I/O性能好。
支持设置0~60秒内的精确缓存时间。
VCL(全称varnish config language,这是Varnish自己领域的特定语言)配置管理比较灵活。
32位机器上缓存文件大小为最大2G。
具有强大的管理功能,例如top,stat,admin,list等。
状态机设计巧妙,结构清晰。
利用二叉堆管理缓存文件,达到积极删除目的。

Varnish与Squid的对比:

相同点:

都是一个反向代理服务器;
都是开源软件;

Varnish相较于Squid的优点:

Varnish的稳定性很高,两者在完成相同负荷的工作时,Squid服务器发生故障的几率要高于Varnish,因为使用Squid要经常重启;
Varnish访问速度更快,Varnish采用了“Visual Page Cache”技术,所有缓存数据都直接从内存读取,而Squid是从硬盘读取,因此Varnish在访问速度方面会更快;
Varnish可以支持更多的并发连接,因为Varnish的TCP连接释放要比Squid快,所以在高并发连接情况下可以支持更多TCP连接;
Varnish可以通过管理端口,使用正则表达式批量的清除部分缓存,而Squid是做不到的;
Squid属于是单进程使用单核CPU,但Varnish是通过fork形式打开多进程来做处理,所以是合理的使用所有核来处理相应的请求;

Varnish相较于Squid的缺点:

Varnish在高并发状态下CPU、I/O和内存等资源开销都高于Squid;
Varnish进程一旦Hang(挂起)、Crash(崩溃)或者重启,缓存数据都会从内存中完全释放,此时所有请求都会发送到后端服务器,在高并发情况下,会给后端服务器造成很大压力;
在Varnish使用中如果单个url的请求通过HA/F5(负载均衡)每次请求不同的varnish服务器中,被请求varnish服务器都会被穿透到后端,而且同样的请求会在多台服务器上缓存,也会造成Varnish的缓存的资源浪费,也会造成性能下降。

(3).安装Varnish

1)安装环境

youxi1 192.168.1.6 源码包安装

youxi2 192.168.1.7 yum安装实例、Web后端

youxi3 192.168.1.8 Web后端

2)安装

youxi1上源码安装varnish6.2.0(建议使用该安装方式)

//安装依赖包 [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 

3)配置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 

最后测试

使用Varnish为网站加速

然后使用curl命令做缓存命中测试,-I选项只取http响应头的信息,不取网页内容

[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,然后重启

4)配置youxi1上的Varnish缓存多个网站(youxi1,youxi2)

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 

(4).扩展

1)为什么要使用缓存:

访问过的数据会再次被访问到,热数据多次访问。

一个数据被访问过会后,离他最近的或者较近的客户端再次访问。

 2)既然要缓存, 需要读取的高速,最好的方法,就是全部放到内存。

常见的内存数据库,memcached,redis,HANA。

但是对于页面,全放放到内存,太不现实,内存+高速缓存盘的方式来存储缓存。

Key-value,key存放于内存,value存放磁盘。

3)一种数据形式:key value

Key:对访问路径,URL,特定的特征,进行hash计算得出的结果,这种key存放于内存中。

Value:页体,我们用户真正得到的内容,一般存放在高速硬盘。

4)凡是与缓存缓存相关的,离不开两体:内存,高速硬盘。

5)常见的术语:

命中:能从缓存取出数据,如果是一台web站点,那么你的缓存服务器将是一台最前端服务器。

命中率:命中次数/(命中次数+非命中次数)。

热数据:经常被访问的数据。

内存缓存空间,磁盘缓存空间。

清理:定期清理,LRU(不常用的,最老的一类数据将其删除),定期更新(purge)。

缓存对象:用户信息,cookies,交易信息,页面内存,统统理解为object。

 

 

参考:https://www.oschina.net/translate/speed-your-web-site-varnish?print

http://book.51cto.com/art/201202/314855.htm

https://blog.51cto.com/tetop/823904

原文链接:https://www.cnblogs.com/diantong/p/11300705.html

原创文章,作者:优速盾-小U,如若转载,请注明出处:https://www.cdnb.net/bbs/archives/17927

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

优速盾注册领取大礼包www.cdnb.net
/sitemap.xml