nginx armazena em cache respostas maiores que max-age

1

Configurei o Nginx para armazenar em cache todas as respostas de um servidor upstream que sempre retorna Cache-Control: public, max-age=1 , mas o nginx parece armazenar a resposta em cache por 2 segundos. Como vem?

Mais especificamente, meu servidor upstream é um aplicativo Express.js (nó) simples que retorna a hora atual:

  app.get('/', function (req, res) {
    res.setHeader('Cache-Control', 'public, max-age=1');
    res.send((new Date()).toISOString());
  });

E esta é a configuração nginx relevante:

http {
  proxy_cache_path /data levels=1:2 keys_zone=zuul:10m max_size=10g;
...
  server {
      location / {
          proxy_cache zuul;
          proxy_pass http://zuul;
          proxy_cache_use_stale updating;
          proxy_cache_background_update on;
      }
      listen 0.0.0.0:80 default_server;
  }
}

Em seguida, enrolo http://localhost em um loop e espero ver a resposta (contendo o registro de data e hora como node.js a vê) mudar a cada segundo. Em vez disso, muda a cada dois segundos. É como se o Nginx não estivesse disposto a armazenar as respostas em cache por menos de dois segundos, não respeitando o max-age retornado pelo desenvolvedor.

Como posso convencer o Nginx a armazenar respostas em cache?

    
por Assaf Lavie 22.10.2017 / 14:10

2 respostas

0

Provavelmente, a proxy_cache_use_stale atualização, combinada com proxy_cache_background_update . A documentação diz

proxy_cache_use_stale

Determines in which cases a stale cached response can be used during communication with the proxied server.

The updating parameter permits using a stale cached response if it is currently being updated. This allows minimizing the number of accesses to proxied servers when updating cached data.

proxy_cache_background_update

Permite iniciar uma sub-requisição de segundo plano para atualizar um item de cache expirado, enquanto uma resposta obsoleta armazenada em cache é retornada ao cliente. Observe que é necessário permitir o uso de uma resposta armazenada em cache quando ela está sendo atualizada.

Parece que está fazendo exatamente o que você mandou fazer.

Solução possível

O que eu suspeito que você quer é

proxy_cache_use_stale off;
proxy_cache_background_update off;
    
por 22.10.2017 / 19:44
0

Aviso de isenção

Isso pode não ser uma solução para o problema de OPs. Eu encontrei este tópico ao procurar uma resposta para a pergunta exata que está no título (é alto nos resultados de pesquisa do Google). Estou postando esta resposta porque alguém pode achar útil depois de encontrar este tópico como eu.

Resposta

No meu caso, encontrei diretivas definidas para

proxy_cache_valid 200 302 30m;
proxy_ignore_headers Set-Cookie X-Accel-Expires Expires Cache-Control;

e o nginx não estava respeitando max-age no cabeçalho Cache-Control e tudo foi armazenado em cache por meia hora. Essas diretivas estavam "ocultas" no arquivo nginx.conf em vez da configuração do vhost, portanto, verifique também esse local. Eu removi Cache-Control da segunda diretiva e tudo está em cache corretamente agora.

    
por 04.11.2017 / 16:19

Tags