<?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/179/</link>
<title><![CDATA[Varnish缓存更新策略调试过程[原创]]]></title> 
<author>root &lt;admin@yourname.com&gt;</author>
<category><![CDATA[Varnish]]></category>
<pubDate>Wed, 13 Jan 2010 09:48:54 +0000</pubDate> 
<guid>https://blog.liuts.com/post/179/</guid> 
<description>
<![CDATA[ 
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;由于应用要求对更新过的页面需要进行实时更新，如新记录的数据发表、修改、隐藏等操作，目前有两种方法可以实现，第一种为在应用平台结合Varnish的Purege进行处理;第二种为利用http request的header做相应的处理，比如页面的redirect/header、按F5或Ctrl+F5键都会向服务器发送不同的Cache-Control，再将非更新页配置obj.ttl=86400s(1天)，这样可以大大提高缓存的命中率。以下为采用第二种方法针对不同浏览器的测试结果。<br/><br/><strong>1） 默认配置下的浏览器响应</strong><br/><a href="https://blog.liuts.com/attachment.php?fid=59" target="_blank"><img src="https://blog.liuts.com/attachment.php?fid=59" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/>&nbsp;&nbsp;&nbsp;&nbsp;结论：在默认配置下浏览不管发送任何类型的Cache-Control，Varnish都不会对Purege进行处理。<br/><br/><strong>2） 配置Cache-Control的no-cache时的浏览器响应</strong><br/><a href="https://blog.liuts.com/attachment.php?fid=60" target="_blank"><img src="https://blog.liuts.com/attachment.php?fid=60" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/>&nbsp;&nbsp;&nbsp;&nbsp;结论：说明Firefox浏览器只有按Ctrl+F5时才会发送no-cache的Cache-Control，IE浏览器认为服务器端的redirect的重定向就是一个no-cache，同样按Ctrl+F5也如此。比较奇怪的就是Chrome浏览器即使按Ctrl+F5后同样没有向服务器端发送no-cache，后来查了资料，得知google为了更好的利用本地cache，将Ctrl+F5的功能屏蔽。<br/><br/><strong>3） 配置Cache-Control的max-age=0时的浏览器响应</strong><br/><a href="https://blog.liuts.com/attachment.php?fid=61" target="_blank"><img src="https://blog.liuts.com/attachment.php?fid=61" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/>&nbsp;&nbsp;&nbsp;&nbsp;结论：通过上表数据可以得出，Firefox在redirect的情况下，它会发送一public或Private的Cache-Control给服务器端，同时IE及Chrome都会以一个max-age=0的Cache-Control的标志给服务器，此时的Chrome浏览器Ctrl+F5没有发送no-cache，而是max-age=0。<br/><br/><strong>Varnish配置文件处理块</strong><br/><div class="quote"><div class="quote-title">引用</div><div class="quote-content"><br/>if (req.http.Cache-Control ~ "(no-cache&#124;max-age=0)")&#123;<br/>&nbsp;&nbsp;purge_url(req.url); <br/>&#125;<br/></div></div><br/><strong>与原配置(squid)命中率对比</strong><br/><a href="https://blog.liuts.com/attachment.php?fid=58" target="_blank"><img src="https://blog.liuts.com/attachment.php?fid=58" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/>squid命中率<br/><a href="https://blog.liuts.com/attachment.php?fid=57" target="_blank"><img src="https://blog.liuts.com/attachment.php?fid=57" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/>Varnish命中率<br/><br/>如大家有什么疑问或感兴趣的话题可以通过weibo与我交流：<a href="http://t.qq.com/yorkoliu" target="_blank">http://t.qq.com/yorkoliu</a><br/>Tags - <a href="https://blog.liuts.com/tags/varnish/" rel="tag">varnish</a> , <a href="https://blog.liuts.com/tags/%25E5%258F%258D%25E5%2590%2591%25E4%25BB%25A3%25E7%2590%2586/" rel="tag">反向代理</a> , <a href="https://blog.liuts.com/tags/%25E7%25BC%2593%25E5%25AD%2598/" rel="tag">缓存</a>
]]>
</description>
</item><item>
<link>https://blog.liuts.com/post/176/</link>
<title><![CDATA[配置调优IIS6+gzip+varnish-2.0.6[原创]]]></title> 
<author>root &lt;admin@yourname.com&gt;</author>
<category><![CDATA[Varnish]]></category>
<pubDate>Fri, 25 Dec 2009 15:20:24 +0000</pubDate> 
<guid>https://blog.liuts.com/post/176/</guid> 
<description>
<![CDATA[ 
	<strong>一、启用IIS6 Gzip模块</strong><br/>1.1、在 "IIS 管理器" 中，打开 "网站 > 属性" 对话框，切换到 "服务" 页卡，选中压缩应用程序文件(社区页面不做静态文件的压缩)压缩选项。<a href="https://blog.liuts.com/attachment.php?fid=40" target="_blank"><img src="https://blog.liuts.com/attachment.php?fid=40" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/><br/>1.2、新增一个服务扩展，路径为 "c:&#92;windows&#92;System32&#92;inetsrv&#92;gzip.dll"。添加完成后，允许该扩展使用。<br/><a href="https://blog.liuts.com/attachment.php?fid=41" target="_blank"><img src="https://blog.liuts.com/attachment.php?fid=41" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/><br/>1.3、用记事本打开 "%windir%&#92;system32&#92;inetsrv&#92;MetaBase.xml"，找到 "IIsCompressionScheme"，按下述方法修改、保存。(建议修改前先做备份)如果需要压缩动态文件，则将 HcDoDynamicCompression设置为"TRUE"，并在HcScriptFileExtensions中增加您要压缩的动态文件后缀名，如asp (由于我要优化的系统中，做了shtml->asp的URL Rewrite，所以将 shtml、asp 也加入了)。<br/>如果需要压缩静态文件，则将HcDoStaticCompression和HcDoOnDemandCompression设置为 "TRUE"，并在HcFileExtensions中增加您需要压缩的静态文件后缀名，如xml、css等。HcDynamicCompressionLevel和HcOnDemandCompLevel表示需要的压缩率，数字(0~9)越小压缩率越低。<br/><textarea name="code" class="xml" rows="15" cols="100">
<IIsCompressionScheme&nbsp;&nbsp;Location ="/LM/W3SVC/Filters/Compression/deflate"
&nbsp;&nbsp;&nbsp;&nbsp;HcCompressionDll="%windir%&#92;system32&#92;inetsrv&#92;gzip.dll"
&nbsp;&nbsp;&nbsp;&nbsp;HcCreateFlags="0"
&nbsp;&nbsp;&nbsp;&nbsp;HcDoDynamicCompression="TRUE"
&nbsp;&nbsp;&nbsp;&nbsp;HcDoOnDemandCompression="FALSE"
&nbsp;&nbsp;&nbsp;&nbsp;HcDoStaticCompression="FALSE"
&nbsp;&nbsp;&nbsp;&nbsp;HcDynamicCompressionLevel="9"
&nbsp;&nbsp;&nbsp;&nbsp;HcFileExtensions="htm
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;html
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;txt"
&nbsp;&nbsp;&nbsp;&nbsp;HcOnDemandCompLevel="10"
&nbsp;&nbsp;&nbsp;&nbsp;HcPriority="1"
&nbsp;&nbsp;&nbsp;&nbsp;HcScriptFileExtensions="asp
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;shtml"
&nbsp;&nbsp;>
</IIsCompressionScheme>
<IIsCompressionScheme&nbsp;&nbsp;Location ="/LM/W3SVC/Filters/Compression/gzip"
&nbsp;&nbsp;&nbsp;&nbsp;HcCompressionDll="%windir%&#92;system32&#92;inetsrv&#92;gzip.dll"
&nbsp;&nbsp;&nbsp;&nbsp;HcCreateFlags="1"
&nbsp;&nbsp;&nbsp;&nbsp;HcDoDynamicCompression="TRUE"
&nbsp;&nbsp;&nbsp;&nbsp;HcDoOnDemandCompression="FALSE"
&nbsp;&nbsp;&nbsp;&nbsp;HcDoStaticCompression="FALSE"
&nbsp;&nbsp;&nbsp;&nbsp;HcDynamicCompressionLevel="0"
&nbsp;&nbsp;&nbsp;&nbsp;HcFileExtensions="htm
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;html
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;txt"
&nbsp;&nbsp;&nbsp;&nbsp;HcOnDemandCompLevel="10"
&nbsp;&nbsp;&nbsp;&nbsp;HcPriority="1"
&nbsp;&nbsp;&nbsp;&nbsp;HcScriptFileExtensions="asp
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;shtml"
&nbsp;&nbsp;>
</textarea><br/>1.5、<strong>测试</strong><br/>使用HttpWatch Professional 6.0.14看看启用 GZip 后的效果。<br/><a href="https://blog.liuts.com/attachment.php?fid=47" target="_blank"><img src="https://blog.liuts.com/attachment.php?fid=47" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/><br/><strong>二、安装配置Vanish 2.0.6（最新版）</strong><br/>2.1、安装<br/>(略)<br/><br/><strong>2.2、调优sysctl.conf</strong><br/>(略)<br/><br/><strong>2.3、修改varnish配置</strong><br/>vi /usr/local/varnish/etc/vcl.conf<br/><div class="quote"><div class="quote-title">引用</div><div class="quote-content"><br/>backend wwwserver &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .host = "192.168.100.5";<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .port = "80";<br/>&#125;<br/>acl purge &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "localhost";<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "127.0.0.1";<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "192.168.0.0"/16;<br/>&#125;<br/>sub vcl_recv &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (req.request == "PURGE") &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!client.ip ~ purge) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; error 405 "Not allowed.";<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lookup;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#125;<br/>if (req.http.host ~ "^(cache.sina.com.cn)") &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set req.backend = wwwserver;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (req.request != "GET" && req.request != "HEAD") &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pipe;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lookup;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; error 404 "sina.com.cn.cn cache server";<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lookup;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#125;<br/>&#125;<br/>sub vcl_hit &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (req.request == "PURGE") &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set obj.ttl = 0s;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; error 200 "Purged.";<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#125;<br/>&#125;<br/>sub vcl_miss &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (req.request == "PURGE") &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; error 404 "Not in cache.";<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#125;<br/>&#125;<br/>sub vcl_fetch &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (req.request == "GET" && req.url ~ "&#92;.(txt&#124;js)$") &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set obj.ttl = 3600s;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set obj.ttl = 300s;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#125;<br/>&#125;<br/>sub vcl_deliver &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (obj.hits > 0) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set resp.http.X-Cache = "HIT";<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125; else &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set resp.http.X-Cache = "MISS";<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&#125;<br/></div></div><br/><br/><strong>2.4命中率分析</strong><br/><a href="https://blog.liuts.com/attachment.php?fid=42" target="_blank"><img src="https://blog.liuts.com/attachment.php?fid=42" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/><br/><strong>2.5、现象分析</strong><br/>1) <strong>名词解释</strong><br/>Cache hits：缓存命中<br/>Cache hits for pass：从背端服务器获取数据但无法被缓存<br/>Cache misses：非命中<br/>2) <strong>分析</strong><br/>发现缓存结果数据比较奇怪的现象，不能缓存的对象还比命中的对象多得多，非命中数在正常值内。<br/>3）<strong>排查过程</strong><br/>3.1、CURL命令测试，如curl -I http://www.sina.com.cn/index.shtml -H Accept-Encoding:gzip,defalte<br/><a href="https://blog.liuts.com/attachment.php?fid=43" target="_blank"><img src="https://blog.liuts.com/attachment.php?fid=43" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/><br/><strong>结果分析</strong>：发现每次response header中set Cookie都不一样,如此varnish会认为每次请求的都是不同对象，这一点跟squid有区别，squid会直接忽略cookie的判断。同样可以从X-cache：MISS中看到该对象没有被命中及不被Cache Hit。Content-Encoding:gzip，说明varnish已经支持了http1.1，成功将backend server 的gzip结果返回给客户端。<br/><br/>3.2、<strong>删除Varnish cookie请求</strong><br/><div class="quote"><div class="quote-title">引用</div><div class="quote-content"><br/>sub vcl_fetch &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; remove obj.http.Set-Cookie;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (req.request == "GET" && req.url ~ "&#92;.(txt&#124;js)$") &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set obj.ttl = 3600s;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set obj.ttl = 300s;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#125;<br/>&#125;<br/></div></div><br/>3.3、<strong>继续测试</strong><br/><a href="https://blog.liuts.com/attachment.php?fid=44" target="_blank"><img src="https://blog.liuts.com/attachment.php?fid=44" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/>[图1]<br/><br/><a href="https://blog.liuts.com/attachment.php?fid=45" target="_blank"><img src="https://blog.liuts.com/attachment.php?fid=45" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/>[图2]<br/><br/><strong>结果分析</strong>:上图1为第一次请求URL，Vanish返回结果中可以看出没有被命中，属正常。图2为第二次请求同一URL，发现此次已经被HIT了。另两次response.head已经没有response cookie了，问题解决。<br/>再看看Varnish缓存状态：<br/><a href="https://blog.liuts.com/attachment.php?fid=46" target="_blank"><img src="https://blog.liuts.com/attachment.php?fid=46" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/><br/><strong>结果分析</strong>:结果已正常，Cache hits for pass已经没有了，命中率还是比较理想的。<br/><br/><span style="color: #FF0000;">注</span>：Varnish2.x版本后的语法、启动方式、优化项等与1.x相差有较大的差异，在以后实战中慢慢去体会到吧。<br/>Tags - <a href="https://blog.liuts.com/tags/varnish/" rel="tag">varnish</a> , <a href="https://blog.liuts.com/tags/gzip/" rel="tag">gzip</a>
]]>
</description>
</item><item>
<link>https://blog.liuts.com/post/66/</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/66/</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>
</channel>
</rss>