Web架构:varnish缓存代理服务器超详细剖析

发布时间:2020-10-25 21:52:47 作者:小生博客
来源:网络 阅读:1016

   小生博客:http://xsboke.blog.51cto.com

   

  

 

                             -------谢谢您的参考,如有疑问,欢迎交流


目录

--------------------------------------  vcl内置预设变量

--------------------------------------  功能语句与对象

--------------------------------------  varnish中内置子程序

--------------------------------------  varnish缓存模式和子程序的关系



一、 Varnish简介

  1. 作用

  2. 特点

  3. Varnish的优势

  4. Varnish的劣势

  5. Varnish的组成

   1)  Management进程(管理进程)

     对child进程进行管理,同时对vcl配置进行编译

   2)  Child进程(子进程)

     生成线程池,负责处理用户请求

  6. Varnish配置组成

l  后端配置:指定后端服务器

l  ACL配置:为varnish添加访问控制列表,用于规则设置

l  Probes配置:实现后端服务器的健康检查

l  Directors配置:为varnish添加集群

l  核心子进程:为后端服务器、缓存、访问控制、错误处理等功能添

一、 arnish配置简介

  1. vcl内置预设变量

    Web架构:varnish缓存代理服务器超详细剖析

1)阶段

2)对象

     Web架构:varnish缓存代理服务器超详细剖析

     Web架构:varnish缓存代理服务器超详细剖析

     Web架构:varnish缓存代理服务器超详细剖析

     Web架构:varnish缓存代理服务器超详细剖析

     Web架构:varnish缓存代理服务器超详细剖析

     Web架构:varnish缓存代理服务器超详细剖析

   3)   运算符

     Web架构:varnish缓存代理服务器超详细剖析

  2. 功能语句与对象

l  一般功能语句都用于匹配对象,就是对某个对象实现什么操作

l  格式为:功能语句(对象)

1)功能语句

2)return的常用动作

  语法:returnaction

  3. varnish中内置子程序

   1) vcl_recv子程序

     Web架构:varnish缓存代理服务器超详细剖析

   2) vcl_pipe子程序

     Web架构:varnish缓存代理服务器超详细剖析

   3) vcl_pass子程序

     Web架构:varnish缓存代理服务器超详细剖析

   4) vc_hit子程序

     Web架构:varnish缓存代理服务器超详细剖析

   5) vcl_miss子进程

     Web架构:varnish缓存代理服务器超详细剖析

   6) vcl_hash子进程

     Web架构:varnish缓存代理服务器超详细剖析

    7) acl_purge子进程

     Web架构:varnish缓存代理服务器超详细剖析

   8) vcl_deliver子进程

     Web架构:varnish缓存代理服务器超详细剖析

   9) vcl_backend——fetch子程序

     Web架构:varnish缓存代理服务器超详细剖析

   10) vcl_backend_response子程序

     Web架构:varnish缓存代理服务器超详细剖析

   11) vcl_backend_error子程序

     Web架构:varnish缓存代理服务器超详细剖析

   12) vcl_synth子程序

     Web架构:varnish缓存代理服务器超详细剖析

   13) vcl_init子进程

     Web架构:varnish缓存代理服务器超详细剖析

   14) acl_fini子进程

     Web架构:varnish缓存代理服务器超详细剖析

4. varnish缓存模式和子程序的关系

l  varnish的配置文件,就是通过各种子程序组成的,当varnish运行时,也是通过子程序的配置进行相应的操作

l 子程序的关系如下图

    Web架构:varnish缓存代理服务器超详细剖析

   1) 右上角的两个图代表:加载vcl时执行vcl_init子程序,卸载vcl时执行vcl_fini子程序

   2) vcl_recv调用 hash函数时

     进入该状态后,会通过vcl_hash子程序,根据请求的url或其他信息生成hash键值,

     然后查找hash键值相同的缓存数据,若找到,则进入val_hit状态,否则进入vcl_miss状态

     Web架构:varnish缓存代理服务器超详细剖析

   3) vcl_recv调用pass 函数时

     Web架构:varnish缓存代理服务器超详细剖析

   4) vcl_recv判断需要调用 pipe 函数时

   5) vcl_recv指定purge模式时

      Purge模式用于清除缓存

  5. 优雅模式garce mode

1) 请求合并

2) 问题

3) 解决问题

1
2
3
4
5
6
7
8
9
10
11
12
13
14


案例:
  Sub vcl_recv {
     If (! req.backend.healthy) {        判断如果不健康
       set req.grace = 5m;varnish向前端提供5分钟的过期内容
     }
     else {                            如果健康
       set req.grace = 15s;varnish向前段提供15秒的过期内容
     }
   }
 
   sub vcl_fetch {
       set beresp.grace = 30m;将失效的缓存对象再多保留30分钟
   }

三、 varnish的安装

  1. 下载varnish压缩包

    有两个地方可下载

   1) 通过Varnish的官方网址http://varnish-cache.org,可以在这里下载最新版本的软件。

     但是有时候varnish的官网会被墙

   2) GIT下载:git clone https://github.com/varnish/Varnish-Cache/var/tmp/

     但是在安装时需要先使用./autogen.sh生成configure编译配置文件

  2. Varnish的安装

     首先安装依赖包

     Web架构:varnish缓存代理服务器超详细剖析

     配置varnish

     Web架构:varnish缓存代理服务器超详细剖析

     编译并安装

     Web架构:varnish缓存代理服务器超详细剖析

     拷贝vcl文件

     Web架构:varnish缓存代理服务器超详细剖析

     官方提供的vcl配置文件没有提示太多的配置信息,在生产环境中还是需要自己进行配置

