NGINX: Utilizando cache em uma CDN [Parte 1]

Laís Lima
4 min readJul 2, 2022

Em uma CDN você faz a intermediação entre o servidor de origem e o client(browser ou outro servidor), em uma plataforma de vídeos como o Globoplay tem muita coisa acontecendo nessa intermediação e é aí onde usamos o NGINX, recebemos a requisição do client, passa por alguns serviços e o NGINX faz os redirecionamentos, tratamentos e balanceamentos corretos para as suas respectivas origens.

NGINX é basicamente um web server onde você consegue servir conteúdos estáticos, distribuir, balancear requisições(load balancer), fazer proxy reverso, proxy de email e cache. Existem funcionalidades gratuitas e outras pagas, para saber mais acesse:https://docs.nginx.com

Para não ficar muito grande, vou dividir esse artigo em 2 partes:

Configurando proxy reverso

Proxy reverso é um servidor que recebe as requisições do client e redireciona para o servidor configurado.

proxy_pass: chave do domínio para onde a requisição será direcionada, se você subir seu servidor NGINX na sua máquina em http://localhost:8080, ao acessar esse endereço você será redirecionado para o endereço que está nessa chave, no exemplo abaixo você seria redirecionado para o site do google.

Configurando Cache

O cache do NGINX vai nos ajudar a previnir muitas requisições no servidor de origem armazenando sua resposta no nosso servidor atual. Veja as configurações abaixo:

Sobre algumas propriedades de configuração:

proxy_cache_path: diretório onde os arquivos de cache serão armazenados. Além disso aceita outros parâmetros de configurações como keys_zone que dá nome a essa área que também pode ser compartilhada em mais de uma location ou max_size que nos ajuda a limitar a quantidade de memória reservada para utilizarmos.

É aplicado um MD5 na nossa cache_key quando armazenados veja o exemplo abaixo:

  • Acessamos a pasta que definimos aqui no cache_path (/etc/nginx/cache)
  • Listamos os arquivos com o comando ls.
  • Vemos o que tem no arquivo com o comando cat. E vemos que ele tem o conteúdo da resposta da nossa requisição.

proxy_cache: zona da nossa área reservada para cache, seu nome é dado no parâmetro keys_zone na chave proxy_cache_path.

proxy_cache_valid: configura tempo de cache para status codes. No nosso exemplo configuramos o cache para durar 10 segundos quando o status code da resposta do nosso servidor de origem for 200.

proxy_cache_use_stale: as vezes o nosso servidor de origem pode ficar indisponível e responder algum erro, quando isso acontecer ao invés de retornarmos um erro para o nosso client caso haja alguma resposta armazenada em cache, podemos retornar isso ao usuário sem quebrar a resposta retornando um erro. No caso do nosso exemplo o servidor retornará a resposta do cache caso o servidor de origem responda timeout, 500, 502, 503 ou 504.

add_header: Adicionamos o header X-Cache-Status que retorna o status do cache com relação a nossa requisição.

  • HIT: Resposta veio do cache.
  • MISS: A resposta veio do servidor de origem.
  • EXPIRED: O cache foi expirado e foi feita uma chamada no servidor de origem.
  • BYPASS: A resposta veio do servidor de origem devido a uma regra configurada na chave proxy_cache_bypass.

Veja no gif abaixo como o header X-Cache-Status funciona:

análise dos headers de acordo com a resposta do cache

Finalizando

Essa é uma configuração básica para que você possa começar a utilizar cache com NGINX no seu projeto. Com isso você já consegue brincar com as propriedades alterando seus valores como de tempo e testando.

No próximo artigo vou abordar sobre a necessidade de invalidar um cache e como fazer bypass utilizando a propriedade proxy_cache_bypass.

Baixe aqui o projeto demo e comece a brincar! 👌

Aqui está o projeto demo que fiz para esse artigo, você pode baixar e explorar novas possibilidades.

https://github.com/lalizita/nginx-cache

Bibliografia

https://dev.to/mauricioabreu/uma-introducao-ao-nginx-1jdg

--

--