varnish配置主要分为:后端配置,ACL配置,probes配置,directors配置,核心子程序配置几大块。其中后端配置是必要的,在多台服务器中还会用到directors配置,核心子程序配置。
后端配置:即给varnish添加反代服务器节点,最少配置一个。
ACL配置:即给varnish添加访问控制列表,可以指定这些列表访问或禁止访问。
probes配置:即给varnish添加探测后端服务器是否正常的规则,方便切换或禁止对应后端服务器。
directors配置:即给varnish添加负载均衡模式管理多个后端服务器。
核心子程序配置:即给varnish添加后端服务器切换,请求缓存,访问控制,错误处理等规则。
varnish基本语法 http://php2012web.blog.51cto.com/5585213/1680580
varnish中内置子程序有:
注:varnish内置子程序均有自己限定的返回动作 return (动作); 不同的动作将调用对应下一个子程序。
vcl_recv
开始处理请求,通过 return (动作); 选择varnish处理模式,默认进入hash缓存模式(即return(hash);),缓存时间为配置项default_ttl(默认为 120秒)过期保持时间default_grace(默认为10秒)。该子程序一般用于模式选择,请求对象缓存及信息修改,后端节点修改,终止请求等操作。
可操作对象:(部分或全部值)
读:client,server,req,storage
写:client,req
返回值:
synth(status code,reason); 定义响应内容。
pass 进入pass模式,并进入vcl_pass子程序。
pipe 进入pipe模式,并进入vcl_pipe子程序。
hash 进入hash缓存模式,并进入vcl_hash子程序,默认返回值。
purge 清除缓存等数据,子程序先从vcl_hash再到vcl_purge。
vcl_pipe
pipe模式处理,该模式主要用于直接取后端响应内容返回客户端,可定义响应内容返回客户端。该子程序一般用于需要及时且不作处理的后端信息,取出后端响应内容后直接交付到客户端不进入vcl_deliver子程序处理。
可操作对象:(部分或全部值)
读:client,server,bereq,req,storage
写:client,bereq,req
返回值:
synth(status code,reason); 定义响应内容。
pipe 继续pipe模式,进入后端vcl_backend_fetch子程序,默认返回值。
vcl_pass
pass模式处理,该模式类似hash缓存模式,仅不做缓存处理。
可操作对象:(部分或全部值)
读:client,server,req,storage
写:client,req
返回值:
synth(status code,reason); 定义响应内容。
fetch 继续pass模式,进入后端vcl_backend_fetch子程序,默认返回值。
vcl_hit
hash缓存模式时存在hash缓存时调用,用于缓存处理,可放弃或修改缓存。
可操作对象:(部分或全部值)
读:client,server,obj,req,storage
写:client,req
返回值:
restart 重启请求。
deliver 交付缓存内容,进入vcl_deliver子程序处理,默认返回值。
synth(status code,reason); 定义响应内容。
vcl_miss
hash缓存模式时不存在hash缓存时调用,用于判断性的选择进入后端取响应内容,可以修改为pass模式。
可操作对象:(部分或全部值)
读:client,server,req,storage
写:client,req
返回值:
restart 重启请求。
synth(status code,reason); 定义响应内容。
pass 切换到pass模式,进入vcl_pass子程序。
fetch 正常取后端内容再缓存,进入vcl_backend_fetch子程序,默认返回值。
vcl_hash
hash缓存模式,生成hash值作为缓存查找键名提取缓存内容,主要用于缓存hash键值处理,可使用hash_data(string) 指定键值组成结构,可在同一个页面通过IP或cookie生成不同的缓存键值。
可操作对象:(部分或全部值)
读:client,server,req,storage
写:client,req
返回值:
lookup 查找缓存对象,存在缓存进入vcl_hit子程序,不存在缓存进入vcl_miss子程序,当使用了purge清理模式时会进入vcl_purge子程序,默认返回值。
vcl_purge
清理模式,当查找到对应的缓存时清除并调用,用于请求方法清除缓存,并报告。
可操作对象:(部分或全部值)
读:client,server,req,storage
写:client,req
返回值:
synth(status code,reason); 定义响应内容。
restart 重启请求。
vcl_deliver
客户端交付子程序,在vcl_backend_response子程序后调用(非pipe模式),或vcl_hit子程序后调用,可用于追加响应头信息,cookie等内容。
可操作对象:(部分或全部值)
读:client,server,req,resp,obj,storage
写:client,req,resp
返回值:
deliver 正常交付后端或缓存响应内容,默认返回值。
restart 重启请求。
vcl_backend_fetch
发送后端请求之前调用,可用于改变请求地址或其它信息,或放弃请求。
可操作对象:(部分或全部值)
读:server,bereq,storage
写:bereq
返回值:
fetch 正常发送请求到到后端取出响应内容,进入vcl_backend_response子程序,默认返回值。
abandon 放弃后端请求,并生成一个错误,进入vcl_backend_error子程序。
vcl_backend_response
后端响应后调用,可用于修改缓存时间及缓存相关信息。
可操作对象:(部分或全部值)
读:server,bereq,beresp,storage
写:bereq,beresp
返回值:
deliver 正常交付后端响应内容,进入vcl_deliver子程序,默认返回值。
abandon 放弃后端请求,并生成一个错误,进入vcl_backend_error子程序。
retry 重试后端请求,重试计数器加1,当超过配置中max_retries值时会报错并进入vcl_backend_error子程序。
vcl_backend_error
后端处理失败调用,异常页面展示效果处理,可自定义错误响应内容,或修改beresp.status与beresp.http.Location重定向等。
可操作对象:(部分或全部值)
读:server,bereq,beresp,storage
写:bereq,beresp
返回值:
deliver 只交付 sysnthetic(string) 自定义内容,默认返回后端异常标准错误内容。
retry 重试后端请求,重试计数器加1,当超过配置中max_retries值时会报错并进入vcl_backend_error子程序。
vcl_synth
自定义响应内容。可以通过synthetic()和返回值 synth 调用,这里可以自定义异常显示内容,也可以修改resp.status与resp.http.Location重定向。
可操作对象:(部分或全部值)
读:client,server,req,resp,storage
写:req,resp
返回值:
deliver 只交付 sysnthetic(string) 自定义内容,默认返回 sysnth 异常指定状态码与错误内容。
restart 重启请求。
vcl_init
加载vcl时最先调用,用于初始化VMODs,该子程序不参与请求处理,仅在vcl加载时调用一次。
可操作对象:(部分或全部值)
读:server
写:无
返回值:
ok 正常返回,进入vcl_recv子程序,默认返回值。
vcl_fini
卸载当前vcl配置时调用,用于清理VMODs,该子程序不参与请求处理,仅在vcl正常丢弃后调用。
可操作对象:(部分或全部值)
读:server
写:无
返回值:
ok 正常返回,本次vcl将释放,默认返回值。
以下是个人画的一个子程序调用流程图,通过大部分子程序的return返回值进入下一步行动,用于参考,如有不当还请指出:(restart,retry未包含)