Atualizar Cache-Control max-age quando srcache retorna a resposta do cache

1

Eu configurei o Nginx para usar o srcache (junto com os módulos redis e redis2). O cache do lado do servidor funciona muito bem. Meu aplicativo responde com os cabeçalhos Expires e Cache-Control adequados, e o srcache armazenará e buscará o cache do Redis de acordo.

Gostaria que minha resposta fosse armazenada em cache por navegadores e proxies fora dos meus servidores. Os cabeçalhos Expires e Cache-Control são enviados. No entanto, o Cache-Control max-age não é atualizado automaticamente. Eu suponho que isso é porque este cabeçalho é realmente armazenado no cache. Observe as datas nessas respostas e que max-age no cabeçalho Cache-Control ainda está em 2592000 ... seu valor inicial.

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

Existe alguma maneira de corrigir este problema? Aqui está a seção relevante da minha configuração 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;
}
    
por Brad 01.07.2014 / 17:45

1 resposta

1

O valor max-age especifica um número de segundos para o qual o objeto deve ser registrado como novo. Ou seja, ele poderá ser armazenado em cache, incluindo por navegadores por tantos segundos, então você pode realmente não precisar fazer nada para Cache-Control: max-age se habilitar esse caching como seu objetivo. Mais uma preocupação é o seu cabeçalho Pragma: no-cache. Também no seu cabeçalho Cache-Control, você especifica deve-revalidar. Isso significa que os clientes ainda precisarão fazer uma solicitação, mas a solicitação incluirá um cabeçalho If-Modified-Since, e o servidor poderá enviar uma resposta 304 e não precisar enviar novamente o conteúdo. Você deve considerar se esse é o comportamento que você realmente quer.

Aqui está uma explicação decente dos vários cabeçalhos de armazenamento em cache [ link , ou você pode ir para o RFC para a palavra autoritativa, em linguagem mais formal [ link

Geralmente não há necessidade de "atualizar" o valor max-age, a menos que você saiba antecipadamente quando a próxima versão do conteúdo será gerada no servidor, e usar um valor fixo para CC: max-age é muito menos intensivo para gerar o cabeçalho do que fazer cálculos de data todas as vezes.

O cabeçalho Cache-Control tem precedência sobre o cabeçalho Expires para clientes que entendem Cache-Control (que é a maioria deles, mesmo aqueles que afirmam ser HTTP / 1.0).

Se o seu cabeçalho "Expires" estiver sendo gerado corretamente e o valor de "max-age" não for o desejado, a solução mais fácil será suprimir CC: max age em vez de corrigi-lo. ( link )

    
por 09.07.2014 / 07:50