varnish实战--VCL详解

新博客网站1

新博客网站2

vcl工作流程

varnish实战--VCL详解_第1张图片
image.png

varnish实战--VCL详解_第2张图片
image.png

vcl状态引擎

  state engine  多引擎之间存在相关性,前一个engine如果有多个下游engine,则上游需要用return 指明要转移的engine
        vcl_recv
        vcl_hash
        vcl_hit
        vcl_miss
        vcl_fetch
        vcl_deliver
        vcl_pass
        vcl_error

编程语法

  (1)支持注释  // # /* */
  (2)不支持循环
  (3)sub $name:用于定义子例程
        sub vcl_recv {
      
        }
  (4)有众多内置的变量,变量的可调用位置与state engine有密切相关性
  (5)支持终止语句,return(action),没有返回值
  (6)"域"专用
  (7)操作符 =,==,!,&&,||

pipe 无法理解请求方法,管道直接送到后台
pass 不查缓存

常用语句

  if     else
  set name=value
  unset name
  req.http.HEADER:调用请求报文中http协议的指定的变量
  req.request:请求方法

状态引擎流程(V3)

  vcl_recv-->vcl_hash-->vcl_hit-->vcl_deliver
  vcl_recv-->vcl_hash-->vcl_miss-->vcl_fetch-->vcl_deliver
  vcl_recv-->vcl_pass-->vcl_fetch-->vcl_deliver
  vcl_recv-->vcl_pipe
varnish实战--VCL详解_第3张图片
image.png

状态引擎流程(V4)
varnish实战--VCL详解_第4张图片
image.png

varnish 变量种类

  req    请求
  resp  响应
  client 客户端
  server 服务端
  bereq 向后端请求时产生的req
  beresp 后端响应时产生的resp
  obj
  storage

常用变量

  bereq
                bereq.http.HEADERS: 由varnish发往backend server的请求报文的指定首部;
                bereq.request:请求方法;
                bereq.url:
                bereq.proto:
                bereq.backend:指明要调用的后端主机;

            beresp
                beresp.proto
                beresp.status:后端服务器的响应的状态码
                beresp.reason:原因短语;
                beresp.backend.ip
                beresp.backend.name
                beresp.http.HEADER: 从backend server响应的报文的首部;
                beresp.ttl:后端服务器响应的内容的余下的生存时长;

            obj
                obj.ttl: 对象的ttl值;
                obj.hits:此对象从缓存中命中的次数;

            server
                server.ip
                server.hostname

            req

            resp

            官方文档:https://www.varnish-cache.org/docs/4.0/reference/vcl.html#varnish-configuration-language

支持虚拟主机:

    if (req.http.host == "www.magedu.com") {

    }

强制对某资源的请求,不检查缓存;

    /admin
    /login

    if (req.url ~ "(?i)^/login" || req.url ~ "(?i)^/admin") {
        return(pass);
    }

对特定类型的资源取消其私有的cookie标识,并强行设定其可以varnish缓存的时长:

    vcl_backend_response
    if (beresp.http.cache-control !~ "s-maxage") {
        if (bereq.url ~ "(?i)\.jpg$") {
            set beresp.ttl = 3600s;
            unset beresp.http.Set-Cookie;
        }
        if (bereq.url ~ "(?i)\.css$") {
            set beresp.ttl = 600s;
            unset beresp.http.Set-Cookie;
        } 
    }

官方配置示例:https://www.varnish-cache.org/trac/wiki/VCLExamples

backend server的定义:
    backend name {
        .attribute = "value";
    }   

    .host: BE主机的IP;
    .port:BE主机监听的PORT;

    .probe: 对BE做健康状态检测;
    .max_connections:并连接最大数量;

后端主机的健康状态检测方式:

    probe name {
         .attribute = "value";
    }   

    .url: 判定BE健康与否要请求的url; 
    .expected_response:期望响应状态码;默认为200;

你可能感兴趣的:(varnish实战--VCL详解)