web-dev-qa-db-ja.com

キャッシュの更新-srcacheがキャッシュから応答を返すときにmax-ageを制御します

Srcacheを使用するようにNginxを構成しました(redisおよびredis2モジュールとともに)。サーバー側のキャッシュはうまく機能します。私のアプリケーションは適切なExpiresおよびCache-Controlヘッダーで応答し、それに応じてsrcacheはRedisキャッシュを保存およびフェッチします。

サーバーの外部のブラウザーやプロキシで応答をキャッシュできるようにしたいと思います。 ExpiresおよびCache-Controlヘッダーが送信されます。ただし、Cache-Controlmax-ageは自動的に更新されません。これは、このヘッダーが実際にキャッシュに保存されているためだと思います。これらの応答の日付に注意してください。また、max-ageヘッダーのCache-Controlはまだ2592000...の初期値のままです。

HTTP/1.1 200 OK
Server: nginx/1.2.9
Date: Tue, 01 Jul 2014 15:18:19 GMT
Content-Type: application/javascript
Content-Length: 2710
Connection: keep-alive
Vary: Accept-Encoding
Expires: Thu, 31 Jul 2014 15:13:00 GMT
Cache-Control: public, max-age=2592000, must-revalidate, proxy-revalidate
X-SRCache-Key: fde32bfe93fcf90c398e9ed585991146
X-SRCache-Fetch-Status: HIT
X-SRCache-Store-Status: BYPASS


HTTP/1.1 200 OK
Server: nginx/1.2.9
Date: Tue, 01 Jul 2014 15:22:13 GMT
Content-Type: application/javascript
Content-Length: 2710
Connection: keep-alive
Vary: Accept-Encoding
Expires: Thu, 31 Jul 2014 15:13:00 GMT
Cache-Control: public, max-age=2592000, must-revalidate, proxy-revalidate
X-SRCache-Key: fde32bfe93fcf90c398e9ed585991146
X-SRCache-Fetch-Status: HIT
X-SRCache-Store-Status: BYPASS

この問題を修正する方法はありますか?これが私のNginx構成の関連セクションです:

location / {
    # Caching keys
    set_md5 $srcache_key $request_uri; 

    srcache_ignore_content_encoding on;
    srcache_methods GET;
    srcache_fetch GET /redisFetch $srcache_key;
    srcache_store PUT /redisStore key=$srcache_key&exptime=$srcache_expire;

    add_header X-SRCache-Key $srcache_key;
    add_header X-SRCache-Fetch-Status $srcache_fetch_status;
    add_header X-SRCache-Store-Status $srcache_store_status;
    add_header X-SRCache-Expire $srcache_expire;

    include /apps/*/nginx/api.conf;
}

location = /redisFetch {
    internal;

    set $redis_key $args;
    redis_pass redis_cache;
}

location = /redisStore {
    internal;

    redis2_query set $arg_key $echo_request_body;
    redis2_query expire $arg_key $arg_exptime;
    redis2_pass redis_cache;
}
1
Brad

Max-age値は、オブジェクトをフレッシュと見なす秒数を指定します。つまり、この数秒間、ブラウザを含めてキャッシュ可能になるため、キャッシュを有効にすることが目標の場合は、Cache-Control:max-ageに対して実際に何もする必要がない場合があります。さらに心配なのは、プラグマ:キャッシュなしヘッダーです。また、Cache-Controlヘッダーで、must-revalidateを指定します。つまり、クライアントは通常もリクエストを行う必要がありますが、リクエストにはIf-Modified-Sinceヘッダーが含まれ、サーバーは304応答を送信するだけで、コンテンツを再送信する必要はありません。これが本当に必要な動作であるかどうかを検討する必要があります。

さまざまなキャッシュヘッダーの適切な説明があります[ http://www.mobify.com/blog/beginners-guide-to-http-cache-headers/] 、またはRFCにアクセスできます権威あるWordの場合、より正式な言語で[ http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html]

コンテンツの次のバージョンがサーバー側でいつ生成されるかを事前に知っていない限り、通常、max-age値を「更新」する必要はほとんどなく、CC:max-ageに固定値を使用する方がはるかに集中的ではありません。毎回日付計算を行うよりもヘッダーを生成します。

Cache-Controlヘッダーは、Cache-Controlを理解しているクライアント(HTTP/1.0であると主張しているクライアントも含め、ほとんどのクライアント)のExpiresヘッダーよりも優先されます。

Expiresヘッダーが正しく生成されていて、max-age値が希望どおりでない場合、最も簡単な解決策は、CC: max ageを修正するのではなく抑制することです。 ( http://wiki.nginx.org/HttpHeadersMoreModule

1
mc0e