2017-07-30 10 views
0

私のWebアプリケーションの特定の部分をキャッシュしようとしています。ワニスのキャッシュとヘッダー

私はhttp://website.dev/pictures/:idというエンドポイントを持ち、PHPで生成された画像を返します。場合によっては、エンドポイントにクエリ文字列の幅と高さを指定して、ピクチャのディメンションを定義することができます(http://website.dev/pictures/:id?w=100&h=100)。

私は非常に長い時間これらの要求をキャッシュしたいと思います。

私はそれに新たなんだと私は複雑なものを作るにしたくないと私は非常にシンプルなVCLを試してみました:

vcl 4.0; 


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

sub vcl_recv { 
    if (req.url ~ "^/api/pictures" && req.method ~ "GET") { 
     # I heard that it was better to unset the cookies here to allow cache 
     unset req.http.cookie; 
     return (hash); 
    } 

    return (pass); 
} 

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

しかし、今、私は私の要求にすべてMISSを取得します。私は、適切なキャッシュ制御を持つために私のバックエンドからの応答を変更しようとしたヘッダ期限が切れる:私は間違ってここにいる

Response Headers: 
Accept-Ranges:bytes 
Age:0 
Cache-Control:max-age=10000, private 
Connection:keep-alive 
Content-Length:96552 
Content-Type:image/jpeg 
Date:Sun, 30 Jul 2017 16:41:58 GMT 
Expires:Fri, 01 Jan 2100 00:00:00 GMT 
Server:nginx/1.10.3 (Ubuntu) 
Via:1.1 varnish (Varnish/5.1) 
X-Cache:MISS 
X-RateLimit-Limit:60 
X-RateLimit-Remaining:57 
X-Varnish:32772 

Request Headers 
view source 
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 
Accept-Encoding:gzip, deflate 
Accept-Language:fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4,es;q=0.2 
Cache-Control:max-age=0 
Connection:keep-alive 
Cookie:_ga=xxxxxxxxxxxxx 
Host:website.dev:6081 
Upgrade-Insecure-Requests:1 
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36 

を?どのようにしてこのようなエンドポイントで要求が確実に行われ、ワニスによってのみキャッシュされるのですか?

答えて

2

Webアプリケーションが送信しているので、期待どおりにキャッシュしない理由は次のとおりです。

のCache-Control:最大エージング= 10000、プライベート

内蔵VCLロジックprevents caching in presence of Cache-Control: private

最善の行動ここにあなたのアプリケーションを修正するために、次のようになります。どちらか公共タイプでCache-Controlの使用またはそれを削除し、のみExpiresヘッダを保つために固執します。

アプリを修正するつもりがない、またはできない理由がある場合は、少しVCLを追加する必要があります。あなたのアプリは、キャッシングのために適切なExpiresヘッダを送信している間

sub vcl_backend_response { 
    if (beresp.ttl <= 0s || 
     beresp.http.Set-Cookie || 
     beresp.http.Surrogate-control ~ "no-store" || 
     (!beresp.http.Surrogate-Control && 
     beresp.http.Cache-Control ~ "no-cache|no-store") || 
     beresp.http.Vary == "*") { 
     /* 
     * Mark as "Hit-For-Pass" for the next 2 minutes 
     */ 
     set beresp.ttl = 120s; 
     set beresp.uncacheable = true; 
    } 
    return (deliver); 
} 

最後に、それはワニスによって無視されます。以下は、上記の「組み込みのVCLロジック」というのCache-Control: privateの存在下でのキャッシングを防ぐことはできませんことを確認しますCache-Controlヘッダーが優先されます。 (HTTP仕様に従って)。その値はワニスがオブジェクトをキャッシュする期間として使用されるため、注意してください。 (値はExpiresから)

関連する問題