Rodando NG_PageSpeed & Nginx utilizando Docker

Onde trabalho, surgiu uma necessidade de melhorarmos a experiência de usuário na utilização de nosso site de ecommerce.

Para isso, teríamos de diminuir o tamanho dos recursos e o tempo de carregamento do usuário para as nossas páginas.

Depois de explorarmos algumas alternativas sem sucesso, verificamos que para a nossa necessidade, o melhor a fazer seria a utilização de proxy reverso para tal tarefa.

Decidimos por utilizar como proxy reverso o NGINX, pois já utilizamos para outras soluções, então aliamos a sua performance ao nosso conhecimento. Já para a compressão e melhoria dos recursos disponibilizados pelo site, elencamos o módulo ng_pagespeed desenvolvido pelo Google.

Mas o grande problema da implementação de novas tecnologias é como vamos fazer para que um desenvolvedor, consiga em seu próprio desktop, replicar o que o proxy reverso aplica no site; visando este desafio, lançamos mão do Docker.

Abaixo explicarei como criamos o Dockerfile que cria a imagem em questão.

Como base de nossa imagem de nosso container utilizaremos a debian:jessie.

Código 1

Antes de mais nada, temos de instalar os pacotes necessários para a compilação do Nginx e seus modulos.

Código 2

Após isso, configuramos e baixamos os códigos fontes das versões que vamos utilizar do Nginx e seus módulos.

Código 3

Depois de prepararmos o terreno com o código fonte necessário, vamos compilar o Nginx.

Código 4

Esta parte do processo é demorada, já que aqui ele vai compilar o Nginx e todos os seus módulos dentro dele.

Agora temos a responsabilidade de diminuir o tamanho da imagem para os usuários.

Código 5

Até agora estamos apenas preparando o nosso Nginx para ser executado com os módulos que precisamos, nos falta configurar tudo que compilamos.

O próximo passo é implementar as variáveis de ambiente, que serão responsáveis pelas configurações dinâmicas de nosso container.

Código 6

Vale lembrar que, o container que estamos fazendo, deve ser reiniciado toda a vez que uma variável de ambiente for alterada.

Temos então de copiar de fato as nossas configurações para dentro do container e vamos aproveitar para também configurar os logs de saída para que sejam apresentados nos outputs corretos do container.

Código 7

Iniciando a execução.

Para inicialização de nosso container, será utilizada a sequencia de comandos abaixo:

Código 8

Notem que temos várias linhas encadeadas com && no ENTRYPOINT, estas linhas são para reescrever o arquivo nginx.conf, por mais que o Nginx tenha suporte parcial a variáveis de ambiente, com o comando $VARIAVEL_from_env, em alguns pontos isso não será possível.

Então, para padronização, vamos utilizar o comando sed da seguinte forma:

sed -i 's/%%TROCAR%%/'"$VARIAVEL_AMBIENTE"'/g' arquivo.ext

O arquivo nginx.conf que será utilizado, contem o seguinte código fonte:

Conteúdo do arquivo nginx.conf

Para os que conhecem um pouco de Docker, devem questionar porque utilizei ENTRYPOINT e não CMD.

Assim, quem utilizar a imagem pode colocar os seus próprios comandos sem interferir no funcionamento do Nginx

Finalizando, expomos a porta 80 para que o container seja acessível pelo host.

Assim ficou o arquivo Dockerfile completo:

Conteúdo completo do Dockerfile que criamos.

Agora para criarmos a imagem só nos basta o comando:

docker build -f Dockerfile -t ngx_pagespeed:latest .

Após a criação da imagem, será possível rodar o container executando o seguinte comando:

docker run -it --name ngx_pagespeed -p 8080:80 ngx_pagespeed

Agora, para aplicar configurações diferentes das padrões em seu container, faça da seguinte forma:

docker run -it -p 8080:80 \
-e "NGX_LOGLEVEL=info" \
-e "NPS_ENABLED=off" \
ngx_pagespeed

Espero que esse post os ajude a criar suas próprias imagens utilizando o módulo pagespeed ou até mesmo outros módulos do Nginx.