2015-12-01 2 views
10

Я настроил Symfony и FOSHttpCacheBundle (следуя инструкциям по настройке лака в FOSHttpCache documentation).Как сделать кеширование с помощью FOSHttpCacheBundle и Varnish?

я добавил действие в мой контроллер, который добавляет test тег в заголовке ответа HTTP:

<?php 

use FOS\HttpCacheBundle\Configuration\Tag; 

class MyController extends Controller 
{ 
    /** 
    * @Route("/test1", name="acme_my_test1") 
    * @Tag("test") 
    */ 
    public function test1Action() 
    { 
     return new Response(rand(0, 1000)); 
    } 
} 

Однако всякий раз, когда я называю /test1 URL, изменяется количество, показывая кэш не активен. Обратите внимание, что мое приложение не использует cookie, и я могу проверить, что заголовок X-Cache-Tags отправляется в Varnish (который отбрасывает его в ответ на браузер, благодаря директиве vlc_deliver).

Есть ли что-нибудь, что я бы пропустил в конфигурации? Оба Varnish и Nginx работают на одном сервере.

Вот конфигурация связана с кэшем HTTP в моем файле Symfony config.yml:

framework: 
    trusted_hosts: ~ 
    trusted_proxies: [127.0.0.1] 

fos_http_cache: 
    proxy_client: 
     varnish: 
      servers: 127.0.0.1:80 
      base_url: mywebsite.localhost.com 
    tags: 
     enabled: true 

И конфигурация Varnish в /etc/varnish/default.vcl:

vcl 4.0; 

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

acl invalidators { 
    "localhost"; 
} 

sub vcl_recv { 
    if (req.http.X-Forwarded-Proto == "https") { 
     set req.http.X-Forwarded-Port = "443"; 
    } else { 
     set req.http.X-Forwarded-Port = "80"; 
    } 

    set req.http.Surrogate-Capability = "abc=ESI/1.0"; 

    if (req.method == "PURGE") { 
     if (!client.ip ~ invalidators) { 
      return (synth(405, "Not allowed")); 
     } 
     return (purge); 
    } 

    if (req.http.Cache-Control ~ "no-cache" && client.ip ~ invalidators) { 
     set req.hash_always_miss = true; 
    } 

    if (req.method == "BAN") { 
     if (!client.ip ~ invalidators) { 
      return (synth(405, "Not allowed")); 
     } 

     if (req.http.X-Cache-Tags) { 
      ban("obj.http.X-Host ~ " + req.http.X-Host 
       + " && obj.http.X-Url ~ " + req.http.X-Url 
       + " && obj.http.content-type ~ " + req.http.X-Content-Type 
       + " && obj.http.X-Cache-Tags ~ " + req.http.X-Cache-Tags 
      ); 
     } else { 
      ban("obj.http.X-Host ~ " + req.http.X-Host 
       + " && obj.http.X-Url ~ " + req.http.X-Url 
       + " && obj.http.content-type ~ " + req.http.X-Content-Type 
      ); 
     } 

     return (synth(200, "Banned")); 
    } 
} 

sub vcl_backend_response { 
    set beresp.http.X-Url = bereq.url; 
    set beresp.http.X-Host = bereq.http.host; 

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

sub vcl_deliver { 
    if (!resp.http.X-Cache-Debug) { 
     unset resp.http.X-Url; 
     unset resp.http.X-Host; 
     unset resp.http.X-Cache-Tags; 
    } 
} 

ответ

5

Ok, я нашел его. Все было в порядке в моей конфигурации, за исключением того, что мне пришлось добавить некоторые заголовки истечения. Я думал, что заголовок тегов был достаточно, но необходим слишком длинный заголовок срока действия.

Действие должно выглядеть так, то:

<?php 

use FOS\HttpCacheBundle\Configuration\Tag; 
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Cache; 

class MyController extends Controller 
{ 
    /** 
    * @Route("/test1", name="acme_my_test1") 
    * @Tag("test") 
    * @Cache(expires="+1 year") 
    */ 
    public function test1Action() 
    { 
     return new Response(rand(0, 1000)); 
    } 
} 

У меня еще есть небольшая проблема с ESI-теги и теги, но это выходит за рамки этого вопроса.

Смежные вопросы