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);
常用的动作:
abandon 放弃处理,并生成一个错误。
deliver 交付处理
fetch 从后端取出响应对象
hash 哈希缓存处理
lookup 查找缓存对象
ok 继续执行
pass 进入pass非缓存模式
pipe 进入pipe非缓存模式
purge 清除缓存对象,构建响应
restart 重新开始
retry 重试后端处理
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_synth 与 vcl_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相同。
转载于:https://blog.51cto.com/php2012web/1680580
linux下varnish4配置语法(基础)相关推荐
- Linux下Makefile编写语法
原创 Linux下Makefile编写语法 2016-07-29 08:31:53 Datrilla 阅读数 1386更多 分类专栏: Linux Makefile 版权声明:本文为博主原创文章,遵循 ...
- linux下dhcp配置(一)
LINUX下DHCP配置(一) 挂载 mkdir –p /mnt/cdrom mount /dev/cdrom /mnt/cdrom cd /mnt/cdrom/Server ll dhcp* 安装 ...
- (转)yi_meng linux 下 ifcfg-eth0 配置 以及ifconfig、ifup、ifdown区别
linux 下 ifcfg-eth0 配置 以及ifconfig.ifup.ifdown区别 原文:https://www.cnblogs.com/yi-meng/p/3214471.html 这3个 ...
- Docker Linux下安装配置及启动
Docker Linux下安装配置及启动 linux配置环境 基础下载镜像: wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliy ...
- 关于Linux下C语言开发基础的实验内容。
Linux下C语言开发基础实验内容 目录 1.Linux下C语言开发流程 2.vi,vim编辑器的使用 3.Gcc编译器的使用 总体选项: 警告选项: 4.GDB 基本命令的使用 5.Make 工程管 ...
- 手把手教你Linux下基于ITK开发基础(1)
手把手教你Linux下基于ITK开发基础(1) *requirement: requirement version git 2.17.1 g++ Ubuntu 7.5.0-3 ubuntu1~18.0 ...
- Linux下Mysql数据库的基础操作
Linux下Mysql数据库的基础操作 一.Mysql数据介绍 二.数据库相关术语介绍 1.数据库相关名词 2.相关术语介绍 三.Mysql数据库的管理 1.创建数据库用户 2.查询用户状态 3.修改 ...
- linux下SVN配置笔记(转)
linux下SVN配置笔记 李群林 转载了 皋军 的博文 [查看原文][转载时间:2012-09-20 10:40] 关键字: linux下svn配置笔记 一.安装SVN默认安装到/usr/lo ...
- Linux下VNC配置多个桌面和修改密码 不会当系统重启vnc失效
1:vncserver 2:iptables -I INPUT -p tcp --dport 5901 -j ACCEPT 客户端方式 3:iptables -I INPUT -p tcp --d ...
最新文章
- 皮一皮:这年头,没看过火影还没法做医生了...
- kafka系列三、Kafka三款监控工具比较
- swiper用loop不出图片_swiper实现双向控制
- 浅学JavaScript
- 访问页面要看什么数据包_股市看盘,我们要看什么?
- 集训队脱单大法:这是一道只能由学姐我自己出数据的水题(牛客竞赛)
- Android官方开发文档Training系列课程中文版:通知用户之创建不同导航方式的Activity
- gevent开始学习-第一步
- mysql jpa缓存,如何在Spring Data JPA CRUDRepository中添加缓存功能
- 基因学:大数据的大希望
- STL之Ranges区间讨论
- 在线office编辑 iWebOffice系列的交互操作
- 测量图上点位平面位置\高程中误差怎么计算?
- 英特尔显卡不支持自定义分辨率N卡解决办法
- mysql netbeans_关于netbeans与mysql连接问题
- 浙江省高校计算机等级考试二级Python 程序设计题0|2023备考
- unity游戏入门1
- Cesium加载各种互联网地图(一)
- 智慧城市的互联网云脑架构,7种城市神经反射弧的建设是重点
- Android仿支付宝咻一咻动画
热门文章
- 目标检测--吴恩达深度学习记录
- VS2015配置opencv教程(图文详解)
- 光流 | 基于Lukas-Kanade光流法的目标跟踪(附C++代码)
- Matlab | Matlab从入门到放弃(5)——矩阵与format
- Matlab | MATLAB实现图像的水印去除
- mysql 创建端口号_MySQL命令行 不同端口登录 执行SQL文件 创建用户 赋予权限 修改root密码...
- linux 配置DNS正反区域,Linux基础服务_DNS原理以及正反向DNS配置
- java 监控usb端口插拔_如何监控某种类型的USB设备的插拔?
- javascript精要(3)-动态加载脚本
- 【CV】基于OpenCV的手掌检测和手指计数