Лак без обработки ESI включает

Я пытаюсь настроить Varnish для обработки включений ESI в локальной среде.

Я запускаю лак на виртуальной машине, а контент работает на хост-машине.

У меня есть два файла "index.html" и "test.html". Оба они хранятся в папке с именем «esi» в корневом каталоге документа сервера Apache.

index.html

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

test.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" />

т.е. ESI отображается в разметке, не обрабатывается.

Я проверил журнал Varnish, однако там нет ошибок и ничего, связанного с ESI.

Может ли кто-нибудь увидеть, что я делаю неправильно здесь? Дайте мне знать, если потребуется дополнительная информация .. спасибо


person cowls    schedule 10.04.2012    source источник
comment
Вы используете Varnish › 3.0? Поскольку вы используете новый синтаксис...   -  person ivy    schedule 10.04.2012


Ответы (4)


Если ваш esi include src имеет значение «test.html», тогда лак будет отправлять этот запрос на ваш сервер по умолчанию, то есть 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 вам нужно перенаправить трафик с /esi/ в URL-адресе на удаленный сервер.

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

Я сейчас работаю над тем же, поэтому попробуйте и дайте мне знать, если это сработает для вас.

person Kevin Audleman    schedule 21.05.2012
comment
Как тот или иной ответ является ответом? OP (и я) хочет включить что-то с того же сервера, и даже несмотря на то, что sub vcl_fetch содержит set beresp.do_esi = true; лак, он не удосуживается сделать запрос на включение в бэкэнд и просто сбрасывает тег esi в ответ. Это отображается высоко в Google, но я не понимаю, как тот или иной ответ на самом деле является ответом. - person HMR; 24.06.2014

Для работы ESI (лак 3.x) первым символом должен быть "‹", поэтому просто добавьте структуру HTML.

Вот мой тест:

index.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
person bastien    schedule 21.08.2014

Varnish реализовал только небольшое подмножество ESI. Начиная с версии 2.1 три заявления ESI:

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

Замена контента на основе переменных и файлов cookie не реализована, но находится в дорожной карте. Varnish не будет обрабатывать инструкции ESI в комментариях HTML. Для работы ESI необходимо активировать обработку ESI в VCL, например:

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            */
}

}

person Kev    schedule 25.04.2014

Убедитесь, что ваш конфиг читается лаком. Если вы используете лак в док-контейнере, возможно, вам придется его пересобрать.

Вы можете изменить свой конфиг на что-то смешное и посмотреть, поймает ли он его. Например, измените серверную часть на w3.org.

Если это по-прежнему дает вам тот же результат, ваша конфигурация не используется.

person Gunslinger    schedule 04.01.2019