linux下varnish4配置语法(基础)

varnish4 安装可以查看:http://php2012web.blog.51cto.com/5585213/1640182

VCL 说明文档:https://www.varnish-cache.org/docs/4.0/reference/vcl.html


varnish 配置基本上是编辑 VCL 文件,varnish 有一套自定义 VCL 语法,启动时,会将配置文件编译为C语言,再执行。


varnish 4.0开始,每个VCL文件必须在开始行声明它的版本“vcl 4.0;”

块(子程序)由大括号分隔,语句用分号结束。所有的关键字及预设子程序名都是全小写。


注意:4.0与3.0有部分变更,也就是配置文件有不兼容点。
https://www.varnish-cache.org/docs/4.0/whats-new/upgrading.html

1 . 配置文件必需要版本声明,如: vcl 4.0;

2 . 原req.request改为req.method

3 . 原vcl_fetch改变vcl_backend_response

4 . 原directors移到vmod_directors

5 . hash作为director,director已被删除

6 . vcl_error改为vcl_backend_error

7 . error code [reason] 改为 synth( code [,reason] )

8 . vcl_synth合成响应处理。直接修改resp.http对象,而不是obj.http。

9 . 在vcl_backend_error使用beresp对象取代原vcl_error使用obj对象。

10 . 使用beresp.uncacheable创建hit_for_pass对象。如:

sub vcl_backend_response {
    if (beresp.http.X-No-Cache) {
        set beresp.uncacheable = true;
        set beresp.ttl = 120s;
        return (deliver);
    }
}

11 . req在vcl_backend_response不可使用;原vcl_fetch可用,但变更后只能在vcl_backend_response使用bereq。

12 . 任何自定义的子程序不能使用 vcl_* 命令方式。

13 .  req.backend.healthy使用方法换成std.healthy(req.backend_hint),并且还得import std模块。

14 . client.port和server.port分别使用方法改成 std.port(client.ip)和std.port(server.ip)。

15 . purge已经弃用,缓存失效需要从vcl_recv通过return (purge)而不是 purge;

16 . obj全只读,obj.last_use已经弃用。

17 . 返回值变更:(除 synth(code[,reason]) 外)

      vcl_recv  使用 return hash 代替 return lookup

      vcl_hash 使用 return lookup 代替 return hash

      vcl_pass 使用 return fetch 代替 return pass

18 . 原后端重启(return (restart))改为重试(return(retry))并且进入vcl_backend_fetch处理。

19 . remove关键字已经被弃用使用 unset 代替。

20 . X-Forwarded-For设置移动到vcl_recv之前处理。

21 . session_linger改名为timeout_linger 并且时间单位为 秒(原来是毫秒)。

22 . sess_timeout改名为timeout_idle。

23 . sess_workspace弃用。

24 . thread_pool_purge_delay改名为thread_pool_destroy_delay 并且单位为 秒 (原来是毫秒)。

25 . thread_pool_add_delay和thread_pool_fail_delay时间单位匀改为 秒 (原来是毫秒)。


支持运算符:


=   (赋值运算)


==  (相等比较)


~    (匹配,可以使用正则表达式,或访问控制列表)


!~    (不匹配,可以使用正则表达式,或访问控制列表)


!  (非)


&&   (逻辑与)


||   (逻辑或)


条件语句:


if 和 else

允许使用多层条件 elseif (elseif|elsif|elif|else if 都可以代表elseif)



数据类型:


字符串,布尔值,时间,持续时间,整数


设置变量:

set req.http.User-Agent="test";

删除变量:

unset req.http.Range;


字符串: 

    使用 "" 符号(不能使用单引号); 直接使用 "" 不能包含换行符,如果是长字符可以使用 {"...."} 可以包含任意字符。

    注意:字符串连接使用 + 操作符。


布尔值:

    true 或 false


时间:

    VCL自带时间函数 now 返回的是时间字符串。


持续时间:

    就是一个时间代号,由数值和时间范围组成。

    时间范围有:

    ms  (毫秒)

    s   (秒)

    m   (分钟)

    h   (小时)

    d   (天)

    w   (周)

    y   (年)

    

    如: 1.5d  就表示是 1.5 天


整数,实数:

    VCL允许整数或实数的设置,但返回时为字符串。


正则表达式:


兼容 PCRE ,使用时要外加引号,前面得使用 ~ 运算符。如:req.http.host ~  "varnish.com$"


引入其它VCL文件:

当配置文件过大,或复杂时,可以考虑把配置文件拆分成多个vcl文件,然后引入到入口配置文件中,以便管理,如:

