<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[运维进行时]]></title> 
<link>https://blog.liuts.com/index.php</link> 
<description><![CDATA[互联网运维与架构]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[运维进行时]]></copyright>
<item>
<link>https://blog.liuts.com/post//</link>
<title><![CDATA[学习了一下varnish[转]]]></title> 
<author>root &lt;admin@yourname.com&gt;</author>
<category><![CDATA[Varnish]]></category>
<pubDate>Tue, 21 Aug 2007 15:45:21 +0000</pubDate> 
<guid>https://blog.liuts.com/post//</guid> 
<description>
<![CDATA[ 
	man page意译如下：<br/><br/>VCL语法比较简单，和C类似，if()&#123;&#125;的形式，=和==的区别，!、&&和&#124;&#124;等等。但&#92;符号没有特别的意思。<br/>VCL里除了用==、!、&&、&#124;&#124;做逻辑判断意外，还可以用~来表示与正则表达式或ACL的匹配。<br/>VCL其实只是配置，并不是真正的编程语言，没有循环，没有自定义变量。<br/><br/>声明Backend<br/>backend 名称 &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;set backend.host = "域名";<br/>&nbsp;&nbsp;&nbsp;&nbsp;set backend.port = "端口";<br/>&#125;<br/>比如backend www &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;set backend.host = "www.example.com";<br/>&nbsp;&nbsp;&nbsp;&nbsp;set backend.port = "http";<br/>&#125;&nbsp;&nbsp; <br/>声明的Backend可以用在判断请求针对哪个后端服务器<br/>if (req.http.host ~ "^(www.)?example.com$") &#123;<br/>&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;set req.backend = www;<br/>&#125;<br/><br/>声明ACL<br/>acl 名称 &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "IP";<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "IP子网"/反掩码位数;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ! "IP或IP子网"/反掩码位数;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#125;<br/>比如<br/>acl local &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "locahost";&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* myself */<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "10.0.0.1"/8;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* and everyone on the local network */<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ! "10.0.0.23";&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* except for the dialin router */<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#125;<br/>判断ACL也很简单<br/>if (client.ip ~ local) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;pipe;<br/>&#125;<br/><br/>还可以定义子程序<br/>sub pipe_if_local &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;if (client.ip ~ local) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pipe;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&#125;<br/>用call来调用<br/>call pipe_if_local;<br/><br/>内置的例程<br/>vcl_recv<br/>有请求到达后成功接收并分析时被调用，一般以以下几个关键字结束。<br/>error code [reason]&nbsp;&nbsp;返回code给客户端，并放弃处理该请求<br/>pass&nbsp;&nbsp;&nbsp;&nbsp;进入pass模式，把控制权交给vcl_pass<br/>pipe&nbsp;&nbsp;&nbsp;&nbsp;进入pipe模式，把控制权交给vcl_pipe<br/>lookup&nbsp;&nbsp;在缓存里查找被请求的对象，根据查找结果把控制权交给vcl_hit或vcl_miss<br/><br/>vcl_pipe<br/>进入pipe模式时被调用。请求被直接发送到backend，后端和客户端之间的后继数据不进行处理，只是简单传递，直到一方关闭连接。一般以以下几个关键字结束。<br/>error code [reason]<br/>pipe<br/><br/>vcl_pass<br/>进入pass模式时被调用。请求被送到后端，后端应答数据送给客户端，但不进入缓存。同一连接的后继请求正常处理。一般以以下几个关键字结束。<br/>error code [reason]<br/>pass<br/><br/>vcl_hash<br/>目前不使用<br/><br/>vcl_hit<br/>在lookup以后如果在cache中找到请求的内容事调用。一般以以下几个关键字结束。<br/>error code [reason]<br/>pass<br/>deliver&nbsp;&nbsp;将找到的内容发送给客户端，把控制权交给vcl_deliver.<br/><br/>vcl_miss<br/>lookup后但没有找到缓存内容时调用，可以用于判断是否需要从后端服务器取内容。一般以以下几个关键字结束。<br/>error code [reason]<br/>pass<br/>fetch&nbsp;&nbsp;从后端取得请求的内容，把控制权交给vcl_fetch.<br/><br/><br/>vcl_fetch<br/>从后端取得内容后调用。一般以以下几个关键字结束。<br/>error code [reason]<br/>pass<br/>insert&nbsp;&nbsp;将取到的内容插入缓存，然后发送给客户端，把控制权交给vcl_deliver<br/><br/><br/>vcl_deliver<br/>缓存内容发动给客户端前调用。一般以以下几个关键字结束。<br/>error code [reason]<br/>deliver&nbsp;&nbsp;内容发送给客户端<br/><br/>vcl_timeout<br/>在缓存内容到期前调用。一般以以下几个关键字结束。<br/>fetch&nbsp;&nbsp;从后端取得该内容<br/>discard&nbsp;&nbsp;丢弃该内容<br/><br/> <br/><br/>vcl_discard<br/>由于到期或者空间不足而丢弃缓存内容时调用。一般以以下几个关键字结束。<br/>discard&nbsp;&nbsp;丢弃<br/>keep&nbsp;&nbsp;继续保留在缓存里<br/><br/>如果这些内置例程没有被定义，则执行缺省动作<br/><br/><br/>一些内置的变量<br/>now&nbsp;&nbsp;当前时间，标准时间点（1970？）到现在的秒数<br/><br/>backend.host&nbsp;&nbsp;后端的IP或主机名<br/>backend.port&nbsp;&nbsp;后端的服务名或端口<br/><br/>请求到达后有效的变量<br/>client.ip&nbsp;&nbsp;客户端IP<br/>server.ip&nbsp;&nbsp;服务端IP<br/>req.request&nbsp;&nbsp;请求类型，比如GET或者HEAD或者POST<br/>req.url&nbsp;&nbsp;请求的URL<br/>req.proto&nbsp;&nbsp;请求的HTTP版本号<br/>req.backend&nbsp;&nbsp;请求对应的后端<br/>req.http.header&nbsp;&nbsp;对应的HTTP头<br/><br/>往后段的请求时有效的变量<br/>bereq.request&nbsp;&nbsp;比如GET或HEAD<br/>bereq.url&nbsp;&nbsp;URL<br/>bereq.proto&nbsp;&nbsp;协议版本<br/>bereq.http.header&nbsp;&nbsp;HTTP头<br/><br/>从cache或后端取到内容后有效的变量<br/>obj.proto&nbsp;&nbsp;HTTP协议版本<br/>obj.status&nbsp;&nbsp;HTTP状态代码<br/>obj.response&nbsp;&nbsp;HTTP状态信息<br/>obj.valid&nbsp;&nbsp;是否有效的HTTP应答<br/>obj.cacheable&nbsp;&nbsp;是否可以缓存的内容，也就是说如果HTTP返回是200、203、300、301、302、404、410并且有非0的生存期，则为可缓存<br/>obj.ttl&nbsp;&nbsp;生存期，秒<br/>obj.lastuse&nbsp;&nbsp;上一次请求到现在间隔秒数<br/><br/>对客户端应答时有效的变量<br/>resp.proto&nbsp;&nbsp;response的HTTP版本<br/>resp.status&nbsp;&nbsp;回给客户端的HTTP状态代码<br/>resp.response&nbsp;&nbsp;回给客户端的HTTP状态信息<br/>resp.http.header&nbsp;&nbsp;HTTP头<br/><br/><br/>变量可以通过set来赋值或通过remove来删除（清空）<br/>sub vcl_recv &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;if (req.http.host ~ "^(www.)?example.com$") &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set req.http.host = "www.example.com";<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&#125;<br/><br/>sub vcl_fetch &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; remove obj.http.Set-Cookie;<br/>&#125;
]]>
</description>
</item><item>
<link>https://blog.liuts.com/post//#blogcomment</link>
<title><![CDATA[[评论] 学习了一下varnish[转]]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>https://blog.liuts.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>