Nginx: Atualizar cache somente se o arquivo tiver sido alterado - possível?

Nginx: Atualizar cache somente se o arquivo tiver sido alterado - possível?

Estou usando o nginx como proxy reverso e para armazenamento em cache. Atualmente o cache da localização "/test" será renovado a cada 2 horas: "proxy_cache_valid 200 302 301 304 2h;"

É possível renovar o cache apenas se um arquivo for alterado?

Obrigado!

Responder1

Isso deve ser tratado genericamente para você.

Se um arquivo estiver armazenado em cache em um navegador e o navegador solicitar esse arquivo novamente, e o arquivo tiver sido eliminado do cache do servidor, o servidor ainda examinará o if-modified-sincecabeçalho da solicitação.

O servidor verificará esse valor de data e hora e, se determinar que nenhuma alteração ocorreu, o servidor enviará uma 304resposta, informando ao navegador que está tudo bem para carregar a versão em cache e que o objeto real não é servidor e foi baixado novamente.

Se o valor for alterado, o objeto será servidor e a cópia do cache será atualizada.

https://www.keycdn.com/support/if-modified-since-http-header

IMHO, o cache é algo que você realmente deve controlar com Cache-Controlcabeçalhos, em vez de configuração do servidor.

As opções de configuração do servidor existem como proteção contra falhas quando o Cache-Control não existe ou está configurado de forma ilógica.

Responder2

Presumo que estejamos falando sobre conteúdo gerado que ainda não é um arquivo estático em seu servidor web (arquivos estáticos em seu servidor web geralmente são rápidos o suficiente).

A questão principal é como você informa ao Nginx que o conteúdo em cache foi alterado.

A revalidação parece boa, mas tem o impacto de que principalmente o processo de verificação de atualizações é tão caro quanto gerá-la. Então essa não é uma opção real.

A melhor prática é limpar o conteúdo caso ele tenha sido atualizado (por exemplo, tenha sido alterado em seu CMS). Purge é o processo para invalidar objetos armazenados em cache. Nginx suporta Purge apenas na versão NginxPlus. No entanto, você pode fazer quase o mesmo recarregando o objeto em cache.

Aqui está um tutorial simples:

Configuração Nginx

...

# default location
location / {
    try_files                   $uri @php;
}

# PHP handler
location @php {
    try_files                   $uri /index.php;

    access_log                  /var/log/nginx/access.log;

    # include fastcgi_params
    include                     fastcgi_params;

    # how to connect to PHP-FPM
    fastcgi_pass                php-fpm;

    # enable caching
    fastcgi_cache               phpfpm;

    # don't look for existing cache objects with HTTP header X-Purge
    fastcgi_cache_bypass        $http_x_purge;
}

...

Curl para limpar um documento

curl https://example.com/site1/overview.jpeg -s -H "X-Purge: true"

informação relacionada