include 'public.vcl';


import 加载VMOD模块:


VCL 自带很多VMOD模块,使用前必须加载进来。如:

import std;

sub vcl_recv{

    std.log('success');

}


注释:


支持 // 或 #  多行时还可以使用 /* .. */


后端定义:

实际上就是给varnish添加可供访问的web服务器,如果有多台web服务器时,可添加多个backend块。

命令:backend。这个定义为最基本的反向入口定义,用于varnish连接对应的服务器,如果没有定义或定义错误则用户无法访问正常页面。

语法格式:

backend name{
    .attribute = "value";
}

说明:backend 是定义后端关键字,name 是当前后端节点的别名,多个后端节点时,name 名不能重复,否则覆盖。花括号里面定义当前节点相关的属性(键=值)。除默认节点外其它节点定义后必需有调用,否则varnish无法启动。后端是否正常可以通过std.healthy(backend)判断。

属性列表:


.host="127.0.0.1";      //要转向主机IP或域名,必填键/值对。


.port="8080";        //主机连接端口号或协议名(HTTP等),默认80


.host_header='';    //请示主机头追加内容


.connect_timeout=1s;     //等待后端连接的时间


.first_byte_timeout=5s;    //等待从后端返回的第一个字节时间


.between_bytes_timeout=2s;     //每接收一个字节之间等待时间


.probe=probe_name;        //监控服务器访问状态,指定外部监控name或者内部直接添加


.max_connections=200;    //设置最大并发连接数,超过这个数后连接就会失败


注意:时间相关的值可以使用 持续时间 组成的值,时间与连接数是限定条件,如果超出条件则会连接失败,所以没有特别情况,不推荐使用;监控器,是判定服务器是否正常的组件,可以直接在后端内定义或指定外部定义的监控name名。

例:(下面两个例子结果是一样的,但第二个例子中更适用于集群,可以方便批量修改)

backend web{
    .host="127.0.0.1";
    .port="8080";
    .probe={          //直接追加监控块
        .url="/";
        .timeout=2s;
    }
}

probe web_probe{   //监控必需定义在前面,否则后端调用找不到监控块。
    .url="/";
    .timeout=2s;
}

backend web{
    .host="127.0.0.1";
    .port="8080";
    .probe=web_probe;   //调用外部共用监控块
}


监控器(探头):


命令:probe 。监控可以循环访问指定的地址,通过响应时间判定服务器是否空闲或正常。这类命令非常适用于集群中某些节点服务器崩溃或负载过重,而禁止访问这台节点服务器。

语法格式:

probe name{
    .attribute = "value";
}

说明:probe 是定义监控关键字,name 是当前监控点的别名,多个监控节点时,name 名不能重复,否则覆盖。花括号里面定义当前节点相关的属性(键=值)。

没有必填属性,因为默认值就可以正常执行操作。

属性列表:


.url="/";    //指定监控入口URL地址,默认为"/"


.request="";   //指定监控请求入口地址,比 .url 优先级高。


.expected_response="200";   //请求响应代码,默认是 200


.timeout=2s;   //请求超时判断范围。


.interval=5s;     //每次轮询请求间隔时间,默认为 5s 。


.initial=-1;     //初始启动时以.window轮询次数中几次良好后续才能使用这个后端服务器节点,默认为 -1 ,则轮询完 .window 所有次数良好判定为正常。


.window=8;   //指定多少轮询次数,用于判定服务器正常,默认是 8。


.threshold=3;   //必须多少次轮询正常才算该后端节点服务器正常,默认是 3。



访问控制列表(ACL):


创建一个地址列表,用于后面的判断,可以是域名或IP集合。这个可以用于指定某些地址请求入口,防止恶意请求等。

语法格式:

acl name{
    "127.0.0.1";
    "localhost";
    !"192.168.134.01";
}

说明:acl 是访问列表关键字(必需小写),name 是该列表的别名用于调用,花括号内部是地址集。

注意:如果列表中包含了无法解析的主机地址,它会匹配任何地址,如果不想让它匹配所有地址可以在前添加一个 ! 符号,如上面 !"192.168.134.01";

使用ACL只需要用 匹配运算符 ~ 或 !~  如:

if(client.ip ~ name){
    return (pipe);
}


VCL对象:


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

例:

sub vcl_init {
    new b = directors.round_robin()
    b.add_backend(node1);
}


集群负载均衡directors:

