rwd - Restart When Down [Artigo]
Projeto com foco em manter os serviços de web hosting operantes, prolongando o tempo online, mesmo em situações desfavoráveis. Feito, testado e usado apenas em servidores WHM/cPanel.
[ Hits: 2.651 ]
Por: Danillo Costa em 01/11/2018 | Blog: https://softhost.com.br/
Ao identificar que o Apache ou o MySQL não estão rodando, que o servidor esteja com o load average alto ou com alto uso de memória swap, o rwd irá reiniciar o Apache e/ou o MySQL, afim que os mantenham online. As ações são registradas em log, podendo habilitar as notificações por e-mail.
Inicialmente desenvolvido para cobrir a deficiência do monitor do WHM/cPanel. Iniciado em abril de 2011 em shell script, sendo reescrito em Python 2 em 2012, ganhou novas funcionalidades e aperfeiçoamentos até dezembro de 2014, quando não recebeu mais nenhuma modificação pela minha falta de disponibilidade, motivo pelo qual estou abrindo o código.
É mundialmente aceito e oferece uma série de ferramentas necessárias aos provedores de hospedagem web para que gerencie a infraestrutura e as contas de hospedagens. Com isso, o rwd pode vir a ser útil principalmente a esse grupo.
Esse projeto nasceu na empresa que trabalho, SoftHost. Era comum presenciar servidores inoperantes devido a travamentos ocasionados por falta de processamento ou memória RAM para a carga de trabalho que exigiam, sendo que o monitor do próprio WHM/cPanel não oferecia resiliência para este tipo de cenário. Enquanto o cliente não otimizava a carga de trabalho ou contratava mais recursos de processamento ou memória RAM, tínhamos que intervir, reiniciando o servidor até que o cliente conseguisse acesso ao servidor e o estabilizasse.
Assim nasceu um script em shell que automaticamente reiniciava apenas o Apache quando o detectava que não estava online ou quando o servidor estava sobrecarregado, evitando que o servidor travasse, já que na época as sobrecargas em 99.9% dos casos eram oriundas do serviço Apache. Depois nasceu o rwd em Python para cobrir um espectro maior de possibilidades, ainda com a finalidade de não deixar os servidores ficarem inoperantes, de forma automática.
Como o rwd funciona
A cada ciclo de 20 segundos (padrão) é realizado 3 tipos de verificação:
Swap - Por padrão, ao chegar em 50% de uso de memória swap, o Apache e o MySQL serão reiniciados.
MySQL - Se o MySQL não estiver operante, o MySQL será reiniciado.
Apache - Se o Apache não estiver operante ou o servidor esteja sobrecarregado, o Apache será reiniciado.
Existem mecanismos que impedem várias reinicializações em um curto período de tempo, em casos como alto uso de swap ou sistema sobrecarregado.
WHM/cPanel;
CentOS 6/7;
Desmarcar o Apache e o MySQL da coluna "Monitor" em "Service Manager" do WHM, para evitar conflito.
# mkdir -p /root/scripts/ 2> /dev/null
# git clone https://github.com/hellnux/rwd.git
# cd rwd
# chmod 700 rwd.py rwd.conf
# mv -f rwd /etc/rc.d/init.d/
# chmod 755 rwd
# chkconfig --add rwd
# chkconfig --level 3 rwd on
# service rwd start
O rwd já vem pronto para uso, mas pode editar o arquivo de configuração em /root/scripts/rwd/rwd.conf, bastando reiniciar o rwd para ter efeito.
Monitorar o log:
# tail -f /root/scripts/rwd/rwd.log
Iniciar o rwd:
Parar o rwd:
# service rwd stop
Reiniciar o rwd:
# service rwd restart
# service rwd stop;
# chkconfig --del rwd
# rm -f /etc/init.d/rwd
# systemctl daemon-reload 2> /dev/null
# rm -Rf /root/scripts/rwd/
Alguns detalhes sobre a programação
O rwd foi o meu primeiro e único programa escrito em Python. Tenho mais vivência em shell script pela minha natureza de sysadmin. Como não sou um programador profissional, espero que o rwd seja útil. Fiz esforço para que o código fosse 100% em Python, porém, houve dois pontos na época que o código em Python obteve performance inferior aos comandos em shell invocado por dentro do Python.
Assim, abandonei o smtplib para realizar o envio das notificações via e-mail, adotando o comando mail, e um dos métodos para verificar o Apache acabei ficando com o comando curl.