Linux:Statistiques de site web avec Awstats

Un article de Djjnet.

Sommaire

Version pages statiques avec utilisation du package Debian et script d'automatisation

Installer Awstat sous debian pour générer des pages de statistiques sur les visiteurs de vos sites web :
Nous installons awstats de manière à générer des pages statiques. La génération des statistiques se lance après la rotation des logs d'apache. Nous considérons dans cet exemple que les statistiques seront accessibles dans un sous-dossier de votre site web : votresite/statistiques/ et que le site est www.dj-j.net.

Un script /etc/awstats/genstats est lancé après la rotation des logs. Il lit les sites configurés dans /etc/awstats/sites.conf.
Le script va permettre de garder les statistiques de tous les mois.

Installation du package

apt-get install awstats liburi-perl

Configuration

Fichier de configuration d'apache :
Créer un fichier /etc/apache2/conf.d/awstats.conf
Y mettre la configuration suivante pour pouvoir accéder aux icons :

<Directory /usr/share/awstats/icon>
AllowOverride None
Order allow,deny
Allow from all
</Directory>
Alias /awstats-icon/ /usr/share/awstats/icon/

Script de génération des statistiques

Créer un dossier pour les pages web générées :

mkdir /var/...cheminversvotresite/statistiques

Modifier la configuration de rotation des logs d'apache pour qu'ils soient journaliers, dans le fichier /etc/logrotate.d/apache2 changer weekly par daily.

Copier les scripts exemple permettant de traiter les statistiques plus facilement :

cp /usr/share/doc/awstats/examples/awstats_updateall.pl /etc/awstats/
cp /usr/share/doc/awstats/examples/awstats_buildstaticpages.pl /etc/awstats/


Créer un fichier /etc/awstats/genstats dont le contenu est ainsi :

#!/bin/bash
conf=/etc/awstats/sites.conf
mois=`date --date="1 day ago" +%m`
annee=`date --date="1 day ago" +%Y`
awoptionsmois="-month=${mois} -year=${annee} -builddate=${annee}${mois}"
awoptionsannee="-month=all -year=${annee} -builddate=${annee}"

nice perl /etc/awstats/awstats_updateall.pl now -awstatsprog=/usr/lib/cgi-bin/awstats.pl -configdir=/etc/awstats > /dev/null
for i in `grep ^site= $conf | cut -f 2 -d'='` do site=`echo $i | cut -f 1 -d';'` dossier=`echo $i | cut -f 2 -d';'` fichiermois=awstats.${site}.${annee}${mois}.html fichierannee=awstats.${site}.${annee}.html statsmois="" statsannee="" nice perl /etc/awstats/awstats_buildstaticpages.pl -update ${awoptionsmois} -config=${site} -awstatsprog=/usr/lib/cgi-bin/awstats.pl -dir=${dossier} > /dev/null nice perl /etc/awstats/awstats_buildstaticpages.pl -update ${awoptionsannee} -config=${site} -awstatsprog=/usr/lib/cgi-bin/awstats.pl -dir=${dossier} > /dev/null
ln -fs ${dossier}/${fichiermois} ${dossier}/defaut.html if [ -f ${dossier}/.listestatsmois ]; then statsmois=`grep ${fichiermois} ${dossier}/.listestatsmois` fi if [ -f ${dossier}/.listestatsannees ]; then statsannee=`grep ${fichierannee} ${dossier}/.listestatsannees` fi if [ ! -n "$statsmois" ]; then echo ${mois}" "${annee}";"${fichiermois} >>${dossier}/.listestatsmois fi if [ ! -n "$statsannee" ]; then echo "Année "${annee}";"${fichierannee} >>${dossier}/.listestatsannees fi done


Rendre ce fichier exécutable :

chmod +x /etc/awstats/genstats

Créer un lien symbolique vers le script créé (il faut que le nom du lien soit choisi de façon à être lancé après logrotate) :