directors是varnish负载均衡模块,使用前必需引入directors模块,directors模块包含:round_robin,fallback,random,hash四个对象即四种负载均衡模式。

round_robin : 循环依次逐个选择后端服务器。

fallback : 依次选择第一个正常的后端服务器。

random : 随机选择后端服务器,可设置每个后端权重增加随机率。

hash :  通过散列随机选择对应的后端服务器且保持选择对应关系,下次则直接找对应的后端服务器。


注意:random,hash 有权重值设置,用于提高随机率。选中的后端需要设置到req.backend_hint中。每个后端最好都配置监控器(后端服务器正常监测)以便directors自动屏蔽不正常后端而不进入均衡列队中。vcl_backend_error中最好使用 return(retry); 重试后端动作以便能跨过不正常后端(重试后端次数受配置值max_retries影响默认为4次)当使用hash均衡模式时还得清除当前缓存否则重试还是原后端服务器。


round_robin例:

函数集:

round_robin.add_backend( backend );  添加后端服务器节点,backend 为后端配置别名。

round_robin.backend();  循环提取后端节点

说明:round_robin从请求个数上均匀的分配后端服务器,只要处理好后端错误能很好避开有问题的后端服务器

import directors;

//初始化处理
sub vcl_init{
    new vdir=directors.round_robin(); //创建对象
    vdir.add_backend(web1);           //添加后端服务器节点
    vdir.add_backend(web2);
}
//开始处理请求
sub vcl_recv{
    set req.backend_hint=vdir.backend();//选取后端
}


fallback例:

函数集:

fallback.add_backend( backend );  添加后端服务器节点,backend 为后端配置别名。

fallback.backend();  依次提取第一个正常后端节点。

说明:fallback依次检查后端节点返回第一个正常后端节点(这个检查是通过后端监控器完成的,所以并不能及时找出不正常后端),请求会一直堆积在第一台正常后端服务器,给这个节点造成压力,只要处理好后端错误能很好避开有问题的后端服务器

import directors;

//初始化处理
sub vcl_init{
    new vdir=directors.fallback();    //创建对象
    vdir.add_backend(web1);           //添加后端服务器节点
    vdir.add_backend(web2);
}
//开始处理请求
sub vcl_recv{
    set req.backend_hint=vdir.backend();//选取后端
}


random例:

函数集:

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

random.backend();  随机提取后端节点

说明:随机选中一台后端服务器,只要处理好后端错误能很好避开有问题的后端服务器。

import directors;

//初始化处理
sub vcl_init{
    new vdir=directors.random(); //创建对象
    vdir.add_backend(web1,5);    //添加后端服务器节点,并且设置高权重值。
    vdir.add_backend(web2,2);    //添加后端服务器节点,并且设置低权重值。
}
//开始处理请求
sub vcl_recv{
    set req.backend_hint=vdir.backend();//选取后端
}


hash例:

函数集:

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

hash.backend();  使用hash值提取后端节点

说明:第一次创建hash键值时随机提取一台后端服务器,后续按对应的键值直接提取,不能很好的避开坏节点。

import directors;

//初始化处理
sub vcl_init{
    new vdir=directors.hash(); //创建对象
    vdir.add_backend(web1,5);    //添加后端服务器节点,并且设置高权重值。
    vdir.add_backend(web2,2);    //添加后端服务器节点,并且设置低权重值。
}
//开始处理请求
sub vcl_recv{
    set req.backend_hint=vdir.backend(req.url);//以请求地址为hash选取后端
}




子程序:


子程序是一种类似C的函数,但了程序没有调用参数,也没有返回值,子程序以 sub 关键字定义。在VCL里子程序是用于管理程序。调用一个子程序使用 call 关键字。


声明子程序 例:

sub name{
    if(client.ip == "192.168.134.168"){
        return (pipe);
    }
}

调用子程序 例:

sub vcl_recv{
    call name;
}

注意:所有VCL内置的程序都是以 vcl_ 开头,并已经预置好,在VCL文件中只要声明对应的内置子程序,都会在对应的流程中调用。所有自定义的子程序自4.0开始不能以 vcl_ 开头。子程序数据交互只有通过全局变量来传递。


return 语句:

return 语句是终止子程序并返回动作,所有动作都根据不同的vcl子程序限定来选用

https://www.varnish-cache.org/docs/4.0/users-guide/vcl-built-in-subs.html

语法:return(action);

