Servidor Perfeito · 8 min read · Dec 02, 2025

Estendendo o Servidor Perfeito - Debian Squeeze [ISPConfig 3] - Página 4

9. Estatísticas a qualquer momento com awstats

Nesta seção, você pode aplicar uma modificação que permitirá que você atualize o awstats a qualquer momento que desejar, ou (usando cron) em intervalos de tempo mais frequentes. Antes de prosseguir, devemos mudar o formato de log padrão para o awstats. No Debian Squeeze, o formato padrão é 4, mas precisamos do 1. Então, você pode editar o arquivo /etc/awstats/awstats.conf ou o arquivo /etc/awstats/awstats.conf.local. Eu prefiro o segundo, porque me permitirá acompanhar as atualizações:

nano /etc/awstats/awstats.conf.local

e adicionar a linha: LogFormat=1

Depois disso, o arquivo deve parecer com:

# Você pode sobrescrever as diretivas de configuração aqui.  
# Isso é particularmente útil para usuários com várias configurações para  
# diferentes servidores virtuais, que desejam reutilizar parâmetros comuns.  
# Além disso, este arquivo não é atualizado com cada novo lançamento upstream.  
LogFormat=1

Agora temos que copiar o cron diário padrão do ISPConfig e editá-lo … na verdade, temos que editá-lo MUITO (novo nome do arquivo: mycron.php). Basicamente, temos que cortar muitas linhas e manter apenas algumas delas. Faça:

cp /usr/local/ispconfig/server/cron_daily.php /root/scripts/mycron.php
chmod 700 /root/scripts/mycron.php
nano /root/scripts/mycron.php

e cole todas as linhas a seguir:

uses('ini_parser,file,services,getconf');  
  
#######################################################################################################  
// Criar estatísticas do awstats  
#######################################################################################################  
  
$sql = "SELECT domain_id, domain, document_root FROM web_domain WHERE stats_type = 'awstats' AND server_id = ".$conf['server_id'];  
$records = $app->db->queryAllRecords($sql);  
$web_config = $app->getconf->get_server_config($conf['server_id'], 'web');  
foreach($records as $rec) {  
        $logfile = escapeshellcmd($rec['document_root'].'/log/access.log');  
        $domain = escapeshellcmd($rec['domain']);  
        $statsdir = escapeshellcmd($rec['document_root'].'/web/stats');  
        $awstats_pl = $web_config['awstats_pl'];  
        $awstats_buildstaticpages_pl = $web_config['awstats_buildstaticpages_pl'];  
        $awstats_conf_dir = $web_config['awstats_conf_dir'];  
        $awstats_website_conf_file = $web_config['awstats_conf_dir'].'/awstats.'.$domain.'.conf';  
        if(is_file($awstats_website_conf_file)) unlink($awstats_website_conf_file);  
        if(!is_file($awstats_website_conf_file)) {  
                $awstats_conf_file_content = 'Include "'.$awstats_conf_dir.'/awstats.conf"  
                LogFile="/var/log/ispconfig/httpd/'.$domain.'/access.log"  
                SiteDomain="'.$domain.'"  
                HostAliases="www.'.$domain.' localhost 127.0.0.1"';  
                file_put_contents($awstats_website_conf_file,$awstats_conf_file_content);  
        }  
 if(!@is_dir($statsdir)) mkdir($statsdir);  
  
        // awstats_buildstaticpages.pl -update -config=mydomain.com -lang=en -dir=/var/www/domain.com/web/stats -awstatsprog=/path/to/awstats.pl  
        $command = "$awstats_buildstaticpages_pl -update -config='$domain' -lang=en -dir='$statsdir' -awstatsprog='$awstats_pl'";  
  
        if($awstats_pl != '' && $awstats_buildstaticpages_pl != '' && fileowner($awstats_pl) == 0 && fileowner($awstats_buildstaticpages_pl) == 0) {  
                exec($command);  
                rename($rec['document_root'].'/web/stats/awstats.'.$domain.'.html',$rec['document_root'].'/web/stats/index.html');  
                $app->log('Criadas estatísticas do awstats com o comando: '.$command,LOGLEVEL_DEBUG);  
        } else {  
                $app->log("Nenhuma estatística do awstats criada. Ou $awstats_pl ou $awstats_buildstaticpages_pl não é propriedade do usuário root.",LOGLEVEL_WARN);  
        }  
  
}  
  
