ReLoad

Thierry Jaouen ~ WikiBlog
"Rien à foutre d'être lu, tant que je peux me relire."

Outils pour utilisateurs

Outils du site


blog:2013:04:30:awstats_avec_apache2_et_nginx

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

<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 scripte awstats qui s'execute en cron (vu plus haut), ne me cassera rien :-P
  • DirIcons et DirCgi sont en relation avec l'interface web.
  • DirData doit être spécifié, sinon, les fichiers sont stockés dans le répertoire du scripte
  • AllowToUpdateStatsFromBrowser et SaveDatabaseFilesWithPermissionsForEveryone 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 par cron !

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 a daily .
  • J'ai volontairement omis le nice -n 10 (qu'il y a dans cron)
  • J'ai ajouté 2>&1 parce qu'il y a surement une erreur de “lock” entre la rotation apache et nginx

Sources

blog/2013/04/30/awstats_avec_apache2_et_nginx.txt · Dernière modification : 2013/08/04 18:36 de thierry