常用的动作:

  1. abandon  放弃处理,并生成一个错误。

  2. deliver  交付处理

  3. fetch  从后端取出响应对象

  4. hash  哈希缓存处理

  5. lookup 查找缓存对象

  6. ok 继续执行

  7. pass  进入pass非缓存模式

  8. pipe 进入pipe非缓存模式

  9. purge 清除缓存对象,构建响应

  10. restart 重新开始

  11. retry 重试后端处理

  12. synth(status code,reason) 合成返回客户端状态信息



预设变量:

预设变量是系统固定的,请求进入对应的vcl子程序后便生成,这些变量可以方便子程序提取,当然也可以自定义一些全局变量。

注:预设变量存在读写限制,vcl_all 是vcl配置中所有子程序,backend 是后端处理相关子程序(如vcl_backend_fetch,vcl_backend_response,vcl_backend_error),client请求处理相关子程序不含后端backend,vcl_init,vcl_fini其它子程序。(未指定读或写范围,则为对应操作不存在)。

当前时间:

now

数据类型:time

读:vcl_all

作用:返回当前时间戳,全局可读但不可写。


客户端:(客户端基本信息)

注:原client.port已经弃用,如果要取客户端请求端口号使用 std.port(client.ip),需要import std;才可以使用std

client.ip

数据类型:IP

读:client

作用:返回客户端IP地址。

说明:


client.identity

数据类型:字符串

读:client

写:client

作用:用于装载客户端标识码。


服务器:(服务器基本信息)

注:原server.port已经弃用,如果要取客户端请求端口号使用 std.port(server.ip),需要import std;才可以使用std

server.hostname

数据类型:字符串

读:vcl_all

作用:服务器主机名。


server.identity

数据类型:字符串

读:vcl_all

作用:服务器身份标识。可由varnishd 启动的-i 参数决定,如果没有设置-i 则为该实例的名称(受 -n 参数影响)。


server.ip

数据类型:IP

读:client

作用:用于装载客户端标识码。


bereq:(发送到后端的请求对象,基于req对象)

注:bereq可读写是随着对应子程序所在处理流程所产生的影响不一样,比如在vcl_pipe中处理bereq是无法影响到请求后端,因为到vcl_pipe中后端请求已经发送。

bereq

数据类型:HTTP

读:backend

作用:整个后端请求后数据结构。


bereq.backend

数据类型:backend

读:backend , vcl_pipe

写:backend , vcl_pipe

作用:所请求后端节点配置。


bereq.between_bytes_timeout

数据类型:持续时间

读:backend

写:backend

作用:从后端每接收一个字节之间的等待时间(秒),缓冲接收,(pipe模式无效)


bereq.connect_timeout

数据类型:持续时间

读:backend , vcl_pipe

写:backend , vcl_pipe

作用:连接后端等待时间(秒),最大等待时间。


bereq.first_byte_timeout

数据类型:持续时间

读:backend

写:backend

作用:等待后端第一个字节时间(秒),最大等待时间,(pipe模式无效)


bereq.http

数据类型:header

读:backend , vcl_pipe

写:backend , vcl_pipe

作用:对应发送到后端HTTP的header信息。


bereq.method

数据类型:string

读:backend , vcl_pipe

写:backend , vcl_pipe

作用:发送到后端的请求类型(如:GET , POST)。


bereq.proto

数据类型:string

读:backend , vcl_pipe

写:backend , vcl_pipe

作用:发送到后端的请求的HTTP版本。


bereq.retries

数据类型:int

读:backend

作用:相同请求重试计数。


bereq.uncacheable

数据类型:bool

读:backend

作用:无缓存这个请求。


bereq.url

数据类型:string

读:backend , vcl_pipe

写:backend , vcl_pipe

作用:发送到后端请求的URL。


bereq.xid

数据类型:string

读:backend

作用:请求唯一ID。


beresp:(后端响应请求对象)

beresp

数据类型:HTTP

读:vcl_backend_response , vcl_backend_error

作用:整个后端响应HTTP数据结构。


beresp.backend.ip

数据类型:IP

读:vcl_backend_response , vcl_backend_error

作用:后端响应的IP。


beresp.backend.name

数据类型:string

读:vcl_backend_response , vcl_backend_error

作用:响应后端配置节点的name。


beresp.do_esi

数据类型:bool

读:vcl_backend_response , vcl_backend_error

写:vcl_backend_response , vcl_backend_error

作用:默认为 false 。ESI进程状态(如果设置为true 必需在req.esi为true才会生效)。


beresp.do_gunzip

数据类型:bool

读:vcl_backend_response , vcl_backend_error

写:vcl_backend_response , vcl_backend_error

