2

私のサーバーでは、8080 の Apache を使用してポート 80 で Varnish (キャッシュ) を実行してい
ます。以下のようにヘッダーを設定すると、Varnish は非常にうまくキャッシュされます。

    $this->getResponse()->setHeader('Expires', '', true);
    $this->getResponse()->setHeader('Cache-Control', 'public', true);
    $this->getResponse()->setHeader('Cache-Control', 'max-age=2592000');
    $this->getResponse()->setHeader('Pragma', '', true);

しかし、これは、新しいバージョンが利用可能になったときに、新しいバージョンを取得することなく、人々が私の Web サイトをキャッシュすることを意味します。
ヘッダーを削除すると、ページがリロードされるたびに新しいバージョンが取得されます (したがって、Varnish はキャッシュされません)。

ここで何が問題なのかわかりません。
私の理想的な状況は、クライアント側で html をキャッシュせず、Varnish に任せることです。

4

3 に答える 3

1

私の理想的な状況は、クライアント側で html をキャッシュせず、Varnish に任せることです。

必要なのは、リソースをキャッシュしてクライアントに提供し、何かが変更された場合にのみ新しいバージョンを生成する varnish です。これを行う最も簡単な方法は、varnish にそれを長時間キャッシュさせ、何かが変更されたときに (PURGE コマンドを使用して) varnish のエントリを無効にすることです。

デフォルトでは、ニスはバックエンドが提供するヘッダーに基づいてキャッシュ ルールを設定します。したがって、php コードが説明したヘッダーを生成する場合、デフォルトの varnish vcl はそれに応じてキャッシュ戦略を調整します。ただし、これは一般化された安全な方法でのみ行うことができます (たとえば、Cookie を使用する場合、キャッシュは行われません)。バックエンドがどのように機能するかを知っているので、バックエンドから別のヘッダーを送信するのではなく、ニスの .vcl ファイルを作成して、ニスのキャッシュ動作を変更する必要があります。Max-Age ヘッダーの Cache-Control が欠落している場合でも、リソースを長時間キャッシュするように varnish に指示する必要があります (.vcl ファイルで TimeToLive ttl を設定します)。Varnish は、ttl が通過するかエントリを削除するまで、生成されたエントリを提供します。

これが機能している場合は、より高度なオプションがあります。リソースをクライアントにキャッシュしますが、クライアントがそれを使用するたびに「再検証」します。ブラウザーは、HTTP GET とIf-Modified-Sinceヘッダー (応答には、彼の動作を誘発するためのDateヘッダーを含める必要があります) またはIf-Matchヘッダー (応答には、彼の動作を誘発するためのETAGヘッダーを含める必要があります) を使用してこれを行います。これにより、リソース全体を再度送信することなく、 varnish が304 NOT-MODIFIED応答で応答できるため、帯域幅が節約されます。

于 2012-11-18T23:12:18.763 に答える
0

クライアント キャッシュの標準 HTTP ヘッダーを任意に設定します。Varnish のみに表示されるカスタム ヘッダーを設定しX-Varnish-TTLます。たとえば、VCL で次のコードをvcl_fetchサブルーチンに組み込みます。

if (beresp.http.X-Varnish-TTL) {
    C{
        char *ttl;
        /* first char in third param is length of header plus colon in octal */
        ttl = VRT_GetHdr(sp, HDR_BERESP, "\016X-Varnish-TTL:");
        VRT_l_beresp_ttl(sp, atoi(ttl));
    }C
    unset beresp.http.X-Varnish-TTL;  // Remove so client never sees this
}
于 2013-03-07T19:34:55.227 に答える
0

最も単純なアプローチは、max-age をより合理的な値に下げることです。現在、30 日に設定されています。15 分に設定してみてください。

$this->getResponse()->setHeader('Cache-Control', 'max-age=900');

Web キャッシングはやや複雑なトピックであり、いくつかの非常に異なるクライアントの解釈によって悪化しています。ただし、一般に、これにより Web サーバーの負荷が軽減され、新しいコンテンツが適切な時間枠で利用できるようになります。

于 2012-11-17T17:19:39.543 に答える