专栏首页运维猫Varnish为网站加速

Varnish为网站加速

1、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设计架构。

2、varnish基础概念详解

监听端口号: 6081

官方网站:

https://www.varnish-cache.org/

下载:

http://varnish-cache.org/releases/index.html

2.1比起squid更加轻量级,大致有以下几个特点:

2.2可以基于内存缓存,也可以在磁盘上缓存

2.3如果期望内存大小超过几十个G,比如图片服务器,纯粹使用内存,性能未必好,这时候可以使用磁盘进行缓存,或使用SSD X 2 做RAID1避免磁盘损坏,在实现随机访问上 ssd硬盘要比机械硬盘要好的多,如果必须要缓存在磁盘上还是建议使用ssd磁盘

2.4可以利用虚拟内存方式,IO性能会非常好

2.5支持设置0-60秒 精确缓存时间

3、支持VCL

其配置是通过vcl编程语言来完成的。其配置需要先转换成C代码,所以使用vcl所写的配置,要先转换成C语言代码,因此要依赖于GCC临时的编译vcl配置的,编译完之后才能运行起来。

: Varnish Configuration Language - VCL(varnish配置语言-VCL)。

Varnish使用区域配置语言,这种语言叫做“VCL”(varnish configuration language),在执行vcl时,varnish就把VCL转换成二进制代码。

VCL文件被分为多个子程序,不同的子程序在不同的时间里执行,比如一个子程序在接到请求时执行,另一个子程序在接收到后端服务器传送的文件时执行。

4、独特的日志存储及管理机制

日志既然保存在内存中,日志可以供多个应用程序所访问,所以一般查看命中率,当前请求有多少get post 方法等等,都需使用专用的工具才可以查看,比如varnishshtopvarnishlog等命令工具用来查看日志信息。

5、支持使用varnish状态引擎

通过巧妙的状态引擎的设计完成不同的引擎对用户的请求和缓存代理机制进行处理,用配置文件为状态引擎提供状态法则,完成缓存处理、完成代理处理等等

6、varnish 缓存原理

varnish缓存数据机制:

处理过程大致分为如下几个步骤:

6.1.Receive状态,也就是请求处理的入口状态,根据VCL规则判断该请求应该是Pass或Pipe,或者进入Lookup(本地查询)。

6.2Lookup状态,在缓存中查找用户请求的对象,如果缓存中没有其请求的对象,后续操作很可能会将其请求的对象进行缓存;进入此状态后,会在hash表中查找数据,若找到,则进入Hit(命令中)状态,否则进入miss(没命中)状态。

6.3Pass状态,在此状态下,会进入后端请求,即进入fetch取状态。

6.4Fetch状态,在Fetch取状态下,对请求,进行后端的获取,发送请求,获得数据,并进行本地的存储。

6.5Deliver提供状态,将获取到的数据发送给客户端,然后完成本次请求。

注:

pass:绕过缓存,即不从缓存中查询内容或不将内容存储至缓存中;pipe:不对客户端进行检查或做出任何操作,而是在客户端与后端服务器之间建立专用“管道”,并直接将数据在二者之间进行传送;此时,keep-alive连接中后续传送的数据也都将通过此管道进行直接传送,并不会出现在任何日志中;

总结: 用户通过varnish加速时,有4线路可以获得数据。

7、实战:缓存一个网站

7.1实战:配置docker-01成为varnish服务器加速docker-02 web服务器

通过CDN加速WEB网站

网宿,蓝讯

智能DNS

 [root@docker-01 ~]# yum install varnish
 [root@docker-01 ~]# vim /etc/varnish/default.vcl 
 改:
 16backend default {
 17    .host ="127.0.0.1";
 18    .port ="8080";
 19}
 为:
 16backend web1 {
 17    .host ="172.17.120.51";
 18    .port ="80";
 19}
 结尾追加:
 35sub 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.
 40if(obj.hits > 0) {
 41       setresp.http.X-Cache ="HIT from "+req.http.host;
 42        setresp.http.X-Cache-Hits =obj.hits;
 43    } else{
 44       setresp.http.X-Cache ="MISS from "+req.http.host;
 45    }
 46  return (deliver);
 47}
 [root@docker-01 ~]# vim /etc/varnish/varnish.params 
 改:
 14VARNISH_LISTEN_PORT=6081
 为:
 14VARNISH_LISTEN_PORT=80
 [root@docker-01 ~]# systemctl restart varnish

注:截图展示

7.2配置docker-02为web服务

 [root@docker-02 ~]# yum install httpd
 [root@docker-02 ~]# echo "yunweimao" > /var/www/html/index.html
 [root@docker-02 ~]# service httpd restart

7.3测试

测试源站点:

在浏览器中访问:http://172.17.120.51/

测试加速:

在浏览器中访问:http://172.17.120.50/

能够正常访问,说明代理设置成功。

7.4测试缓存命中

扩展:curl命令

curl是通过url语法在命令行下上传或下载文件的工具软件,它支持http,https,ftp,ftps,telnet等多种协议,常被用来抓取网页和监控Web服务器状态。

参数:

