4

私は Varnish Cache を初めて使用するので、質問があります。助けていただければ幸いです。

私は非常にシンプルで基本的な設定をしていますが、何らかの理由で理解できるように機能していません。

これは、Cookie を使用している PHP ページを Varnish がキャッシュしないことに関連しています。

これが私のセットアップです:

1) 私の default.vcl には単純なバックエンドがあります

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

2) 次の 2 行のみを含む単純な PHP ファイルがあります。

session_start();
echo time();

3) このページを呼び出すと、必要な vcl ルールを追加していないため、正しくキャッシュされません。

4)

したがって、ドキュメントの私の理解に従って、これら2つのルールを追加します

sub vcl_recv {
unset req.http.Cookie;
return (lookup);
}

sub vcl_fetch {
unset beresp.http.Set-Cookie;
return(deliver);
}

5) PHP ページはまだキャッシュされません。Set-CookieFireFox で FireBug を使用しているため、ヘッダーが削除されていることがわかります。

PHP がキャッシュするのは、これをサブ vcl_fetch に追加した場合のみです。

set beresp.ttl = 24h;

私の質問は、これは正しいですか?

バックエンド応答の ttl を変更する必要があるとは思いませんでした。Cookie の設定を解除するだけで、セッション付きの PHP が強制的にキャッシュされると思いました。

私の完全なデフォルトのvclは次のとおりです。

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

sub vcl_recv {
unset req.http.Cookie;
return (lookup);
}

sub vcl_fetch {
unset beresp.http.Set-Cookie;
set beresp.ttl = 24h;
return(deliver);
}

私の起動コマンドは次のとおりです。

varnishd -f /etc/varnish/default.vcl -s malloc,128M -T 127.0.0.1:2000 -a 0.0.0.0:8080

私が呼び出している URL は次のとおりです。

http://vbox.local:8080/varnish-tests/index.php

私のindex.phpファイルには次のものしかありません:

<?php 
session_start();
echo time();

これが正しいように見えるか、それとも間違っているかをコミュニティに尋ねたいと思います。基本的に、最終的にページキャッシュをニスに入れるために beresp.ttl = 24h を追加しなければならなかった理由がわかりません。

これはいらないなと思いました。

どんなアドバイスでも大歓迎です。

ありがとうございました!

敬具。

4

5 に答える 5

5

Varnish は、応答のキャッシュ ヘッダーに従います。PHP はデフォルトで応答をキャッシュしないキャッシュ制御ヘッダーを送信します。

Cache-Control:no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma:no-cache

これらのヘッダーを無効にする必要があります。そうしないと、Varnish が従うため、ページがキャッシュされません。それらをオフにするには、空の文字列で session_cache_limiter() を呼び出すだけです

session_cache_limiter('');
header("Cache-Control: public, s-maxage=60");
session_start();

その後、キャッシュ コントロールを public に設定するヘッダーを追加できます。上記の 3 行を使用すると、キャッシュが有効になります。

于 2012-10-30T15:19:46.797 に答える
4

ZoFreXが言ったように、それはおそらくCache-ControlまたはExpiresヘッダーが原因です。

また、このルールは少し危険であることに注意してください:

sub vcl_recv {
    unset req.http.Cookie;
    return (lookup);
}
sub vcl_fetch {
    unset beresp.http.Set-Cookie;
    return(deliver);
}

サーバーがCookieを送信する場合、それはおそらく、少なくともセッションではCookieが必要なためです。この種のルールは、アプリケーションサーバーのセッション管理を完全に無効にします。

セッションを使用する理由によっては、コンテンツのすべての部分をキャッシュすることはできません(例:ユーザー固有のコンテンツ)。

于 2012-01-13T11:33:58.310 に答える
1

PHPがVarnishに送信しているヘッダーを注意深く確認する必要があります(たとえば、varnishdを介してではなく、サーバーに直接アクセスすることによって)。ヘッダーにコンテンツをキャッシュできないと記載されている場合、キャッシュされません。キャッシュできると言われなければ、キャッシュされないでしょう。ヘッダーに「expires」や「max-age」がないため、手動でttlを設定した場合にのみ、Varnishがキャッシュするのはこのためだと思います。 "。

于 2011-05-20T08:30:28.650 に答える
1

varnish によってキャッシュされた応答を取得する最も簡単な方法は、cache-control ヘッダーを追加することです。

php:

header('Cache-Control: public, s-maxage=60');

varnish に応答を 60 秒間キャッシュするように指示します。

于 2011-11-30T17:25:14.470 に答える
0

私はまったく同じ問題を抱えていました。session_start を実行すると、ページが潜在的に動的であることを PHP が認識し、キャッシュ制御ヘッダーを次のようにリセットするように見えます。

Cache-Control:no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma:no-cache

Varnish のデフォルト設定は、apache/php によって送信されるこれらのキャッシュ ディレクティブに従います。つまり、これらのページはキャッシュされません。デフォルトの構成をオーバーライドして拡張できるかどうかも 100% 確信が持てません。

私が使用してきた回避策は、Cache-Control ヘッダーを再設定することですが、これは session_start がそれらを変更した後に行う必要があることに注意してください。session_write_close の後にも必要かどうかをテストしていませんが、申し訳ありませんが安全です。

于 2012-10-24T09:12:11.887 に答える