内容包含ESI

varnish可以通过组装不同的页面来创建页面,这个叫做页面片,然后组合成一个页面。这些页面片可以有自己单独的缓存策略。如果你有一个网站展示了5个最流行的文章列表,那么这个列表可以被缓存为页面片,并且可以在其他页面中引入。

使用合适的策略可以提高命中率,降低服务器负载。

在varnish中目前仅仅是实现了ESI的一部分。在2.1版本中,我们已经有三个ESI语句:

esi:include
esi:remove
<!--esi ...-->

基于变量和cookie的内容替换没有实现,但是已经在开发计划之中。

varnish将不会处理在html注释中的ESI说明。

esi:include示例

让我们来看一个如何使用的例子。这个简单的cgi脚本会输出日期:

#!/bin/sh

echo 'Content-type: text/html'
echo ''
date "+%Y-%m-%d %H:%M"

现在,我们有一个含有ESI语句的html文件:

<HTML>
<BODY>
The time is: <esi:include src="/cgi-bin/date.cgi"/>
at this very moment.
</BODY>
</HTML>

为了让它支持esi,你需要先在vcl中激活esi处理:

sub vcl_backend_response {
    if (bereq.url == "/test.html") {
       set beresp.do_esi = true; // Do ESI processing
       set beresp.ttl = 24 h;    // Sets the TTL on the HTML above
    } elseif (bereq.url == "/cgi-bin/date.cgi") {
       set beresp.ttl = 1m;      // Sets a one minute TTL on
                                 // the included object
    }
}

esi:remove和<!--esi ... -->示例

<esi:remove><!--esi...-->可以用来呈现适当的内容,不管ESI是否可用。例如当ESI可用时可以包含内容。如果不支持就链接到相应的地址。在处理的过程中如果页面已经被处理,ESI处理器会移除起始的<!--esi和结尾的-->。如果页面没有被处理过的话,他就会保持原状,成为一个HTML/XML注释标签。ESI处理器将会移除<esi:remove>标签和里面包含的内容,当页面没有被处理过时,允许你只显示内容。例如:

<esi:remove>
  <a href="http://www.example.com/LICENSE">The license</a>
</esi:remove>
<!--esi
<p>The full text of the license:</p>
<esi:include src="http://example.com/LICENSE" />
-->

对json或者其他非xml的内容使用ESI

请注意,varnish将会查看包含的内容。如果它不是以<开头的话,varnish将会认为你不是真的想将它包含进来,所以会忽略它。当然你也可以通过设置esi_syntax参数来修改这个行为。(具体查看ref:ref-varnishd)

results matching ""

    No results matching ""