Monitoramento Apache com Zabbix

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.

Monitoramento de recursos do Apache

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.

Arquivo:Templatezapache.zip


Monitoramento de Virtual Host

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.

  • pres/gerti/infraestrutura_de_ti/zabbix/monitorando_apache_com_zabbix.txt
  • Última modificação: 16/06/2016 11:35
  • por mbjesus