Esse artigo se destina a documentar dois modos de monitoramento de um servidor Apache. O primeiro é baseado na aplicação Zapache, adaptada de https://github.com/lorf/zapache. Nesse caso são monitorados pelo Zabbix informações relatadas pelo serviço server-status do Apache. Os itens do server-satatus são lidos e armazenados em itens capturados por um template no zabbix. O segundo modo é um complemento ao primeiro, de forma que o Zabbix possa ler tráfego de entrada e saída de cada virtualhost hospedado em um servidor Apache. Toda configuração de scritps deve ser feita NO HOST a ser monitorado. No servidor do Zabbix basta apenas importar um template e criar itens e regras de Discovery pela interface Web.
Configurar o Zabbix para realizar leitura dos dados emitidos pelo Apache através do link http://ip_host_apache/server-status?auto
Alterar o arquivo /etc/apache2/mods-available/status.conf, adicionando a lista de IPs que têm permissão de acessar a página do server-status do apache:
<Location /server-status>
SetHandler server-status
Order deny,allow
Deny from all
Allow from 10.2.0.14 127.0.0.1 10.2.17.28 10.2.17.29 10.2.17.30
</Location>
Criar diretório /etc/zabbix/scripts/. Baixar o script zapache.sh colocá-lo dentro desse diretório e dar permissão de execução para o usuário zabbix. Alterar a variável STATUS_URL com o nome do seu servidor na rede:
Baixe o arquivo: Arquivo:Zapache.txt
mkdir /etc/zabbix/scripts/ chown -R zabbix.zabbix /etc/zabbix/scripts/ chmod +x /etc/zabbix/scripts/zapache.sh
Teste o script com o usuário do Zabbix. Lembre-se que o usuário zabbix deve ter permissão de execução no script zapache.sh.
su -c "/etc/zabbix/scripts/zapache.sh TotalAccesses" -s /bin/sh zabbix
Adicionar o UserParameter apontando para o script criado para que o servidor do zabbix possa requisitar os dados do Apache com a chave zabbixlistvhost[nome_vhost]:
Server=10.2.17.24 Hostname=kakaroto StartAgents=5 DebugLevel=4 LogFile=/var/log/zabbix-agent/zabbix_agentd.log Timeout=3 EnableRemoteCommands=1 UnsafeUserParameters=1 UserParameter=zapache[*],/etc/zabbix/scripts/zapache.sh \$1
Reinicie o zabbix_agentd.
Importar o template abaixo e vincular à máquina a ser monitorada pelo zabbix.
Alterar a forma de geração de logs de cada virtual host, adicionando na definição o formato de log abaixo:
##CRIAR LOGS ESPECIFICOS PARA ESSE HOST ErrorLog "/var/log/apache2/juris.tce.go.gov.br_error.log" CustomLog "/var/log/apache2/juris.tce.go.gov.br_access.log" common
Por exemplo, um arquivo de virtual host que passa por proxy nas portas 80 e 443 ficaria com essa definição:
##Arquivo /etc/apache2/sites-avaliable/juris.conf
<VirtualHost juris.tce.go.gov.br:80>
##NOME DO SERVICO EXTERNO "PROXIADO"
ServerAlias juris.tce.go.gov.br
ServerName juris.tce.go.gov.br
##CRIAR LOGS ESPECIFICOS PARA ESSE HOST
ErrorLog "/var/log/apache2/juris.tce.go.gov.br_error.log"
CustomLog "/var/log/apache2/juris.tce.go.gov.br_access.log" common
#INCLUIR CONFIGURACAO GERAL DE PROXY COM SSL
include include/proxy_no_ssl.conf
##FAZER PROXY DO SERVICO
ProxyPass / http://juris.tce.local/ timeout=30
ProxyPassReverse / http://juris.tce.local/ timeout=30
</VirtualHost>
<VirtualHost juris.tce.go.gov.br:443>
##NOME DO SERVICO EXTERNO "PROXIADO"
ServerName juris.tce.go.gov.br:443
ServerAdmin admin@tce.gov.br
ServerAlias juris.tce.go.gov.br
##CRIAR LOGS ESPECIFICOS PARA ESSE HOST
ErrorLog "/var/log/apache2/juris.tce.go.gov.br_error.log"
CustomLog "/var/log/apache2/juris.tce.go.gov.br_access.log" common
#INCLUIR CONFIGURACAO GERAL DE PROXY COM SSL
include include/proxy_w_ssl.conf
##FAZER PROXY DO SERVICO
ProxyPass / http://juris.tce.local/ timeout=30
ProxyPassReverse / http://juris.tce.local/ timeout=30
</VirtualHost>
groupadd zapache adduser zabbix zapache
Alterar geração de logs do apache, adicionando o grupo zapache no lugar de adm no arquivo /etc/logrotate.d/apache2
create 775 root zapache
Criar diretório /etc/zabbix/scripts/zabbixvhost/.
Criar script para que o Zabbix possa listar virtual host que tenha o formato especificado <vhost>[*]_access.log$. Esse script lista todos os virtual hosts a partir dos arquivos de log do Apache. É necessário que cada virtual host gere um arquivo de log separado no formato especificado acima. A saída desse script é uma string no formato JSON.
#!/bin/bash
##TRIBUNAL DE CONTAS DO ESTADO DE GOIAS
## AUTOR: MAURICIO BARROS DE JESUS
## ARQUIVO /etc/zabbix/scripts/zabbixvhost/zabbixlistvhost.sh
##SCRIPT PARA LEITURA DE VIRTUAL HOSTS DO APACHE2 - DEBIAN - A PARTIR DOS ARQUIVOS DE LOGS DO APACHE
##NECESSARIO QUE CADA VIRTUALHOST TENHA UM ARQUIVO DE LOG ESPECIFICO, NO FORMATO <VIRTUALHOST>TCE.GO.GOV.BR_ACCESS.LOG .
##O SCRIPT RETORNA A PRIMEIRA PARTE DO ARQUIVO DE LOG, NO CASO, <VIRTUALHOST>, QUE E O NOME DO VIRUTAL HOST.
## A SAIDA E UMA SCRINT NO FORMATO JSON PARA LEITURA EM REGRA DISCOVERY DO ZABBIX
###OBS: NECESSARIO QUE USUARIO DO ZABBIX TENHA ACESSO DE LEITURA NO DIRETORIO $LOGDIR
LOGDIR="/var/log/apache2/"
SAIDA='{"data":['
FIMSAIDA='{}]}'
for f in `ls $LOGDIR |grep '_access.log$' | awk -F "." '{print $1}'` ; do
TMP='{"{#ZABBIXVHOST}":"'$f'"},'
SAIDA=$SAIDA$TMP
done
echo $SAIDA$FIMSAIDA
Dê permissão de execução para o usuário do Zabbix. Teste o script:
su -c "/etc/zabbix/scripts/zabbixvhost/zabbixlistvhost.sh" -s /bin/sh zabbix
A saída deve ser algo como:
{"data":[{"{#ZABBIXVHOST}":"ggp2"},{"{#ZABBIXVHOST}":"helpdesk2"},{"{#ZABBIXVHOST}":"juris"},{"{#ZABBIXVHOST}":"openaudit"},{"{#ZABBIXVHOST}":"other_vhosts_access"},{"{#ZABBIXVHOST}":"sic"},{"{#ZABBIXVHOST}":"tcenet2"},{"{#ZABBIXVHOST}":"webmail"},{"{#ZABBIXVHOST}":"wiki"},{"{#ZABBIXVHOST}":"zabbix"},{}]}
Criar script que obtém a diferença total de tráfego entre duas consultas consecutivas. O script coleta o tráfego de entrada de um dado virtual host, soma esse tráfego e faz a diferença da ultima coleta feita. O valor atual de tráfego e armazenado em um arquivo local que será utilizado como base para a próxima pesquisa.
Para usar o script, basta apenas chamá-lo passando o nome do virtual host como parâmetro.
#!/bin/bash
##TRIBUNAL DE CONTAS DO ESTADO DE GOIAS
## AUTOR: MAURICIO BARROS DE JESUS
##SCRIPT QUE EXIBE A O TRAFEGO DE DADOS EM MB PARA UM VIRTUALHOST, A PARTIR DA LEITURA DO ARQUIVO DE LOG (ACCESS.LOG)
##REQUER QUE O VHOST TENHA UM ARQUIVO DE LOG SEPARADO, COM O NOME NO FORMATO <VHOST>.TCE.GO.GOV.BR_ACCESS.LOG
##NECESSARIO TER PERL INSTALADO NA MAQUINA
##PERMISSOES: usuario zbbix deve estar no grupo zapache; Grupo zapache deve ter permissao de leitura no diretorio $APACHE_LOG_DIR.
##PERMISSOES: Grupo zapache deve ter permissao de escrita nos arquivos $VFILEDATABASE e $VFILELOG
VHOST=$1
DEBUG=$2
APACHE_LOG_DIR="/var/log/apache2/"
VFILEDATABASE="/etc/zabbix/scripts/zabbixvhost/db.vzapache";
VFILELOG="/etc/zabbix/scripts/zabbixvhost/log.vzapache";
##localiza arquivo de log
LOG_FILE=`ls $APACHE_LOG_DIR |grep 'access.log$' |grep $VHOST`
if [ "$DEBUG" == "1" ]; then
echo "#####DEBUG - DESCOBRINDO ARQUIVO DE LOG####"
echo "#COMANDO EXECUTADO: ls $APACHE_LOG_DIR |grep 'access.log$' |grep $VHOST"
echo "#RESPOSTA: $LOG_FILE"
fi
##TESTA SE O ARQUIVO EXISTE. SE NAO EXISTIR, GERA UM LOG DE ERRO E RETORNA -1
if [ "$LOG_FILE" == "" ]; then
echo "-1";
echo `date +%d-%m-%Y--%H:%M:%S` " ERRO: VIRTUAL HOST COM NOME: (" $VHOST ") NAO EXISTE. " >> $VFILELOG
exit 0;
fi
#carrega atual para comparar com o gravado
ATUAL=$(echo `awk '{SUM+=$10}END{print SUM/1024/1024}' $APACHE_LOG_DIR$LOG_FILE`)
if [ "$DEBUG" == "1" ]; then
echo "#####DEBUG - DESCOBRINDO VALOR ATUAL ####"
echo '#COMANDO EXECUTADO: ATUAL=$(echo `awk {SUM+=$10}END{print SUM/1024/1024} '$APACHE_LOG_DIR$LOG_FILE'`)'
echo "#RESPOSTA: $ATUAL"
fi
#carrega valor anterior
ANTERIOR=`grep $VHOST $VFILEDATABASE | awk '{print $1}'`
if [ "$DEBUG" == "1" ]; then
echo "#####DEBUG - DESCOBRINDO VALOR ANTERIOR ####"
echo '#COMANDO EXECUTADO: ANTERIOR=`grep '$VHOST $VFILEDATABASE' | awk "'"{print $1}"'"`'
echo "#RESPOSTA: $ATUAL"
fi
#apaga a linda do VHOST no arquivo de banco de dados
sed -i '/'$VHOST'/d' $VFILEDATABASE
##atualiza arquivo de banco de dados
echo "$ATUAL $VHOST" >> $VFILEDATABASE
if [ "$DEBUG" == "1" ]; then
echo "#####DEBUG - ATUALIZA BANCO DE DADOS ####"
echo '#COMANDO EXECUTADO: echo "' $ATUAL $VHOST '" >> '$VFILEDATABASE
fi
##CALCULA DIFERENCA
num=$(perl -e "print $ATUAL - $ANTERIOR")
if [ "$DEBUG" == "1" ]; then
echo "#####DEBUG - CALCULA ####"
echo '#COMANDO EXECUTADO: ANTERIOR=`grep '$VHOST $VFILEDATABASE' | awk "'"{print $1}"'"`'
echo "#RESPOSTA: $num"
fi
#VERIFICA SE E NUMERO VALIDO E RETORNA RESULTADO
re='^[0-9]+([.][0-9]+)?$'
if [ [ $num =~ $re ] ] ; then
echo $num
else
echo "0";
echo `date +%d-%m-%Y--%H:%M:%S` " ERRO: CALCULO INCORRETO PARA VHOST: (" $VHOST "). VALOR: (" $num ") E INVALIDO . " >> $VFILELOG
fi
exit 0
Dê permissão de execução para o usuário do Zabbix. Teste o script com o comando. Na primeira execução um erro será emitido por falta de entrada no arquivo de banco de dados.
su -c "/etc/zabbix/scripts/zabbixvhost/zabbixvhost.sh ggp" -s /bin/sh zabbix
Adicionar o UserParameter apontando para o script criado para que o servidor do zabbix possa requisitar os dados do Apache com a chave zabbixvhost[nome_vhost]. Adicionar o UserParameter apontando para zabbixlistvhost.
Server=10.2.17.24 Hostname=kakaroto StartAgents=5 DebugLevel=4 LogFile=/var/log/zabbix-agent/zabbix_agentd.log Timeout=3 EnableRemoteCommands=1 UnsafeUserParameters=1 UserParameter=zapache[*],/etc/zabbix/scripts/zapache.sh \$1 UserParameter=zabbixvhost[*],/etc/zabbix/scripts/zabbixvhost/zabbixvhost.sh \$1 UserParameter=zabbixlistvhost[*],/etc/zabbix/scripts/zabbixvhost/zabbixlistvhost.sh
Reinicie o zabbix_agentd.
Criar uma regra para que o Zabbix possa descobrir todos Vhosts em um host que têm o script zabbixlistvhost configurado. No menu Configuration→Hosts→<máquinaMonitorada>→Disvovery rules crie uma regra de descoberta chamada Zabbix_Apache_Vhost_Discovery e preencha conforme figura abaixo. Note que a Chave (Key) passada pelo Zabbix tem o mesmo nome que foi configurado no host no zabbix_agentd.conf em UserParameter.
Criar um Item Prototype para a regra de discovery. Esse item irá armazenar cada virtual host passado pelo host. Note que a chave passa como parâmetro o valor {#ZABBIXVHOST}, que tem que ter o mesmo nome passado retorno JSON do script zabbixlistvhost.