Table des matières

Awstats

Description

Outils de statistiques de sites web

Installation

Ici on installe la version fourni par debian, mais au moment ou j’écris ces lignes, awstats est en version 7.2 sur debian et en 7.7 stable sur le site officiel…

La version 7.2 est sortie en 2013 et ne prend pas du tout en charge internet explorer dans ses dernières version, je conseil de prendre une version plus récente.

Pour avoir une version plus récente, on peut télécharger la version de la distrib unstable sur ⇒ https://packages.debian.org/search?searchon=names&keywords=awstats

aptitude install awstats

et rajoutez les paquets recommandées

libdigest-sha1-perl (2.13-1) ...
libdigest-hmac-perl (1.02+dfsg-1) ...
libgeo-ipfree-perl (1.101650-1) ...
libnet-ip-perl (1.25-2) ...
libnet-dns-perl (0.66-2) ...
libnet-xwhois-perl (0.90-3) ...
liburi-perl (1.54-2) ...  

Le cron est déjà en place dans le fichier suivant

/etc/cron.d/awstats
Il est important de gérer les droits d’accès aux fichiers de log !!

Changé la permission du dossier /var/log/apache2 ainsi que tout ce qui se trouve à l’intérieur car le cron utilise l’utilisateur www-data pour s’executer et ce répertoire n’autorise pas par défaut cette permission..

chmod o+rx -R /var/log/apache2

Mais ce n’est pas tout ! Il y a logrotate qui passe par la et suivant sa configuration il peut changer les droits…

Vérifiez le fichier /etc/logrotate.d/apache2 et repérez la ligne

create 640 root adm

Modifiez la en

create 644 root adm

Afin que le fichier soit accessible en lecture pour les autres.

Pour la 1ère importation des logs, il convient de regrouper tous vos logs et d’importer ce gros fichiers en premier. Pour créer ce gros fichier
ls -tr access.log.*.gz | xargs gunzip -c >> bigaccess.log

Pour lancer la mise à jour

/usr/lib/cgi-bin/awstats.pl -config=maconfig -update

Il n’est pas possible d’intégrer de vieux log, si vous voulez intégrer d’anciens fichiers, il faudra supprimer la base actuelle qui se trouve dans :

cd /var/lib/awstats

supprimez ensuite les fichiers correspondant à votre config.

Configuration

Mettre awstats en francais

vi /etc/default/awstats

Mettre la variable AWSTATS_LANG=“fr”

Faite une copie du fichier /etc/awstats/awstats.conf et créé autant de fichier de config que vous voulez avoir de rapport de statistique.

Le nom du fichier doit toujours commencer par awstats. + votre nom de site(comme vous voulez) + .conf

Paramètre de base

A modifier

LogFile="/var/log/apache2/access.log"
LogFormat=1
SiteDomain="monsite.fr"
NotPageList="css js class gif jpg jpeg png bmp ico rss xml swf eot woff woff2"
AllowFullYearView=3

Ajouter des champs spéciaux

Configurez Apache

Ici nous allons accéder à awstats via un sous-domaine avec un mot de passe.

mkdir /var/www/awstats.mondomaine.fr

Créez une config apache

vi /etc/apache2/sites-available/awstats.conf
<VirtualHost *:80>
    ServerName awstats.mondomaine.fr
 
    DocumentRoot /var/www/awstats.mondomaine.fr
    <Directory /var/www/awstats.mondomaine.fr>
      AuthType Basic
      AuthUserFile /var/www/awstats.mondomaine.fr/.htpasswd
      AuthName "Access Restricted"
      Require valid-user
    </Directory>
    Alias /awstats-icon "/usr/share/awstats/icon/"
 
    ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
    <Directory "/usr/lib/cgi-bin">
      AllowOverride None
      Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
 
      # Pour limiter l'accès à certaine ip
      #Order deny,allow
      #Deny from all
      #Allow from 10.0.0.0/8
    </Directory>
 
    <Files "awstats.pl">
      AuthUserFile /var/www/awstats.mondomaine.fr/.htpasswd
      AuthName "Restricted Area For Customers"
      AuthType Basic
      require valid-user
    </Files>
</VirtualHost>

Vous pouvez créer le fichier .htpasswd avec la commande

htpasswd -c /var/www/awstats.mondomaine.fr/.htpasswd <votreLogin>

Il vous sera ensuite demandé de taper le mot de passe 2 fois.

Pour limiter l’accès à une config, ajouter la ligne suivante dans <VirtualHost>…</VirtualHost>

 SetEnv AWSTATS_FORCE_CONFIG domain.com

Ensuite, l’appel à l’url domain.com/cgi-bin/awstats.pl chargement automatiquement la bonne config et impossible d’en charger une autre via ?config=autredomaine.com

Activez le module apache cgi

a2enmod cgi

Activez votre nouvelle config

a2ensite awstats

Testez votre config

apachectl configtest

Si tout est ok

systemctl restart apache2.service

Ouvrez ensuite l’url suivante dans votre navigateur

http://awstats.mondomaine.fr/cgi-bin/awstats.pl?config=maconfig

Configuration pour Postfix

Voici un condensé d’une configuration pour postfix