ln -s /etc/awstats/genstats /etc/cron.daily/logstats


Créer un dossier /etc/awstats/template.
Puis créer le fichier /etc/awstats/template/index.html avec pour contenu :

<html>
<frameset cols="100,*" noresize="noresize" frameborder="0">
   <frame name="menu" src="menu.php" title="menu" noresize="noresize" frameborder="0">
   <frame name="stats" src="defaut.html" title="stats">
</frameset>
</html>

Puis le fichier /etc/awstats/template/menu.php avec pour contenu :

<html>
<head>
<title>menu</menu>
</head>
<body>
<?php
       $lines=file("./.listestatsannees");
       foreach ($lines as $line_num => $line) {
               $affiche=strtok($line,";");
               $lien=strtok(";");
               echo '<a href="'.$lien.'" target="stats">'.$affiche.'</a>
'; } $lines=file("./.listestatsmois"); foreach ($lines as $line_num => $line) { $affiche=strtok($line,";"); $lien=strtok(";"); echo '<a href="'.$lien.'" target="stats">'.$affiche.'</a>
'; } ?> </body> </html>

Paramétrage d'un site

Ajouter dans le fichier /etc/awstats/sites.conf une ligne par site sous le modèle suivant :

site=adressesite;dossierstats

exemple :

site=www.dj-j.net;/var/www/www.dj-j.net/statistiques

Copier dans le dossier des statistiques les fichiers du dossier /etc/awstats/template.

Chaque site qui nécessite des statistiques possède son fichier de configuration situé dans le dossier /etc/awstats
Le fichier de configuration est nommé ainsi : awstats.nomdedomaine.conf dans notre cas : awstats.www.dj-j.net.conf

Déplacer le fichier de configuration exemple ainsi : mv /etc/awstats/awstats.conf /etc/awstats/awstats.www.dj-j.net.conf
Il ne doit pas y avoir de fichier non configuré dans le dossier /etc/awstats sinon il y aura une erreur à l'exécution du script plus loin.
Modification du fichier de configuration :
Le fichier exemple donne tous les paramètres disponibles, nous verrons que les principaux :
Fichier contenant les logs apache du site à analyser, il doit finir par 1 et n'est disponible qu'après une première rotation des log. Nous travaillons sur les logs de la veille afin d'éviter de perdre des données au moment de la rotation des logs :

LogFile="/var/log/apache2/www.dj-j.net-access_log.1";

Il est important d'avoir ses log au format combined pour avoir un maximum d'informations, dans la configuration d'apache de votre vhost, vous devez avoir une ligne de ce type :

CustomLog /var/log/apache2/www.dj-j.net-access_log combined

Indiquer 1 pour le format combined :

LogFormat=1

Déclarer le domaine du site web, il doit avoir la même valeur que pour le nom du fichier de configuration :

SiteDomain="www.dj-j.net";

Si vous avez des autres domaines qui pointent vers le même site :

HostAliases="www.dj-j.org www.dj-j.com";

Les données de travail d'awstats seront mises dans /var/lib/awstats/ :

DirData="/var/lib/awstats"

Le chemin vers les icons comme indiqué dans l'alias d'apache :

DirIcons="/awstats-icon"

Il peut être utile de ne pas comptabiliser les machines vous appartenant (ou les ip des outils de monitoring) pour ne pas fausser les statistiques :

SkipHosts="84.37.34.18 82.236.161.216 REGEX[^192\.168\.]"

Mettre la langue à français :

Lang="fr"

Vous pouvez changer le logo, le fichier image doit se situer dans /usr/share/awstats/icon/other/ :

Logo="logo-dj-j.net-150-56.png"
LogoLink="www.dj-j.net";

Pour ne pas avoir de problème d'affichage des accents, activer le plugin DecodeUTFKeys :

LoadPlugin="decodeutfkeys"

Version pages dynamiques avec installation manuelle et authentification

Télécharger la dernière version sur http://awstats.sourceforge.net/#DOWNLOAD (7.0 dans le cas de la doc)

Nous allons installer dans /var/www/awstats/wwwroot, les données awstats seront mises dans /var/www/awstats/data.

tar -zxf awstats-7.0.tar.gz
cd awstats-7.0
mkdir -p /var/www/awstats/data /etc/awstats
cp -Rp wwwroot /var/www/awstats/

Créons le Vhost Apache suivant :

<VirtualHost *:80>
   ServerAdmin webmaster@dj-j.net
   ServerName stats.dj-j.net
   ScriptAlias /cgi-bin /var/www/awstats/wwwroot/cgi-bin
   <Directory /var/www/awstats/wwwroot/cgi-bin>
           Options -Indexes +ExecCGI
           AllowOverride None
           Order allow,deny
           allow from all
           AuthUserFile /etc/awstats/htpasswd
           AuthName "Statistiques"
           AuthType Basic
           require valid-user
   </Directory>
   Alias   /awstats-icon   /var/www/awstats/wwwroot/icon
   <Directory /var/www/awstats/wwwroot/icon>
           Options -Indexes
           AllowOverride None
           Order allow,deny
           allow from all
   </Directory>
   ErrorLog /var/log/apache2/stats.dj-j.net.error.log
   CustomLog /var/log/apache2/stats.dj-j.net.access.log combined
</VirtualHost>

Les statistiques seront accessibles par une adresse du type : http://stats.dj-j.net/cgi-bin/awstats.pl?config=www.dj-j.net.

Créons un premier utilisateur :

htpasswd -c /etc/awstats/htpasswd USER

Créons un fichier avec les options de base pour tous les sites. Pour cela, on récupère le modèle :

cp wwwroot/cgi-bin/awstats.model.conf /etc/awstats/awstats.conf.global

Dans ce fichier /etc/awstats/awstats.conf.global, on commente tout ce qui est particulier (selon vos choix) à un site :

#LogFile="/var/log/httpd/mylog.log"
#LogType=W
#LogFormat=1
#SiteDomain=""
#HostAliases="localhost 127.0.0.1 REGEX[myserver\.com$]"
#AllowAccessFromWebToFollowingAuthenticatedUsers=""
#SkipHosts=""

Toujours dans ce fichier, on modifie le dossier des datas au choix réalisé au début et le dossier des icons pour correspondre au vhost :

DirData="/var/www/awstats/data"
DirIcons="/awstats-icon"

On autorise uniquement l'accès aux utilisateurs authentifiés :

AllowAccessFromWebToAuthenticatedUsersOnly=1

Créons maintenant la configuration pour un site dans un fichier /etc/awstats/awstats.SITE.conf, par exemple /etc/awstats/awstats.www.dj-j.net.conf :

LogFile="/var/log/apache2/www.dj-j.net-access_log.1"
LogType=W
LogFormat=1
SiteDomain="www.dj-j.net"
HostAliases="www.dj-j.org www.dj-j.com"
SkipHosts="localhost 127.0.0.1 IPDEMONITORING"
AllowAccessFromWebToFollowingAuthenticatedUsers="USER"
Include "/etc/awstats/awstats.conf.global"

Ainsi les fichiers de configuration par site sont plus simples et les statistiques ne sont accessibles que par l'utilisateur voulu.

Je fais aussi le choix d'utiliser le fichier de log de la veille (.1) pour s'assurer d'avoir toutes les statistiques complètes. Créons la tâche de génération automatique :

cp tools/awstats_updateall.pl /etc/awstats/

Créons le fichier /etc/cron.daily/logstats avec pour contenu :

#!/bin/bash
nice perl /etc/awstats/awstats_updateall.pl now -awstatsprog=/var/www/awstats/wwwroot/cgi-bin/awstats.pl -configdir=/etc/awstats > /dev/null