(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计算 -- 查找缓存 -- 新鲜度检测 --- 访问源 --- 缓存 – 建立响应报文 – 响应并记录日志。

  监听端口,管理进程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(建议使用该安装方式)

  1. //安装依赖包
  2. [root@youxi1 ~]# yum -y install make autoconf automake libedit-devel libtool ncurses-devel pcre-devel pkgconfig python3-docutils python3-sphinx graphviz
  3. [root@youxi1 ~]# tar xf varnish-6.2.0.tgz -C /usr/local/src/
  4. [root@youxi1 ~]# cd /usr/local/src/varnish-6.2.0/
  5. [root@youxi1 varnish-6.2.0]# ./configure --prefix=/usr/local/varnish
  6. [root@youxi1 varnish-6.2.0]# make && make install
  7. [root@youxi1 varnish-6.2.0]# echo $?
  8. 0
  9. [root@youxi1 varnish-6.2.0]# cd /usr/local/varnish/
  10. [root@youxi1 varnish]# mkdir etc
  11. [root@youxi1 varnish]# cp share/doc/varnish/example.vcl etc/default.vcl  //生成vcl配置文件

  youxi2上yum安装varnish(简单了解)

  1. [root@youxi2 ~]# vim /etc/yum.repos.d/varnishcache_varnish62.repo
  2. [varnishcache_varnish62]
  3. name=varnishcache_varnish62
  4. baseurl=https://packagecloud.io/varnishcache/varnish62/el/7/$basearch
  5. repo_gpgcheck=1
  6. gpgcheck=0
  7. enabled=1
  8. gpgkey=https://packagecloud.io/varnishcache/varnish62/gpgkey
  9. sslverify=1
  10. sslcacert=/etc/pki/tls/certs/ca-bundle.crt
  11. metadata_expire=300
  12.  
  13. [varnishcache_varnish62-source]
  14. name=varnishcache_varnish62-source
  15. baseurl=https://packagecloud.io/varnishcache/varnish62/el/7/SRPMS
  16. repo_gpgcheck=1
  17. gpgcheck=0
  18. enabled=1
  19. gpgkey=https://packagecloud.io/varnishcache/varnish62/gpgkey
  20. sslverify=1
  21. sslcacert=/etc/pki/tls/certs/ca-bundle.crt
  22. metadata_expire=300
  23. [root@youxi2 ~]# yum clean all && yum list  //清除yum缓存,并重新生成
  24. [root@youxi2 ~]# yum -y install varnish

3)配置youxi1上的Varnish缓存youxi2上的网站

  youxi1修改vcl配置文件

  1. [root@youxi1 ~]# vim /usr/local/varnish/etc/default.vcl
  2. backend default {  //第16~19行
  3. .host = "192.168.1.7";  //修改Web后端网站的IP地址
  4. .port = "80";  //修改Web后端网站的端口号
  5. }
  6.  
  7. sub vcl_deliver {  //第35行开始,缓存命中情况
  8. if (obj.hits > 0) {
  9. set resp.http.X-Cache = "HIT cache";
  10. }
  11. else {
  12. set resp.http.X-Cache = "Miss cache";
  13. }
  14. }

  配置环境变量

  1. [root@youxi1 ~]# vim /etc/profile.d/varnish.sh
  2. export PATH=/usr/local/varnish/bin:/usr/local/varnish/sbin:$PATH
  3. [root@youxi1 ~]# . /etc/profile.d/varnish.sh  //加载环境变量

  启动Varnish

  1. [root@youxi1 ~]# varnishd -a 192.168.1.6:80,HTTP -f /usr/local/varnish/etc/default.vcl
  2. Debug: Version: varnish-6.2.0 revision b14a3d38dbe918ad50d3838b11aa596f42179b54
  3. Debug: Platform: Linux,3.10.0-957.el7.x86_64,x86_64,-jnone,-sdefault,-sdefault,-hcritbit
  4. Debug: Child (18374) Started
  5. [root@youxi1 ~]# ps aux | grep varnishd
  6. 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
  7. 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
  8. root 18593 0.0 0.0 112724 992 pts/0 S+ 23:00 0:00 grep --color=auto varnishd
  9. [root@youxi1 ~]# firewall-cmd --permanent --zone=public --add-port=80/tcp && firewall-cmd --reload
  10. success
  11. success

  youxi2上搭建测试Web后端

  1. [root@youxi2 ~]# yum -y install httpd
  2. [root@youxi2 ~]# echo youxi2 > /var/www/html/index.html
  3. [root@youxi2 ~]# systemctl start httpd
  4. [root@youxi2 ~]# firewall-cmd --permanent --zone=public --add-port=80/tcp && firewall-cmd --reload
  5. success
  6. success

  最后测试

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

  1. [root@youxi1 ~]# curl -I 192.168.1.7  //这是直接访问youxi2
  2. HTTP/1.1 200 OK
  3. Date: Sun, 04 Aug 2019 15:14:16 GMT
  4. Server: Apache/2.4.6 (CentOS)
  5. Last-Modified: Sun, 04 Aug 2019 14:56:47 GMT
  6. ETag: "7-58f4bccfca680"
  7. Accept-Ranges: bytes
  8. Content-Length: 7
  9. Content-Type: text/html; charset=UTF-8
  10.  
  11. [root@youxi1 ~]# curl -I 192.168.1.6  //第一次访问youxi1
  12. HTTP/1.1 200 OK
  13. Date: Sun, 04 Aug 2019 15:14:19 GMT
  14. Server: Apache/2.4.6 (CentOS)
  15. Last-Modified: Sun, 04 Aug 2019 14:56:47 GMT
  16. ETag: "7-58f4bccfca680"
  17. Content-Length: 7
  18. Content-Type: text/html; charset=UTF-8
  19. X-Varnish: 12
  20. Age: 0
  21. Via: 1.1 varnish (Varnish/6.2)
  22. X-Cache: Miss cache  //这次是未命中
  23. Accept-Ranges: bytes
  24. Connection: keep-alive
  25.  
  26. [root@youxi1 ~]# curl -I 192.168.1.6  //第二次访问youxi1
  27. HTTP/1.1 200 OK
  28. Date: Sun, 04 Aug 2019 15:16:39 GMT
  29. Server: Apache/2.4.6 (CentOS)
  30. Last-Modified: Sun, 04 Aug 2019 14:56:47 GMT
  31. ETag: "7-58f4bccfca680"
  32. Content-Length: 7
  33. Content-Type: text/html; charset=UTF-8
  34. X-Varnish: 15 32773
  35. Age: 2
  36. Via: 1.1 varnish (Varnish/6.2)
  37. X-Cache: HIT cache  //这一次命中缓存了
  38. Accept-Ranges: bytes
  39. Connection: keep-alive

  缓存时间较短,可以尝试配置httpd的长链接功能(配置文件中设置KeepAlive On,然后重启)

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

  youxi1修改vcl配置文件

  1. [root@youxi1 ~]# vim /usr/local/varnish/etc/default.vcl
  2. backend youxi2 {  //原本的default改为主机名
  3. .host = "192.168.1.7";
  4. .port = "80";
  5. }
  6. backend youxi3 {  //多创建一个
  7. .host = "192.168.1.8";
  8. .port = "80";
  9. }
  10.  
  11. sub vcl_recv {  //在vcl_recv里添加
  12. if (req.http.host ~ "^(www.)?you.cn"){  //正则匹配
  13. set req.http.host = "www.you.cn";
  14. set req.backend_hint = youxi2;  //指向youxi2后端
  15. } elsif (req.http.host ~ "^bbs.you.cn") {  //正则匹配
  16. set req.backend_hint = youxi3;  //指向youxi3后端
  17. }
  18. }

  重启Varnish,需要使用killall命令,安装psmisc包

  1. [root@youxi1 ~]# yum -y install psmisc
  2. [root@youxi1 ~]# killall varnishd
  3. [root@youxi1 ~]# varnishd -a 192.168.1.6:80,HTTP -f /usr/local/varnish/etc/default.vcl
  4. Debug: Version: varnish-6.2.0 revision b14a3d38dbe918ad50d3838b11aa596f42179b54
  5. Debug: Platform: Linux,3.10.0-957.el7.x86_64,x86_64,-jnone,-sdefault,-sdefault,-hcritbit
  6. Debug: Child (19017) Started

  youxi3上搭建测试Web后端

  1. [root@youxi3 ~]# yum -y install httpd
  2. [root@youxi3 ~]# echo youxi3 > /var/www/html/index.html
  3. [root@youxi3 ~]# systemctl start httpd
  4. [root@youxi3 ~]# firewall-cmd --permanent --zone=public --add-port=80/tcp && firewall-cmd --reload
  5. success
  6. success

  youxi1上编辑/etc/hosts文件

  1. [root@youxi1 ~]# vim /etc/hosts
  2. 192.168.1.6 www.you.cn
  3. 192.168.1.6 bbs.you.cn

  测试

  1. [root@youxi1 ~]# curl www.you.cn  //第一次访问,可以看到是指向的是youxi2
  2. youxi2
  3. [root@youxi1 ~]# curl -I www.you.cn  //第二次访问,只取http响应头,可以看到击中缓存
  4. HTTP/1.1 200 OK
  5. Date: Sun, 04 Aug 2019 16:09:19 GMT
  6. Server: Apache/2.4.6 (CentOS)
  7. Last-Modified: Sun, 04 Aug 2019 14:56:47 GMT
  8. ETag: "7-58f4bccfca680"
  9. Content-Length: 7
  10. Content-Type: text/html; charset=UTF-8
  11. X-Varnish: 5 32772
  12. Age: 12
  13. Via: 1.1 varnish (Varnish/6.2)
  14. X-Cache: HIT cache  //击中缓存
  15. Accept-Ranges: bytes
  16. Connection: keep-alive
  17.  
  18. [root@youxi1 ~]# curl bbs.you.cn  //第一次访问,可以看到指向的是youxi3
  19. youxi3
  20. [root@youxi1 ~]# curl -I bbs.you.cn  //第二次访问,只取http响应头,可以看到击中缓存
  21. HTTP/1.1 200 OK
  22. Date: Sun, 04 Aug 2019 16:09:49 GMT
  23. Server: Apache/2.4.6 (CentOS)
  24. Last-Modified: Sun, 04 Aug 2019 16:07:43 GMT
  25. ETag: "7-58f4ccaa0e583"
  26. Content-Length: 7
  27. Content-Type: text/html; charset=UTF-8
  28. X-Varnish: 32774 8
  29. Age: 6
  30. Via: 1.1 varnish (Varnish/6.2)
  31. X-Cache: HIT cache
  32. Accept-Ranges: bytes
  33. 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

