欢迎访问 生活随笔!

生活随笔

当前位置: 首页 >

架构师日记——VCL介绍和使用

发布时间:2023/12/20 87 豆豆
生活随笔 收集整理的这篇文章主要介绍了 架构师日记——VCL介绍和使用 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

VCL简介

  • VCL(Varnish Configuration Language):Varnish配置语言,语法简单,功能强大,类似于c,perl。主要用来配置如何处理请求和内容的缓存策略。
  • VCL在执行时会转换成二进制代码
  • VCL文件被分为多个子程序,不同的子程序在不同的时间里执行,比如一个子程序在接到请求时执行,另一个子程序在接收到后端服务器传送的文件时执行
  • 基本语法介绍

  • 用花括号做界定符,使用分号表示声明结束。注释用//,#,/* */
  • 赋值(=)、比较(==)、和一些布尔值(!、&&、||),!(取反)等类似c语法
  • 支持正则表达式,ACL匹配使用~操作,如if(req.uri ~ “abc$”){…},表示请求的uri以abc结尾
  • 不同于C的地方,反斜杠(\)在VCL没有特殊的含义。只是用来匹配URLs
  • VCL没有用户定义的变量,只能给backend、request、document这些对象的变量赋值,大部分是手工输入的,而且给这些变量分配值的时候,必须有一个VCL兼容的单位
  • VCL有if,但是没有循环
  • 可以使用set来给request的header添加值,unset或remove来删除某个header
  • 声明backend

    可以配置多个后台ip和端口

    backend abc{.host = "127.0.0.1";//ip.port = "8080";//端口.connect_timeout = 1s;//连接超时时间.first_byte_timeout = 5s;//等待从backend传输过来的第一个字符的时间.between_bytes_timeout = 2s;//两个字符的间隔时间.max_connections=100;//最大连接数 } backend jkl{.host = "127.0.0.1";.port = "9090"; }

    若只有一个那不需要声明导向哪个backend,配置了多个backend则需要,如

    sub vci_recv{if(req.request == "GET"){req.backend=abc;} }

    director

    director是backend的逻辑分组或backend的集群。主要有随机、循环和DNS集中director,不同类型的director具有不同的算法来选择backend。比如随机的director示例如下:

    director b2 random{//随机选.retries = 5;{.bakend =abc;//已配置的backend.weigth = 7;//被选中的权重}{.bakend =jkl;.weigth = 3;} }

    指向director可以这样配置

    set req.backend = b2;

    随机的director又分成三种,分别是randomclienthash,他们采用同样的随机分发算法,只是种子数值不同,种子数分别采用随机数、客户端id或者是缓存的hash(典型的url)

    1.client director

    你可以通过设置VCL变量client.identity来区分客户端,值可以从session cookie或其他相似的值来获取

    2.hash director

    默认使用URL的hash值,可以通过req.hash获取到

    3.round-robin director

    它没有什么选项就是一次循环使用backend,第一个请求用第一个backend,第二个请求使用第二个,如此类推。

    4.dns director

    有两种不同的方法来选择后端,一种是random或者round-robin;另一种是使用.list(list的方式不支持ipv6):

    director directorname dns{.list = {.host_header="www.example.com";.port="80";.connection_timeout = 0.4;"192.168.15.0"/24;"192.168.16.128"/25;}.ttl = 5m;.suffix = "internal.example.net"; }

    这段代码会指定384个后端,都是用80端口及0.4s的连接超时,.list生命中设置选项必须在IPS的前面。.ttl定义DNSlookups的时间。

    5.fallback director

    选择第一个健康的backend,若先定义的backend没有down就选先定义的,实例:

    director b3 fallback{{.backend = www1;}{.backend = www2;}{.backend = www3;} }

    probe(后端探针)

    探测后端,确定他们是否健康,返回的状态用req.backend.healthy核对:

    backend jkl{.host = "127.0.0.1";.port = "9090";.probe = p1; } probe p1{.url = "/test.jpg";//访问backend的路径,默认是"/".timeout = 0.3s;//定义probe的过期时间,默认是2s.window = 8;//要检查后端服务器的次数,默认是8.threshold = 3;//.windos里面要有多少polls成功就认为后端是健康的,默认是3.initial = 3;//当varnish启动的时候,要确保多少个probe正常,默认是3.internal = 6s;//probe多久检查一次后端,默认是5s.request = "GET / HTTP/1.1""Host:www.abc.com"//设置详细的请求头,是一些字符串 }

    Acls

    访问控制列表,示例如下

    apl local{"localhost";"192.0.2.0"/24;//匹配主机名为192.0.2.0的主机!"192.0.2.23";//不匹配ip为192.0.2.23的主机 }

    匹配示例:

    if(client.ip ~ local){... } if(!client.ip ~ local){... }

    总结

    以上是生活随笔为你收集整理的架构师日记——VCL介绍和使用的全部内容,希望文章能够帮你解决所遇到的问题。

    如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。