LogFile="/usr/share/doc/awstats/examples/maillogconvert.pl standard < /var/log/mail.log |"
LogType=M
LogFormat="%time2 %email %email_r %host %host_r %method %url %code %bytesd"
SiteDomain="mysteryland.emc.fr"
LevelForBrowsersDetection=0
LevelForOSDetection=0
LevelForRefererAnalyze=0
LevelForRobotsDetection=0
LevelForSearchEnginesDetection=0
LevelForKeywordsDetection=0
LevelForFileTypesDetection=0
LevelForWormsDetection=0
ShowMonthStats=UHB
ShowDaysOfMonthStats=HB
ShowDaysOfWeekStats=HB
ShowHoursStats=HB
ShowDomainsStats=0
ShowHostsStats=HBL
ShowRobotsStats=0
ShowEMailSenders=HBML
ShowEMailReceivers=HBML
ShowSessionsStats=0
ShowPagesStats=0
ShowFileTypesStats=0
ShowOSStats=0
ShowBrowsersStats=0
ShowOriginStats=0
ShowKeyphrasesStats=0
ShowKeywordsStats=0
ShowMiscStats=0
ShowHTTPErrorsStats=0
ShowSMTPErrorsStats=1

Pensez aux droits sur le fichier de log

chmod o+r /var/log/mail.log

et relancez l’update

su www-data -c /usr/share/awstats/tools/update.sh

ou

/usr/lib/cgi-bin/awstats.pl -config=postfix -update  

Bug avec les requêtes en timeout HTTP 408

Un vieux bug jamais résolu qui fait raler awstats lorsqu’un log est issue d’un timeout avec un code http 408

Error while processing /etc/awstats/awstats.xxx.conf
Create/Update database for config "/etc/awstats/awstats.xxx.conf" by AWStats version 7.6 (build 20161204) From data in log file "/var/log/apache2/xxx_access.log"...
Phase 1 : First bypass old records, searching new record...
Direct access after last parsed record (after line 182) AWStats did not find any valid log lines that match your LogFormat parameter, in the 50th first non commented lines read of your log.
Your log file /var/log/apache2/xxx_access.log must have a bad format or LogFormat parameter setup does not match this format.
Your AWStats LogFormat parameter is:
1
This means each line in your web server log file need to have "combined log format" like this:
111.22.33.44 - - [10/Jan/2001:02:14:14 +0200] "GET / HTTP/1.1" 200 1234 "http://www.fromserver.com/from.htm" "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)"
And this is an example of records AWStats found in your log file (the record number 50 in your log):
192.168.37.151 - - [09/Jan/2020:16:30:42 +0100] "-" 408 3277 "-" "-"
Setup ('/etc/awstats/awstats.xxx.conf' file, web server or permissions) may be wrong.
Check config file, permissions and AWStats documentation (in 'docs' directory).

La seule solution que j’ai trouvé, est de modifier le code d’awstats. Malheureusement, à chaque upgrade du paquet, la modif sautera mais bon… ça m’évite de recevoir un mail toutes les 10min…

localisez votre fichier puis modifiez le

# locate awstats.pl
/usr/lib/cgi-bin/awstats.pl
# vi /usr/lib/cgi-bin/awstats.pl

Vers la ligne 8977, modifier le regex par

"([^ ]+) [^ ]+ ([^\\/\\[]+) \\[([^ ]+) [^ ]+\\] \\\"(?:-|([^ ]+) ([^ ]+)(?: [^\\\"]+|))\\\" ([\\d|-]+) ([\\d|-]+) \\\"(.*?)\\\" \\\"([^\\\"]*)\\\"";

Dans le code ci-dessous, j’ai mis en commentaire le regex original juste après, on peut voir qu’un autre regex était déjà en commentaire dans le code d’origine juste avant, ce qui montre que ce point semble non maîtrisé par les développeurs

  if ($Debug) {
    debug(
"Call To DefinePerlParsingFormat (LogType='$LogType', LogFormat='$LogFormat')"
    );
  }
  if ( $LogFormat =~ /^[1-6]$/ ) {    # Pre-defined log format
    if ( $LogFormat eq '1' || $LogFormat eq '6' )
    { # Same than "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"".
       # %u (user) is "([^\\/\\[]+)" instead of "[^ ]+" because can contain space (Lotus Notes). referer and ua might be "".
 
# $PerlParsingFormat="([^ ]+) [^ ]+ ([^\\/\\[]+) \\[([^ ]+) [^ ]+\\] \\\"([^ ]+) (.+) [^\\\"]+\\\" ([\\d|-]+) ([\\d|-]+) \\\"(.*?)\\\" \\\"([^\\\"]*)\\\"";
      $PerlParsingFormat =
"([^ ]+) [^ ]+ ([^\\/\\[]+) \\[([^ ]+) [^ ]+\\] \\\"(?:-|([^ ]+) ([^ ]+)(?: [^\\\"]+|))\\\" ([\\d|-]+) ([\\d|-]+) \\\"(.*?)\\\" \\\"([^\\\"]*)\\\"";
#"([^ ]+) [^ ]+ ([^\\/\\[]+) \\[([^ ]+) [^ ]+\\] \\\"([^ ]+) ([^ ]+)(?: [^\\\"]+|)\\\" ([\\d|-]+) ([\\d|-]+) \\\"(.*?)\\\" \\\"([^\\\"]*)\\\"";
 
      $pos_host    = 0;
      $pos_logname = 1;
      $pos_date    = 2;
      $pos_method  = 3;
      $pos_url     = 4;
      $pos_code    = 5;
      $pos_size    = 6;
      $pos_referer = 7;
      $pos_agent   = 8;
      @fieldlib    = (
        'host', 'logname', 'date', 'method', 'url', 'code',