2015-12-01 2 views
10

私はSymfonyとFOSHttpCacheBundleを設定しました(FOSHttpCache documentationのワニス設定の指示に従います)。FOSHttpCacheBundleとVarnishでキャッシュタグを使用するにはどうすればよいですか?

Iは、応答HTTPヘッダーにtestタグを追加するコントローラにアクションを追加:

<?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)); 
    } 
} 

Iは、数変化、/test1 URLを呼び出すたびしかし、キャッシュを示すことは有効ではありません。 私のアプリケーションはクッキーを使用しておらず、X-Cache-Tagsヘッダーがワニスに送られていることをテストすることができます(これは、vlc_deliver指示のおかげで、ブラウザーへの応答でそれを取り除きます)。

設定に欠けていたことはありますか? VarnishとNginxは同じサーバー上で動作します。 /etc/varnish/default.vcl

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 

ワニス構成:ここで

は私のSymfony config.ymlファイルにHTTPキャッシュに関連する構成である

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タグとタグで少し問題があるが、それはこの質問の範囲外です。

関連する問題