die("finalizado.\n");  
?>  

Este script é um corte do arquivo cron padrão do ISPConfig e se aplica até o ISPConfig 3.0.3. É feito por Till Brehm, e nós o editamos, para que o procedimento de atualização NÃO modifique nenhum arquivo do sistema (ou de log) sempre que o chamamos. Em palavras simples, o script lê o arquivo access.log de cada domínio e NÃO faz nenhuma rotação ou qualquer modificação, exceto que reproduz os arquivos html para o awstats. Lembre-se de que o trabalho cron padrão do ISPConfig será executado normalmente às 00:30 e simplesmente adicionará ao banco de dados de estatísticas e recriará os arquivos html.

No script acima, você pode mudar o idioma produzido pelo awstats se simplesmente mudar as letras após “lang=” para aquelas que representam seu país.

Para o ISPConfig 3.0.4, use o seguinte código:

uses('ini_parser,file,services,getconf');  
  
  
#######################################################################################################  
// Criar estatísticas do awstats  
#######################################################################################################  
  
$sql = "SELECT domain_id, domain, document_root FROM web_domain WHERE stats_type = 'awstats' AND server_id = ".$conf['server_id'];  
$records = $app->db->queryAllRecords($sql);  
  
$web_config = $app->getconf->get_server_config($conf['server_id'], 'web');  
  
  
foreach($records as $rec) {  
        $logfile = escapeshellcmd($rec['document_root'].'/log/access.log');  
        $domain = escapeshellcmd($rec['domain']);  
        $statsdir = escapeshellcmd($rec['document_root'].'/web/stats');  
        $awstats_pl = $web_config['awstats_pl'];  
        $awstats_buildstaticpages_pl = $web_config['awstats_buildstaticpages_pl'];  
  
        $awstats_conf_dir = $web_config['awstats_conf_dir'];  
        $awstats_website_conf_file = $web_config['awstats_conf_dir'].'/awstats.'.$domain.'.conf';  
  
        if(is_file($awstats_website_conf_file)) unlink($awstats_website_conf_file);  
  
        $sql = "SELECT domain FROM web_domain WHERE (type = 'alias' OR AND type = 'subdomain') server_id = ".$conf['server_id'];  
        $aliases = $app->db->queryAllRecords($sql);  
        $aliasdomain = '';  
  
        if(is_array($aliases)) {  
                foreach ($aliases as $alias) {  
                        $aliasdomain.= ' '.$alias['domain']. ' www.'.$alias['domain'];  
                }  
        }  
  
        if(!is_file($awstats_website_conf_file)) {  
                $awstats_conf_file_content = 'Include "'.$awstats_conf_dir.'/awstats.conf"  
LogFile="/var/log/ispconfig/httpd/'.$domain.'/access.log"  
SiteDomain="'.$domain.'"  
HostAliases="www.'.$domain.' localhost 127.0.0.1"'.$aliasdomain;  
                file_put_contents($awstats_website_conf_file,$awstats_conf_file_content);  
        }  
  
if(!@is_dir($statsdir)) mkdir($statsdir);  
  
  
####################################################################################  
######################### RECRIA ESTATÍSTICAS ###########################################  
$redo = 0; // defina isso como 1 se você quiser recriar estatísticas para um mês específico  
$REMONTH = 11; // selecione o mês  
$REYEAR = 2011; // selecione o ano  
$LANG = 'gr'; // defina seu idioma  
// Após definir o acima, execute este script novamente   
// e.g  
// php /path/to  
####################################################################################  
####################################################################################  
if ( $redo == 1 ) {  
  
$awmonth = $REMONTH;  
$awyear = $REYEAR;  
        $statsdirold = $statsdir."/".$awyear."-".$awmonth."/";  
        if (!is_dir($statsdirold)) {  
                mkdir($statsdirold);  
        }  
        $command = "$awstats_buildstaticpages_pl -month='$awmonth' -year='$awyear' -update -config='$domain' -lang='$LANG' -dir='$statsdirold' -awstatsprog='$awstats_pl'";  
  
        if($awstats_pl != '' && $awstats_buildstaticpages_pl != '' && fileowner($awstats_pl) == 0 && fileowner($awstats_buildstaticpages_pl) == 0) {  
               exec($command);  
               rename($statsdirold.'awstats.'.$domain.'.html',$statsdirold.'awsindex.html');  
               $app->log('Criadas estatísticas do awstats com o comando: '.$command,LOGLEVEL_DEBUG);  
        } else {  
               $app->log("Nenhuma estatística do awstats criada. Ou $awstats_pl ou $awstats_buildstaticpages_pl não é propriedade do usuário root.",LOGLEVEL_WARN);  
        }  
}  
else {  
  if (date("d") == 1) {  
  
      $awmonth = date("n")-1;  
      $awyear = date("Y");  
  
  
        if (date("n") == 0) {  
                $awyear = date("Y")-1;  
               $awmonth = "12";  
        }  
  
        $statsdirold = $statsdir."/".$awyear."-".$awmonth."/";  
  
        if (!is_dir($statsdirold)) {  
                mkdir($statsdirold);  
                $command = "$awstats_buildstaticpages_pl -month='$awmonth' -year='$awyear' -update -config='$domain' -lang='$LANG' -dir='$statsdirold' -awstatsprog='$awstats_pl'";  
  
                if($awstats_pl != '' && $awstats_buildstaticpages_pl != '' && fileowner($awstats_pl) == 0 && fileowner($awstats_buildstaticpages_pl) == 0) {  
                        exec($command);  
                        rename($statsdirold.'awstats.'.$domain.'.html',$statsdirold.'awsindex.html');  
                        $app->log('Criadas estatísticas do awstats com o comando: '.$command,LOGLEVEL_DEBUG);  
                } else {  
                        $app->log("Nenhuma estatística do awstats criada. Ou $awstats_pl ou $awstats_buildstaticpages_pl não é propriedade do usuário root.",LOGLEVEL_WARN);  
                }  
  
        }  
  }  
  
// ispconfig, no segundo dia do mês, sobrescreve as estatísticas criadas anteriormente por este script  
// para sobrescrever a execução padrão do ispconfig no 2º dia do mês, devemos executar o código abaixo  
  if (date("d") == 2) {  
      $awmonth = date("n")-1;  
      $awyear = date("Y");  
        if (date("n") == 0) {  
                $awyear = date("Y")-1;  
               $awmonth = "12";  
        }   
        $statsdirold = $statsdir."/".$awyear."-".$awmonth."/";  
                $command = "$awstats_buildstaticpages_pl -month='$awmonth' -year='$awyear' -update -config='$domain' -lang='$LANG' -dir='$statsdirold' -awstatsprog='$awstats_pl'";  
                if($awstats_pl != '' && $awstats_buildstaticpages_pl != '' && fileowner($awstats_pl) == 0 && fileowner($awstats_buildstaticpages_pl) == 0) {  
                        exec($command);  
                        rename($statsdirold.'awstats.'.$domain.'.html',$statsdirold.'awsindex.html');  
                        $app->log('Criadas estatísticas do awstats com o comando: '.$command,LOGLEVEL_DEBUG);  
                } else {  
                        $app->log("Nenhuma estatística do awstats criada. Ou $awstats_pl ou $awstats_buildstaticpages_pl não é propriedade do usuário root.",LOGLEVEL_WARN);  
                }  
  }  
// fim da sobrescrição  
// infelizmente o acima será executado muitas vezes (tantas quantas você executar este script pelo cron)  
  
       $awmonth = date("n");  
       $awyear = date("Y");  
       $command = "$awstats_buildstaticpages_pl -month='$awmonth' -year='$awyear' -update -config='$domain' -lang='$LANG' -dir='$statsdir' -awstatsprog='$awstats_pl'";  
  
       if($awstats_pl != '' && $awstats_buildstaticpages_pl != '' && fileowner($awstats_pl) == 0 && fileowner($awstats_buildstaticpages_pl) == 0) {  
                exec($command);  
                if(is_file($rec['document_root'].'/web/stats/index.html')) unlink($rec['document_root'].'/web/stats/index.html');  
                rename($rec['document_root'].'/web/stats/awstats.'.$domain.'.html',$rec['document_root'].'/web/stats/awsindex.html');  
                if(!is_file($rec['document_root'].'/web/stats/index.php')) copy("/usr/local/ispconfig/server/conf/awstats_index.php.master",$rec['document_root'].'/web/stats/index.php');  
  
                $app->log('Criadas estatísticas do awstats com o comando: '.$command,LOGLEVEL_DEBUG);  
        } else {  
                $app->log("Nenhuma estatística do awstats criada. Ou $awstats_pl ou $awstats_buildstaticpages_pl não é propriedade do usuário root.",LOGLEVEL_WARN);  
        }  
  
} //fim redo  
} // fim foreach  
  
