Nginx força revalidar cache obsoleto após tempo limite

Nginx força revalidar cache obsoleto após tempo limite

Há um caso de uso de cache de proxy reverso Nginx, quando;

proxy_cache_background_update on;
proxy_cache_use_stale updating;

Para o mesmo URL, se uma única resposta vier do upstream com idade máxima, quando todas as outras respostas não tiverem cache, o Nginx nunca será capaz de se recuperar dessa situação.

Imagine o cenário:

  1. Cliente -> Nginx (MISS) -> Upstream200(Controle de cache: sem cache)
  2. Cliente -> Nginx (MISS) -> Upstream200(Controle de cache: sem cache)
  3. Cliente -> Nginx (MISS) -> Upstream200(Controle de cache: sem cache)
  4. Cliente -> Nginx (MISS) -> Upstream503(Controle de cache: idade máxima = 10)
  5. Cliente -> Nginx (HIT,503, Idade: 3)
  6. Cliente -> Nginx (HIT,503, Idade: 8)
  7. Cliente -> Nginx (STALE,503, Idade: 13) ->GBA montante200 (Controle de cache: sem cache)
  8. Cliente -> Nginx (STALE,503, Idade: 18) ->GBA montante200 (Controle de cache: sem cache)
  9. Cliente -> Nginx (STALE,503, Idade: 23) ->GBA montante200 (Controle de cache: sem cache)
  10. ... O cliente vê503para a eternidade

No cenário acima, ocorreu um erro no upstream uma vez e retornou uma idade máxima (infelizmente, esse comportamento não pode ser intervencionado). Como a resposta 200 real não tem cache, ela nunca é capaz desubstituiro STALE 503 e sempre dá o erro até ser eliminado manualmente.

Não foi possível encontrar nada na web sobre esse cenário, então aqui estou perguntando. Como lidar com isso. estou usandoOpenRestyportanto, tanto os módulos Nginx Open Source quanto Lua estão acessíveis para mim.

Possíveis soluções e minha pesquisa:

  • stale-if-errore stale-while-revalidateextensões do cabeçalho Cache-Control parecem resolver esse problema. Infelizmente, os cabeçalhos upstream não estão abertos para modificação (e não há como inseri-los de maneira hackeada antes que o Nginx processe os cabeçalhos, como esperado).

  • Usando um script Lua para definir manualmente um tempo limite para caches STALE e limpar quando ele for excedido. Mas prefiro usar uma solução se o padrão/Nginx fornecer uma.

  • Adicione um segundo proxy reverso para adicionar cabeçalhos stale-if-errore stale-while-revalidatepor padrão (prefiro deixar o problema existir, em vez de fazer isso).

  • Use Lua para controlar a idade do cache, defina uma variável como verdadeira se for excedida e use-a proxy_cache_bypassno Nginx. (Uma área um pouco cinzenta, a ordem de execução seria importante para as diretivas da fase de conteúdo)

informação relacionada