使用Varnish为网站加速的更多相关文章

  1. 动态网站加速,cdn义不容辞

    "双十一"大战已经落下帷幕,各大电商纷纷拿出了亮眼的成绩单,但在这些成绩单的背后,CDN加速技术是功不可没的.随着互联网的发展,电商.视频直播等网站的火热,以及各个云加速平台的流行 ...

  2. WordPress网站加速优化,一键免费使用七牛CDN插件

    利用wordpress搭建网站是个人建站的主流方案,我曾分享过wordpress网站加速优化必做的十件事,帮助了不少个人站长.今天介绍帮助wordpress网站提升速度至少10倍的免费CDN加速插件: ...

  3. 为什么用CDN给你网站加速?

    大多数人都知道,一个用户在打开一个新网站的时候,如果网站打开的速度过慢,用户是很难继续浏览的.因而很多网站的运营人员想方设法的提高网站的加载速度.我们也相信速度是一个成功网站的必备要素之一,速度不够快 ...

  4. 网站加速与Linux服务器防护

    网站加速方面 1. Nginx 配置 gzip 压缩 开启nginx gzip压缩后,网页.css.js等静态资源的大小会大大的减少,从而可以节约大量的带宽,提高传输效率,给用户快的体验.虽然会消耗c ...

  5. CND网站加速

    CDN是什么 1-CDN俗称网站加速2-公司一般是购买其他cdn服务商提供的服务3-CDN一般是用来缓存网站的静态资源文件的(css,js,图片,html,htm),浏览器获取某个静态资源是按照就近原 ...

  6. Wordpress安装Redis为网站加速

    前面我们讲了宝塔Linux面板安装Redis,现在我们来举一些例子来看看redis的实际运用,比如Wordpress安装Redis为网站加速,下面就跟着ytkah一起来操作一下. 第一,下载predi ...

  7. php特级课---3、常用的网站加速技术有哪些

    php特级课---3.常用的网站加速技术有哪些 一.总结 一句话总结:网站加速技术是一组技术的组合,来提升网站的速度 1.Squid代理缓存技术 2.页面静态化缓存 3.Memcache 4.Sphi ...

  8. 关于CDN对动态网站加速的一些看法

    CDN的全称是Content Delivery Network,即内容分发网络.其目的是通过在现有的Internet中增加一层新的网络架构,将网站的内容发布到最接近用户的网络"边缘" ...

  9. varnish实现缓存加速

    varnish实现缓存加速 一.采用varnish为nginx实现缓存加速1.实验环境:(1)一台varnish缓存服务器,一台nginx服务器(2)关闭防火墙和selinux2.配置varnish( ...

随机推荐

  1. GITHUB添加SSH内容

    首先,你需要注册一个 github账号,最好取一个有意义的名字,比如姓名全拼,昵称全拼,如果被占用,可以加上有意义的数字. 本文中假设用户名为 chuaaqiCSDN(我的博客名的全拼) 一.gihu ...

  2. Linux本地内核提权CVE-2019-13272

    简介:当调用PTRACE_TRACEME时,ptrace_link函数将获得对父进程凭据的RCU引用,然后将该指针指向get_cred函数.但是,对象struct cred的生存周期规则不允许无条件地 ...

  3. django 第四天模板渲染

    今日内容 一.模板渲染 语法 {{ 变量 }} {% 逻辑 %} 1.变量 取列表中的第几个元素,用索引 <p>{{ namelist.2 }}</p> 取字典中的第几个元素用 ...

  4. 查看java的jar包源码

    1.jd-gui (windows环境) 下载地址 https://files.cnblogs.com/files/indifferent/jd-gui-windows-1.5.1.zip 下载并解压 ...

  5. CF446C DZY Loves Fibonacci Numbers 线段树 + 数学

    有两个性质需要知道: $1.$ 对于任意的 $f[i]=f[i-1]+f[i-2]$ 的数列,都有 $f[i]=fib[i-2]\times f[1]+fib[i-1]\times f[2]$ 其中 ...

  6. php 数组元素加法

    <?php//添加一个元素 $dirs[] = '1location';//再次添加一个元素 $dirs[] = '2location';//第三次添加一个元素 $dirs[] = '3loca ...

  7. linux如何实现凌晨定时执行脚本?

    Linux中,周期执行的任务一般由cron这个守护进程来处理.cron读取一个或多个配置文件,这些配置文件中包含了命令行及其调用时间.cron的配置文件称为“crontab”,是“cron table ...

  8. 小程序原生js获取用户权限

    1.首先要有一个按钮 <view name="authorizemodal"> <view class="drawer_screen" wx: ...

  9. 3、vueJs基础知识03

    vue过渡(动画) 本质走的css3: transtion ,animation <div id="div1" v-show="bSign" transi ...

  10. python mongo存在插入不存在更新,同时指定如果不存在才插入的字段

    python爬虫的任务数据操作的小技巧 好久没写公众号了,最近太忙了,这里就不多说了.直接根据需求上代码,我想这个应该是大家比较喜欢的, 需求 爬取某网站的项目列表页,获取其url,标题等信息,作为后 ...