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:
- Parte 1: Utilizando cache em uma CDN
- Parte 2: Invalidação de cache e adicionando bypass
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:
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