四、 Varnish VCL实例配置解析

  拓扑环境

   Web架构:varnish缓存代理服务器超详细剖析

五、 启动varnish

   Web架构:varnish缓存代理服务器超详细剖析

六、 varnish vcl配置解析

   Varnish有自己的编程语法vclvarnish启动时,会将配置文件编译为C语言,然后再执行

  1. 后端服务器地址池配置及后端服务器健康检查

   1)   后端服务器定义,用于varnish连接指定的后端服务器

     Web架构:varnish缓存代理服务器超详细剖析

     Web架构:varnish缓存代理服务器超详细剖析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20


例:将监控块定义在后端服务器中
    backend web{
        .host="192.168.31.83";指定后端服务器的IP
        .port="80";后端服务器的暴露端口
        .probe={    直接追加监控块.probe是一个的参数
            .url="/";
            .timeout=2s;
         }
     }
或:先定义监控块,在定义后端服务器列表
    probe web_probe{    监控必需定义在前面,否则后端调用找不到监控块。
        .url="/";
        .timeout=2s;
    }
 
    backend web{
        .host="192.168.31.83";
        .port="80";
        .probe=web_probe;   调用外部共用监控块
    }

   2)   监视器定义

     Web架构:varnish缓存代理服务器超详细剖析

     Web架构:varnish缓存代理服务器超详细剖析

1
2
3
4
5
6
7
8


例:创建健康监测,定义健康检查名称为backend_healthcheck
    probe backend_healthcheck {   创建名为backend_healthcheck的健康检查
       .url = "/";监控入口地址为/的
       .timeout = 1s;请求超时时间
       .interval = 5s;每次轮询间隔5秒
       .window = 5;轮询5次
       .threshold = 3;必须有3次轮询正常才算该节点正常
    }

   3)   负载均衡群集directors

      使用randomhash 必须配置权重值,用于提高随机率

      Web架构:varnish缓存代理服务器超详细剖析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36


例:
 
    加载directors模块
    import directors;
  
    配置后端服务器
    backend web1 {
        .host = "192.168.0.10";
        .port = "80";
        .probe = backend_healthcheck;
    }
    backend web2 {
    .host = "192.168.0.11";
    .port = "80";
    .probe = backend_healthcheck;
    }
  
    初始化处理
    sub vcl_init {           
    调用vcl_init初始化子程序创建后端主机组,即directors
        new  web_cluster =directors.round_robin();
        使用new关键字创建drector对象,使用round_robin算法
        web_cluster.add_backend(web1);
        添加后端服务器节点
        web_cluster.add_backend(web2);
    }
    
    开始处理请求
    sub vcl_recv {
    调用vcl_recv子程序,用于接收和处理请求
        set req.backend_hint = web_cluster.backend();
        选取后端
    }

说明:

  • set命令是设置变量

  • unset命令是删除变量

  • web_cluster.add_backend(backend , real );  添加后端服务器节点,backend 为后端配置别名,real 为权重值,随机率计算公式:100 * (当前权重 / 总权重)

  • req.backend_hintvarnish的预定义变量,作用是指定请求后端节点

  • vcl对象需要使用new关键字创建,所有可创建对象都是内定的,使用前必需import,所有new操作只能在vcl_init子程序中。

  2. 访问控制列表(acl

      Web架构:varnish缓存代理服务器超详细剖析

  3. 缓存规则设置

Web架构:varnish缓存代理服务器超详细剖析

    说明:

      Web架构:varnish缓存代理服务器超详细剖析

       修改框中的变量,指定为varnish中设置的变量

七、 varnish将不同的url发送到不同的后端server

 AutoIt Code 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58


import directors;   # load the directors
backend web1 {
.host = "192.168.0.10";
.port = "80";
.probe = backend_healthcheck;
}
backend web2 {
.host = "192.168.0.11";
.port = "80";
.probe = backend_healthcheck;
}
定义后端服务器web1和web2


backend img1 {
    .host = "img1.lnmmp.com";
    .port = "80";
    .probe = backend_healthcheck;
}
backend img2 {
    .host = "img2.lnmmp.com";
    .port = "80";
    .probe = backend_healthcheck;
}
定义后端服务器img1和img2



//初始化处理
sub vcl_init {            
//调用vcl_init初始化子程序创建后端主机组,即directors
    new  web_cluster = directors.round_robin()
    //使用new关键字创建drector对象,使用round_robin算法
      web_cluster.add_backend(web1);
      //添加后端服务器节点
      web_cluster.add_backend(web2);
    new img_cluster = directors.random();
    //创建第二个集群
      img_cluster.add_backend(img1,2)
      添加后端服务器节点,并且设置权重值
      img_cluster.add_backend(img2,5);
}


//根据不同的访问域名,分发至不同的后端主机组
sub vcl_recv {
   if (req.http.host  ~  "(?i)^(www.)?benet.com$") { 
       如果请求头为www.benet.com或benet.com
         set  req.http.host = "www.benet.com";
         set  req.backend_hint = web_cluster.backend();  //选取后端
   } 
   elsif (req.http.host  ~  "(?i)^images.benet.com$") {
        set  req.backend_hint = img_cluster.backend();
    }
}
说明:中的i就是忽略大小写的意思。(?i)表示开启忽略大小写,而(?-i)表示关闭忽略大小写


推荐阅读:
  1. Varnish缓存服务器是什么?工作机制是什么?怎么搭建Varnish?
  2. Squid缓存代理部署——传统+透明(超详细)

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

web 架构 缓存

上一篇:Android音频编辑之音频转换PCM与WAV

下一篇:Java接口的作用_动力节点Java学院整理

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》