作用:默认为 false 。缓存前解压该对象


beresp.do_gzip

数据类型:bool

读:vcl_backend_response , vcl_backend_error

写:vcl_backend_response , vcl_backend_error

作用:默认为 false 。缓存前压缩该对象


beresp.do_stream

数据类型:bool

读:vcl_backend_response , vcl_backend_error

写:vcl_backend_response , vcl_backend_error

作用:将交付给客户端的内容全部提取并存储在存储器中(pass 模式不会被存储)。


beresp.grace

数据类型:持续时间

读:vcl_backend_response , vcl_backend_error

写:vcl_backend_response , vcl_backend_error

作用:设置当前对象缓存过期后可额外宽限时间,用于特殊请求加大缓存时间,当并发量巨大时,不易设置过大否则会堵塞缓存,一般可设置 1 m 左右,当beresp.ttl=0s时该值无效。


beresp.http

数据类型:header

读:vcl_backend_response , vcl_backend_error

写:vcl_backend_response , vcl_backend_error

作用:对应的HTTP请求header


beresp.keep

数据类型:持续时间

读:vcl_backend_response , vcl_backend_error

写:vcl_backend_response , vcl_backend_error

作用:对象缓存后带保持时间(带条件处理,条件成功使用缓存否则后端刷新数据),使用保持必需要后端服务器发送客户端“ Etag”和“Last-Modified”头信息,客户端第二次访问时就会以 “If-None-Match”和“If-Modified-Since”头信息返回“ Etag”和“Last-Modified”两个信息,varinsh会对客户端返回的“If-None-Match”和“If-Modified-Since”进行判断,如果配置成功返回保持数据,失败则取后端新数据


beresp.proto

数据类型:string

读:vcl_backend_response , vcl_backend_error

写:vcl_backend_response , vcl_backend_error

作用:响应的HTTP版本


beresp.reason

数据类型:string

读:vcl_backend_response , vcl_backend_error

写:vcl_backend_response , vcl_backend_error

作用:由服务器返回的HTTP状态信息


beresp.status

数据类型:int

读:vcl_backend_response , vcl_backend_error

写:vcl_backend_response , vcl_backend_error

作用:由服务器返回的状态码


beresp.storage_hint

数据类型:string

读:vcl_backend_response , vcl_backend_error

写:vcl_backend_response , vcl_backend_error

作用:指定保存的特定存储器


beresp.ttl

数据类型:持续时间

读:vcl_backend_response , vcl_backend_error

写:vcl_backend_response , vcl_backend_error

作用:该对象缓存的剩余时间,指定统一缓存剩余时间。


beresp.uncacheable

数据类型:bool

读:vcl_backend_response , vcl_backend_error

写:vcl_backend_response , vcl_backend_error

作用:继承bereq.uncacheable,是否不缓存


OBJ :(高速缓存对象,缓存后端响应请求内容,全部只读)

注:每个缓存对象会有 1k 误差,即varnish会少算 1k 左右的空间,所以正常设置缓存空间时不易过大,缓存对象过多时误差会使varnish占用实际空间超指定空间多倍

obj.grace

数据类型:持续时间

读:vcl_hit

作用:该对象额外宽限时间


obj.hits

数据类型:int

读:vcl_hit , vcl_deliver

作用:缓存命中次数,计数器从1开始,当对象缓存该值为1,一般可以用于判断是否有缓存,当前该值大于0时则为有缓存。


obj.http

数据类型:header

读:vcl_hit

作用:对应HTTP的header


obj.keep

数据类型:持续时间

读:vcl_hit

作用:该对象剩余保持时间


obj.proto

数据类型:string

读:vcl_hit

作用:HTTP版本


obj.reason

数据类型:string

读:vcl_hit

作用:服务器返回的HTTP状态信息


obj.status

数据类型:int

读:vcl_hit

作用:服务器返回的状态码


obj.ttl

数据类型:持续时间

读:vcl_hit

作用:该对象缓存剩余时间(秒)


obj.uncacheable

数据类型:bool

读:vcl_deliver

作用:不缓存对象


REQ :(客户端发送的请求对象)

req

数据类型:http

读:client

作用:整个HTTP请求数据结构


req.backend_hint

数据类型:backend

读:client

写:client

作用:指定请求后端节点,设置后 bereq.backend 才能获取后端节点配置数据


req.can_gzip

数据类型:bool

读:client

作用:客户端是否接受GZIP传输编码。


req.esi

数据类型:bool

读:client

写:client

