Symfony2, Varnish и ESI ведут к странному поведению - PullRequest
4 голосов
/ 12 декабря 2011

У меня есть следующая конфигурация:

varnish (80) <-> nginx (8080) <-> php-fpm (9000)

(То же поведение при использовании Apache с mod_php) Моя конфигурация Varnish:

backend default {
    .host = "127.0.0.1";
    .port = "8080";
    .connect_timeout = 600s;
    .first_byte_timeout = 600s;
    .between_bytes_timeout = 600s;
}

sub vcl_recv {
    set req.http.Surrogate-Capability = "abc=ESI/1.0";
}


sub vcl_fetch {    
    if (beresp.http.Surrogate-Control ~ "ESI/1.0") {
        unset beresp.http.Surrogate-Control;
        set beresp.do_esi = true;
    }
}

sub vcl_deliver {
    if (obj.hits > 0) {
        set resp.http.X-Varnish-Cache = "HIT Varnish (" +obj.hits+ ")";
    } else {
        set resp.http.X-Varnish-Cache = "MISS";
    }
}

ESI включен в app/config/config.yml.В symfony я настроил следующие маршруты:

  • /esiouter с s-maxage 60 и включил esi-include для /esiinner (используя «простой» esi-tag или функцию рендеринга веток с {'standalone': true}): <esi:include src="/esiinner" />
  • /esiinner с s-maxage 10 (извлечено esi-include)

Теперь, когда я включаю AppCache в web/app.php, Symfony оцениваетТеги ESI, так что лак не получает их, и у нас есть заголовок Content-Length, а содержимое не разбивается на части.Если я отключаю AppCache, лак оценивает теги ESI и отправляет содержимое по частям, а заголовок Content-Length отсутствует.

Почему Varnish отправляет ответ по частям и не буферизует блоки esi и не отправляет страницув целом?Если я использую Varnish перед моим Symfony-Application с ESI, должен ли я использовать Symfonys AppCache?

1 Ответ

3 голосов
/ 03 мая 2013

Если у вас есть программный кэш-шлюз / обратный прокси-сервер (например, Varnish), вам не нужно включать AppCache (это обратный прокси-сервер Symfony2, написанный на PHP).

Разрешение AppCache может привести к нестабильному поведению, поскольку у вас будет 2 обратных прокси.

...