-I只取http响应头的信息,不取网页内容

 [root@docker-02 ~]# curl -I 172.17.120.51 ##docker-01上查看docker-02开启动的web服务器类型
 HTTP/1.1 200OK
 Date: Tue, 15Oct 201908:19:36 GMT
 Server: Apache/2.4.6 (CentOS)
 Last-Modified: Tue, 15Oct 201907:22:43 GMT
 ETag: "a-594edd9b0bc06"
 Accept-Ranges: bytes
 Content-Length: 10
 Content-Type: text/html; charset=UTF-8
 [root@docker-01 varnish]# curl -I 172.17.120.50
 HTTP/1.1 200OK
 Date: Tue, 15Oct 201908:21:08 GMT
 Server: Apache/2.4.6 (CentOS)
 Last-Modified: Tue, 15Oct 201907:22:43 GMT
 ETag: "a-594edd9b0bc06"
 Content-Length: 10
 Content-Type: text/html; charset=UTF-8
 X-Varnish: 32775
 Age: 0
 Via: 1.1 varnish-v4
 X-Cache: MISS from 172.17.120.50 ##表示没有命中
 Connection: keep-alive
 [root@docker-01 varnish]# curl -I 172.17.120.50
 HTTP/1.1 200OK
 Date: Tue, 15Oct 201908:21:08 GMT
 Server: Apache/2.4.6 (CentOS)
 Last-Modified: Tue, 15Oct 201907:22:43 GMT
 ETag: "a-594edd9b0bc06"
 Content-Length: 10
 Content-Type: text/html; charset=UTF-8
 X-Varnish: 1332776
 Age: 53
 Via: 1.1 varnish-v4
 X-Cache: HIT from 172.17.120.50  ##表示命中
 X-Cache-Hits: 1
 Connection: keep-alive

8、使用varnish加速多个不同域名站点的web服务器

配置docker-02和docker-03为web服务器

docker-02之前已经配置成web服务器

8.1配置docker-03为web2服务器

 [root@docker-03 ~]# yum install httpd
 [root@docker-03 ~]# echo 'maoxiaopu' > /var/www/html/index.html
 [root@docker-03 ~]# systemctl start httpd
 [root@docker-03 ~]# vim /etc/hosts
 172.17.120.50 www.docker.cn
 172.17.120.50 bbs.docker.cn
 [root@docker-03 ~]# systemctl restart httpd

8.2配置docker-01 上的varnish服务器

 [root@docker-01 varnish]# vim /etc/varnish/default.vcl
 改:
 16backend web1 {
 17    .host ="172.17.120.51";
 18    .port ="80";
 19}
 为:
  16backend web1 {
 17    .host ="172.17.120.51";
 18    .port ="80";
 19}
 20backend web2 {
 21    .host ="172.17.120.53";
 22    .port ="80";
 23}
 ##当访问www.docker.cn域名时从web1上取数据,访问bbs.docker.cn域名时到web2取数据
 25sub vcl_recv {
 26    # Happens before we check if we have this in cache already.
 27    #
 28    # Typically you clean up the request here, removing cookies you don't ne   ed,
 29if(req.http.host ~ "(?i)^(www.)?docker.cn$") {
 30         set req.http.host = "www.docker.cn";
 31        setreq.backend_hint =web1;
 32      } elsif (req.http.host ~ "(?i)^bbs.docker.cn$") {
 33             set req.backend_hint = web2;
 34    return(hash);
 35}
 36}

注:截图展示

8.3重新加载varnish配置文件

 [root@docker-01 varnish]# systemctl restart varnish.service

9、测试

 [root@docker-01 varnish]# vim /etc/hosts
 172.17.120.50 www.docker.cn
 172.17.120.50 bbs.docker.cn
 [root@docker-01 varnish]# yum install elinks -y
 [root@docker-01 varnish]# elinks bbs.docker.cn --dump
   maoxiaopu
 [root@docker-01 varnish]# elinks www.docker.cn --dump
   yunweimao

本文分享自微信公众号 - 运维猫(centos15),作者:胡齐

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-10-16

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • linux上安装Docker

    类似一个轻量级的沙箱,容器是从镜像创建应用运行实例,可以将其启动、开始、停止、删除、而这些容器都是相互隔离、互不可见的。

    胡齐
  • NFS服务器

    NFS,是Network File System的简写,即网络文件系统。网络文件系统是FreeBSD支持的文件系统中的一种,也被称为NFS. NFS允许一个系统...

    胡齐
  • 搭建iscsi存储系统

    SATA:容量大,500G, 750G, 1T, 2T, 3T, 4T 不支持热插拔,价格低。

    胡齐
  • Docker之开启远程访问 原

    wuweixiang
  • Docker教程(九)部署Spring Boot项目

    开启Docker远程连接后,在开发和学习时都能带来便利,但请不要将此方式用在外部网络环境,以免带来安全问题,下图是官方警告:

    小东啊
  • docker stats命令源码分析结果

    本文是基于docker 1.10.3版本的源码,对docker stats命令进行源码分析,看看docker stats命令输出的数据是从cgroups fs中...

    Walton
  • Android - 自定义View,实现不一样的输入框

    最近看到一个效果,就是在登陆界面输入账号密码的时候,会有一个动画效果,感觉不错,找了一些资料,学习了一下。已经实现效果,效果如下:

    android_薛之涛
  • 一款基于Material Desgin设计的APP

    版权声明:本文为博主原创文章,转载请标明出处。 https://blog.csdn.net/lyhhj/article/details/50...

    Hankkin
  • python调用mrjob实现hadoo

    咱们一般写mapreduce是通过java和streaming来写的,身为pythoner的我,

    py3study
  • 经典面试题-请解释下Spring框架中的IoC?

    cwl_java

扫码关注云+社区

领取腾讯云代金券