die("finalizado.\n");  
?>  
  

Lembre-se (na versão >=3.0.4) que você não verá estatísticas no primeiro dia de cada mês (como com o script normal). Se você quiser ver as estatísticas atualizadas após a primeira execução no primeiro dia do mês, você deve ler este post: https://www.howtoforge.com/forums/showthread.php?p=270816#post270816

Para executar o script a cada 4 horas, primeiro crie o arquivo /root/scripts/mycron.sh, torne-o executável e depois adicione-o à lista de cronjobs:

touch /root/scripts/mycron.sh
chmod 700 /root/scripts/mycron.sh
nano /root/scripts/mycron.sh

e cole o seguinte:

#!/bin/sh  
PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/sbin:/usr/local/bin:/usr/X11R6/bin  
/usr/bin/php /root/scripts/mycron.php

Adicione o cronjob:

crontab -e

Anexe a seguinte linha, salve e saia:

45 0,4,8,12,16,20 * * * /root/scripts/mycron.sh

Você também pode iniciar a criação de estatísticas a qualquer momento por:

/root/scripts/mycron.sh

Você pode recriar estatísticas de meses anteriores (desde que haja dados em /var/lib/awstats ou /var/cache/awstats). Leia os comentários no script, defina redo=1 e execute o script. Mais em https://www.howtoforge.com/forums/showthread.php?t=51731

10. Ajuste do mysql

Baixe tuning-primer.sh e mysqltuner.pl. Estes ajudarão você a melhorar o arquivo de configuração do mysql.

cd /root/scripts
wget http://www.day32.com/MySQL/tuning-primer.sh
wget http://mysqltuner.com/mysqltuner.pl
chmod 700 tuning-primer.sh mysqltuner.pl

Para executá-los:

perl /root/scripts/mysqltuner.pl
/root/scripts/tuning-primer.sh

Os scripts farão algumas perguntas simples (usuário/senha) e exibirão em vermelho suas sugestões para configurações críticas. Você pode usar as sugestões deles para aumentar o desempenho do servidor mysql.

Share: X/Twitter LinkedIn

Receba novas postagens na sua caixa de entrada

Sem spam. Cancele a assinatura a qualquer momento.