Entendendo a diretiva nginx proxy_cache_path

30

Suponha que eu tenho esse arquivo de configuração nginx

proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=myCache:8m max_size=100m inactive=1h;
  • O que keys_zone=myCache:8msignifica isso? Não há muito o que dizer nos documentos:

Além disso, todas as chaves ativas e informações sobre dados são armazenadas em uma zona de memória compartilhada, cujo nome e tamanho são configurados pelo parâmetro keys_zone.

  • E se proxy_cache_valid( 12h) for maior que o inactivevalor especificado ( 1h) em proxy_cache_path? Qual regra seguirá? por exemplo

    proxy_cache_valid 200 302 12h;
    proxy_cache_valid 404 302 1h;
    

Obrigado!

Jürgen Paul
fonte

Respostas:

39

O que significa o keys_zone = myCache: 8m?

Como a documentação disse , o nginx manterá todas as chaves ativas e as informações sobre os dados são armazenadas em uma zona de memória compartilhada, cujas namee sizesão configuradas pelo parâmetro keys_zone. Por uma questão de integridade, vamos dividir por parte

  • /var/cache/nginxé o local onde o cache real é armazenado. Dentro da pasta, o arquivo de cache era um arquivo binário, mas você pode facilmente identificar a tag html dentro dela.
  • levels=1:2 O parâmetro é levels define o número de níveis de subdiretório no cache.
  • keys_zone=myCache:8mestava definindo a zona de memória compartilhada denominada myCache com tamanho máximo de 8 MB. Ele contém todas as chaves e metadados ativos do cache. Portanto, sempre que o nginx verifica se uma página foi armazenada em cache, ele consulta primeiro a zona de memória compartilhada e, em seguida, procura o local do cache real, /var/cache/nginxse houver cache.
  • max_sizeera o tamanho máximo do cache, por exemplo, o tamanho dos arquivos /var/cache/nginx.
  • inactive=1hespecificar o tempo máximo de inatividade em cache pode ser armazenado. Os dados em cache que não são acessados ​​durante o tempo especificado pelo inactiveparâmetro são removidos do cache, independentemente de sua atualização.

Como funciona a validação e exclusão de cache

Extraído das listas de discussão nginx

  • A diretiva proxy_cache_valid especifica por quanto tempo a resposta será considerada válida (e será retornada sem nenhuma solicitação de back-end). Após esse período, a resposta será considerada "obsoleta" e não será retornada ou dependerá da configuração proxy_cache_use_stale .

  • O argumento inativo de proxy_cache_path especifica por quanto tempo a resposta será armazenada no cache após o último uso. Observe que mesmo respostas obsoletas serão consideradas usadas recentemente se houver solicitações para elas.

Pelo que entendi, aqui o pseudocódigo de como o nginx funciona

Quando o pedido chegar

if cache.exist AND (now() - cache.first_retrieved) < proxy_cache_valid:
    use it
else:
    retrieve from backend
    replace the old ones

Em outro processo, o gerenciador de cache executa essa lógica

if (now() - cache.last_used) > inactive:
    del cache

if all-cache.size > max-size:
    del *the most inactive cache* until size < max-size

E se proxy_cache_valid (12h) for maior que o valor inativo especificado (1h) no proxy_cache_path?

Desde que a solicitação e o acesso ao cache específico sejam acessados, esse objeto de cache continuará válido até 12h após o objeto ser colocado no cache. Depois disso, o cache foi considerado inválido, portanto o nginx buscará no back-end e redefinirá o timer válido. Mas se o objeto estava inativo (não acessado) por mais de uma hora - mesmo em 12h - período de cache válido -, o nginx o excluirá por causa do inactiveparâmetro.

masegaloeh
fonte
"Depois disso, o cache foi considerado inválido, então o nginx buscará no back-end e redefinirá o cronômetro válido." - isso é interessante. Então o nginx busca a solicitação mesmo que nenhum usuário a busque? Então, por exemplo, se inativo é 365de válido é 1d, o nginx buscará as solicitações no cache todos os dias durante um ano, mesmo que ninguém faça essa solicitação?
Martin Thoma
11
Boa resposta, mas não consigo encontrar nenhuma documentação sobre as unidades de medida que usamos com alguns desses parâmetros. Por exemplo, os inactiveparâmetros levam valores de tempo, mas não vejo quais valores posso usar além de h(cerca de 1 mês? Ou 1 dia? Etc). E com o que devemos especificar max_size? Bytes? Posso usar 1M por 1 megabyte?
Sunil D.
4
@SunilD. - aqui vai: nginx.org/en/docs/syntax.html
adamczi 25/03