Table des matières
Awstats avec Apache2 et nginx
awstats
permet d'analyser les logs apache
(mais pas seulement) et de les mettre en forme pour les afficher dans un navigateur.
Je vais installer simplement awstats
pour apache
et aussi nginx
en frontal (donc, avec des logs en commun a rapprocher) …
~~READMORE~~
Package
# aptitude update # aptitude install awstats
Il faut garder en tête que awstats
installe lui-même un scripte (en fait 2) via le cron
, et que ce scripte va s'appliquer a toutes les configurations installés.
Je ferais en sorte que cela ne nuisent pas a mes objectifs
Configuration
les domaines
Les configurations doivent (obligatoirement?) être dans le répertoire /etc/awstats
et leurs noms doivent avoir la forme suivante:
awstats.<NOM>.conf
Où <NOM>
est le nom unique caractérisant le domaine ou le “Virtual Host”.
Par exemple, pour le domaine “www.eez.fr
”, le <NOM>
que j'ai choisit est simplement “www.eez.fr
”.
Donc, le contenu de la configuration /etc/awstats.www.eez.fr.conf
:
LogFile="/dev/null" LogFormat=1 LogType=W DNSLookup=1 AllowFullYearView=3 DirIcons="/awstats/icon" DirCgi="/awstats/cgi-bin" DirData="/var/lib/awstats" AllowToUpdateStatsFromBrowser=0 SaveDatabaseFilesWithPermissionsForEveryone=0 # ------------- SiteDomain="www.eez.fr" HostAliases="127.0.0.1 www.eez.fr eez.fr"
A noter:
LogFile="/dev/null"
: Ainsi, le scripteawstats
qui s'execute encron
(vu plus haut), ne me cassera rienDirIcons
etDirCgi
sont en relation avec l'interface web.DirData
doit être spécifié, sinon, les fichiers sont stockés dans le répertoire du scripteAllowToUpdateStatsFromBrowser
etSaveDatabaseFilesWithPermissionsForEveryone
pour qu'il n'y ait pas des droits d'écriture pour tout le monde !!!
Le paramètre “LogFile
” sera mis à la bonne valeur ultérieurement.
www
Methodes avec ''index.html''
Répertoires
A partir de la racine d'un domaine quelconque (moi, c'est dans /var/www/eez.fr
), j'ai fait:
Création d'un sous-répertoire
# mkdir awstats # cd awstats
Créer un lien symbolique vers un répertoire d'“icones” :
# ln -s /usr/share/awstats/icon .
Créer un répertoire pour le cgi
a venir:
# mkdir cgi-bin
Créer un lien symbolique vers le scripte (cgi
) original:
# ln -s /usr/lib/cgi-bin/awstats.pl ./cgi-bin/
A savoir: Si DirData n'a pas été préalablement définie dans la configuration, ce scripte va utiliser le répertoire où il réside, comme un répertoire de travail ! |
Et enfin, un petit index.html
à composer (par exemple) :
<!DOCTYPE html> <html> <head> <title>Awstats</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> </head> <body> <center> <h2>awstats</h2> <a target="_blank" href="/awstats/cgi-bin/awstats.pl?config=www.eez.fr">www.eez.fr</a> <br/> </center> </body>
On note la manière de charger le contenu associé à un “domaine” préalablement configurer:
awstats.pl?config=<NOM>
Apache
Dans un “Virtual Host”, j'ai simplement ajouté:
# awstats -------- <Directory "/var/www/eez.fr/awstats/"> Options -Indexes FollowSymLinks AllowOverride None Order deny,allow Deny from all Allow from 127.0.0.0/8 192.168.1.0/24 </Directory> ScriptAlias /awstats/cgi-bin/ /var/www/eez.fr/awstats/cgi-bin/ <Directory "/var/www/eez.fr/awstats/cgi-bin"> AllowOverride None Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch SetHandler cgi-script </Directory> # ----------------
Adapter les chemins et réseaux comme il vous sied.
# apache2ctl configtest # apache2ctl graceful
Un petit accès est maintenant disponible par là (exemple) :
http://www.eez.fr/awstats/index.html
Méthode plus directe
On n'a pas besoin de créer un fichier html
et on peut simplement appeller le cgi
directement.
Par défaut, le paramètre config
sera automatiquement le nom du domaine visité. (Dans notre exemple: www.eez.fr
) .
Bref, dans un répertoire cgi-bin
déjà existant.
Créer un lien.
# cd cgi-bin # ln -s /usr/lib/cgi-bin/awstats.pl .
Et dans la définition du “cgi-bin” dans le Virtual Host (exemple):
ScriptAlias /cgi-bin/ /var/www/eez.fr/cgi-bin/ <Directory "/var/www/eez.fr/cgi-bin"> AllowOverride None Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch Order allow,deny Allow from all SetHandler cgi-script # --- awstats ----------- <Files awstats.pl> Order Deny,Allow Allow from 127.0.0.0/8 192.168.1.0/24 Deny From All </Files> # ----------------------- </Directory> # Pour voir des zolis icones Alias /awstats-icon/ /usr/share/awstats/icon/ <Directory "/usr/share/awstats/icon/"> Options -Indexes FollowSymLinks AllowOverride None Order Allow,Deny Allow From All </Directory>
Adapter les chemins et réseaux comme il vous sied.
# apache2ctl configtest # apache2ctl graceful
Maintenant, on peut accéder aux stats par là :
http://www.eez.fr/cgi-bin/awstats.pl
awstats et update
Bases
Normalement, pour traiter les logs, il faudrait taper:
/usr/lib/cgi-bin/awstats.pl -config=<NOM> -update -LogFile=<FICHIER_DE_LOG>
Exemple (a ne pas faire):
# /usr/lib/cgi-bin/awstats.pl -config=www.eez.fr -update -LogFile=/var/log/apache2/access.log
Si le paramètre “DirData ” n'est pas définie, c'est dans le répertoire /usr/lib/cgi-bin/awstats.pl que les fichiers créés seront stockés. Étonnant non ? |
Mon scripte
Je me suis efforcé d'écarter 2 problèmes potentiels:
- Les accès concurrents (plusieurs exécutions simultanées)
- Plusieurs fichiers de Logs par domaine configurés
… parce qu'en vrai, le “Virtual Host” www.eez.fr
génère 2 fichiers de Logs:
/var/log/nginx/eez.fr.access.log
/var/log/apache2/access.log
pour combiner plusieurs fichiers de Logs en 1 seul, on peut utiliser le scripte fournit par le package awstats
:
/usr/share/awstats/tools/logresolvemerge.pl
Source
Bref, voici mon petit scripte:
#!/bin/bash # ============================================================================ # _ _ _ _ # __ ___ _____| |_ __ _| |_ ___ _ _ _ __ __| | __ _| |_ ___ # / _` \ \ /\ / / __| __/ _` | __/ __|_____| | | | '_ \ / _` |/ _` | __/ _ \ # | (_| |\ V V /\__ \ || (_| | |_\__ \_____| |_| | |_) | (_| | (_| | || __/ # \__,_| \_/\_/ |___/\__\__,_|\__|___/ \__,_| .__/ \__,_|\__,_|\__\___| # |_| # ============================================================================ # Update: 2013/03/14 # ------------------------- AWSTATS=/usr/lib/cgi-bin/awstats.pl LOGMERGE=/usr/share/awstats/tools/logresolvemerge.pl [ -x ${AWSTATS} ] || exit 0 [ -x ${LOGMERGE} ] || exit 0 # ------------------------- # Lock # ------------------------- # Pour eviter les accès concurrents LOCKDIR='/tmp/lock-'"$( basename $0 )" PIDFILE="$LOCKDIR/PID" if mkdir "$LOCKDIR" >/dev/null; then echo "$$" > "$PIDFILE" trap 'rm -Rf $LOCKDIR' INT QUIT TERM EXIT else OTHERPID=$( cat "$PIDFILE" ) echo "lock failed, PID $OTHERPID is active" >&2 exit 1 fi # ------------------------- awstats_update() { local config="$1" shift if [ $# -ge 2 ]; then # Plusieurs fichiers, trier les logs ${LOGMERGE} $@ | ${AWSTATS} -config="${config}" -update -LogFile=- else # 1 seul fichier ${AWSTATS} -config="${config}" -update -LogFile="$1" fi } # ------------------------------------- # Ajouter ici les logs a traiter # ------------------------------------- # # awstats_update <CONFIG> <FICHIERS_LOG> ... # # Les "config" sont dans "/etc/awstats/" sous la forme "awstats.<CONFIG>.conf" # . Dans ces "config", le "LogFile" devrait être "/dev/null" (a cause du "cron" installé par 'awstats') # . le script "awstats.pl" fixe aussi où sont écrit les données (dans ton cgi! crazy non?) # -------------------------------------- awstats_update www.eez.fr /var/log/nginx/eez.fr.access.log /var/log/apache2/access.log # Autre exemple: # awstats_update www.thierry-jaouen.fr /var/log/apache2/tj.access.log # --------------- # EOF
Installer
D'abord, je copie le scripte dans
/usr/local/bin
Il est appelé à partir du cron
que je configure comme ça:
*/10 * * * * nice -n 10 /usr/local/bin/awstats-update.sh >/dev/null
On notera:
- le
*/10
pour une exécution toutes les 10 minutes - Le
nice -n 10
pour diminuer la priorité d'exécution - le
>/dev/null
pour ne pas être pourri de mail parcron
!
Rotation des logs
UPDATE: Un méthode plus “propre” existe ici |
Et enfin, il faut que le scripte s'exécute aussi au moment de la rotation des Logs d' Apache
et, si nécessaire, de nginx
.
# cd /etc/logrotate.d
Modifier apache2
en ajoutant ou adaptant la section suivante :
# awstats ----------- prerotate /usr/local/bin/awstats-update.sh >/dev/null 2>&1 endscript # -------------------
Si besoin: Faire aussi la même modification dans nginx
, car l'ordre d’exécution des rotations n'est pas garanti.
Notes:
- On pourra aussi passer la rotation des logs de
weekly
adaily
. - J'ai volontairement omis le
nice -n 10
(qu'il y a danscron
) - J'ai ajouté
2>&1
parce qu'il y a surement une erreur de “lock” entre la rotationapache
etnginx