
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:
- Cliente -> Nginx (MISS) -> Upstream200(Controle de cache: sem cache)
- Cliente -> Nginx (MISS) -> Upstream200(Controle de cache: sem cache)
- Cliente -> Nginx (MISS) -> Upstream200(Controle de cache: sem cache)
- Cliente -> Nginx (MISS) -> Upstream503(Controle de cache: idade máxima = 10)
- Cliente -> Nginx (HIT,503, Idade: 3)
- Cliente -> Nginx (HIT,503, Idade: 8)
- Cliente -> Nginx (STALE,503, Idade: 13) ->GBA montante200 (Controle de cache: sem cache)
- Cliente -> Nginx (STALE,503, Idade: 18) ->GBA montante200 (Controle de cache: sem cache)
- Cliente -> Nginx (STALE,503, Idade: 23) ->GBA montante200 (Controle de cache: sem cache)
- ... 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-error
estale-while-revalidate
extensõ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-error
estale-while-revalidate
por 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_bypass
no Nginx. (Uma área um pouco cinzenta, a ordem de execução seria importante para as diretivas da fase de conteúdo)