1

我正在尝试设置 Varnish 以处理本地环境中的 ESI 包含。

我在虚拟机中运行清漆,内容在主机上运行。

我有两个文件“index.html”和“test.html”。它们都存储在 apache 服务器的 docroot 中名为“esi”的文件夹中。

索引.html

<h1>It Works!</h1>
<esi:include src="test.html" /> 

测试.html

<p>ESI HAS BEEN INCLUDED</p>

Varnish 在虚拟机的 8000 端口上运行。所以我在这里访问它:http: //192.168.56.101 :8000/esi/

在虚拟机上的 /etc/varnish/default.vcl 中,我已将以下配置添加到文件底部:

sub vcl_fetch {
   set beresp.do_esi = true; /* Do ESI processing               */
   set beresp.ttl = 24 h;    /* Sets the TTL on the HTML above  */
}

考虑到它应该处理所有请求的 ESI(不要关心它是否只是试图让这个东西工作的不好的做法:))

我加载http://192.168.56.101:8000/esi/时的结果是:

<h1>It Works!</h1>
<esi:include src="test.html" />

IE。ESI 显示在标记中,它没有被处理。

我检查了 Varnish 日志,但是那里没有错误,也没有与 ESI 相关的内容。

谁能看到我在这里做错了什么?让我知道是否需要更多信息..谢谢

4

4 回答 4

2

对于 ESI 作品(varnish 3.x),第一个字符必须是“<”,因此只需添加 HTML 结构

这是我的测试:

索引.php

<html>
<head>
    <title></title>
</head>
<body>
<?php

    $now = new \DateTime('now');
    echo "hello world from index.php ".$now->format('Y-m-d H:i:s');
?>

<br/>

<esi:include src="/date.php"/>

<br/>

<esi:remove>
    ESI NOT AVAILABLE
</esi:remove>

<br/>

<!--esi
ESI AVAILABLE !!

-->
</body>
</html>

日期.php

<?php
$now = new \DateTime('now');
echo "hello world from date.php ".$now->format('Y-m-d H:i:s');

输出 :

hello world from index.php 2014-08-21 10:45:29
hello world from date.php 2014-08-21 10:46:35
于 2014-08-21T08:49:28.977 回答
1

Varnish 只实现了 ESI 的一小部分。从 2.1 开始,三个 ESI 声明:

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

基于变量和 cookie 的内容替换尚未实现,但已在路线图上。Varnish 不会处理 HTML 注释中的 ESI 指令。要使 ESI 工作,您需要在 VCL 中激活 ESI 处理,如下所示:

sub vcl_fetch {
if (req.url == "/index.html") {
   set beresp.do_esi = true; /* Do ESI processing               */
   set beresp.ttl = 24 h;    /* Sets the TTL on the HTML above  */
} elseif (req.url == "/test.html") {
   set beresp.ttl = 1m;      /* Sets a one minute TTL on        */
                             /*  the included object            */
}

}

于 2014-04-25T19:26:18.630 回答
1

如果您的 esi include src 是“test.html”,那么 varnish 会将该请求发送到您的默认后端,即 127.0.0.1。我相信您需要为远程服务器配置第二个后端。像这样的东西:

backend default {
    .host = "127.0.0.1";
    .port = "8000";
}

backend hostmachine {
    .host = "50.18.104.129"; # Enter your IP address here
    .port = "80";
}

然后在您的 sub vcl_recv 中,您需要将 URL 中包含 /esi/ 的流量重定向到远程服务器。

sub vcl_recv {
      if (req.url ~ "^/esi/") {
            set req.backend = hostmachine;
            set req.http.host = "www.correctdomainname.com";
      } else {
            set req.backend = default;
      }
}

我现在正在做同样的事情,所以试一试,让我知道它是否适合你。

于 2012-05-21T19:54:56.983 回答
0

确保您的配置被清漆读取。如果您在 docker 容器中运行 varnish,则可能需要重新构建它。

您可以将您的配置更改为一些荒谬的东西,看看它是否能捕捉到它。例如将后端更改为 w3.org。

如果这仍然给你相同的结果,你的配置没有被使用。

于 2019-01-04T10:20:45.797 回答