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.
Antes de mais nada, temos de instalar os pacotes necessários para a compilação do Nginx e seus modulos.
Após isso, configuramos e baixamos os códigos fontes das versões que vamos utilizar do Nginx e seus módulos.
Depois de prepararmos o terreno com o código fonte necessário, vamos compilar o Nginx.
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.
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.
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.
Iniciando a execução.
Para inicialização de nosso container, será utilizada a sequencia de comandos abaixo:
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:
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:
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.
Todos os códigos fontes, e uma imagem pronta para utilização, estão disponíveis nos seguintes links:
ngx_pagespeed - Docker file do create and build a nginx image with ng_pagepeed module compiled together.github.com
Docker file do create and build a nginx image with ng_pagepeed module compiled together. You can configure the…hub.docker.com
Mais referências em como criar as suas imagens utilizando Docker:
Dockerfile reference Docker can build images automatically by reading the instructions from a Dockerfile. A Dockerfile…docs.docker.com
docker To list available commands, either run docker with no parameters or execute docker help: $ docker Usage: docker…docs.docker.com
Caso queiram entrar em contato comigo diretamente podem enviar seus e-mails para medium@miguel.ms.
Abraços e até a próxima