====== Monitoramento Apache com Zabbix ====== ===== Introdução ===== 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|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|http://ip_host_apache/server-status?auto]] ===== Alterar permissão para leitura do server-status ===== 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: 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 ===== Importar script ===== 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 ===== Alterar zabbix_agentd.conf ===== Adicionar o **[[infraestrutura_de_ti:zabbix: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 template ===== Importar o template abaixo e vincular à máquina a ser monitorada pelo zabbix. [[:index.php:Arquivo:Templatezapache|Arquivo:Templatezapache.zip]] \\ ====== Monitoramento de Virtual Host ====== ===== Alterar formato de log do apache para cada virtual host[editar] ===== 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 ##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 ##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 \\ ===== Criar grupo para o usuário do Zabbix ===== 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 script ZabbixListVhost ===== Criar diretório **/etc/zabbix/scripts/zabbixvhost/**. Criar script para que o Zabbix possa listar virtual host que tenha o formato especificado %%[*%%]_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 TCE.GO.GOV.BR_ACCESS.LOG . ##O SCRIPT RETORNA A PRIMEIRA PARTE DO ARQUIVO DE LOG, NO CASO, , 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 zabbixvhost.sh ===== 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 .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 ===== Alterar zabbix_agentd.conf===== Adicionar o **[[infraestrutura_de_ti:zabbix: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 **[[infraestrutura_de_ti:zabbix: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**. ===== Configurar Zabbix para coleta dos dados do virtual host ===== ==== Criar Regra de descoberta para virtual host ==== 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->->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 **[[infraestrutura_de_ti:zabbix:UserParameter]]**. \\ {{ :zabbix:zabbix_apache_vhost_item_prototype.png |}} 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**. {{ :zabbix:zabbix_apache_vhost_discovery.png |}}