作用:是否启用esi处理,默认为true启用。这个变量在新版本中可能会改变,实际应用中避免使用。


req.esi_level

数据类型:int

读:client

作用:esi请求计数


req.hash_always_miss

数据类型:bool

读:vcl_recv

写:vcl_recv

作用:是否强制不命中高速缓存,如果设置为true,则高速缓存不会命中,一直会从后端获取新数据。


req.hash_ignore_busy

数据类型:bool

读:vcl_recv

写:vcl_recv

作用:忽略缓存中忙碌的对象,多台缓存时可以避免死锁。


req.http

数据类型:header

读:client

写:client

作用:对应请求HTTP的header。


req.method

数据类型:string

读:client

写:client

作用:请求类型(如 GET , POST)。


req.proto

数据类型:string

读:client

写:client

作用:客户端使用的HTTP协议版本。


req.restarts

数据类型:int

读:client

作用:重新启动次数。


req.ttl

数据类型:持续时间

读:client

写:client

作用:缓存有剩余时间。


req.url

数据类型:string

读:client

写:client

作用:请求的URL。


req.xid

数据类型:string

读:client

作用:唯一ID。


RESP :(返回给客户端的响应对象)

resp

数据类型:HTTP

读:vcl_deliver , vcl_synth

作用:整个响应HTTP数据结构。


resp.http

数据类型:header

读:vcl_deliver , vcl_synth

写:vcl_deliver , vcl_synth

作用:对应HTTP的header。


resp.proto

数据类型:string

读:vcl_deliver , vcl_synth

写:vcl_deliver , vcl_synth

作用:编辑响应的HTTP协议版本。


resp.reason

数据类型:string

读:vcl_deliver , vcl_synth

写:vcl_deliver , vcl_synth

作用:将要返回的HTTP状态信息。


resq.status

数据类型:int

读:vcl_deliver , vcl_synth

写:vcl_deliver , vcl_synth

作用:将要返回的HTTP状态码。


存储 :

storage.<name>.free_space

数据类型:bytes

读:client , backend

作用:存储可用空间(字节数)。


storage.<name>.used_space

数据类型:bytes

读:client , backend

作用:存储已经使用空间(字节数)。


storage.<name>.happy

数据类型:bool

读:client , backend

作用:存储健康状态。


特定功能性语句

内置特定功能语句,

ban(expression)

清除指定对象缓存


call(subroutine)

调用子程序,如:call(name);


hash_data(input)

生成hash键,用于自定hash键值生成结构,只能在vcl_hash子程序中使用。调用 hash_data(input) 后,即这个hash为当前页面的缓存hash键值,无需其它获取或操作,如:

sub vcl_hash{
       hash_data(client.ip);
       return(lookup);
}

注意:return(lookup); 是默认返回值,所以可以不写。


new()

创建一个vcl对象,只能在vcl_init子程序中使用。


return()

结束当前子程序,并指定继续下一步动作,如:return (ok); 每个子程序可指定的动作均有不同。


rollback()

恢复HTTP头到原来状态,已经弃用,使用 std.rollback() 代替。


synthetic(STRING)

合成器,用于自定义一个响应内容,比如当请求出错时,可以返回自定义 404 内容,而不只是默认头信息,只能在 vcl_synth 与 vcl_backend_error 子程序中使用,如:

sub vcl_synth {
    //自定义内容
    synthetic ({"
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang="zh-cn">
   <head>
   <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
      <title>error</title>
   </head>
   <body>
      <h1>Error</h1>
      <h3>这只是一个测试自定义响应异常内容</h3>
   </body>
</html>
    "});
    //只交付自定义内容
    return(deliver);
}

注意:在 vcl_synthvcl_backend_error 子程序中使用 return (deliver); 代表只发送自定义响应内容也就是synthetic(string)生成的内容;如果没有自定义内容(synthetic)使用了 return(deliver); 则返回客户端的内容为空;如果不使用返回值 return(deliver); 则同时返回自定义内容和默认生成的(sysnth(status code,reason)或后端异常)错误内容,所以在不使用 return(deliver); 时最好不要追加自定义内容,否则两块内容会同时发送到客户端,影响页面效果,自定内容会在前面。


regsub(str, regex, sub)

使用正则替换第一次出现的字符串,第一个参数为待处理字符串,第二个参数为正则表达式,第三个为替换为字符串。


regsuball(str, regex, sub)

使用正则替换所有匹配字符串。参数与regsuball相同。





你可能感兴趣的:(linux,varnish,VCL)