Créer un serveur d'applications Web - 3ème partie

Comment analyser les informations de connexion avec Piwik ?

13 mai 2017

Introduction

Cet article est le 3ème d'une série concernant la création et l'exploitation d'un serveur d'applications Web.

Ce 3ème article concerne le traitement et l'analyse des informations d'utilisation du serveur d'applications créé dans les précédents articles :

Un ancien article Utiliser Piwik en temps différé peut compléter cet article.

Les contraintes de notre serveur :

Présentation de Piwik

Piwik est un outil de mesure statistiques Web, il permet d'analyser les informations d'utilisation du serveur d'applications.

Principaux avantages

Piwik est une alternative à Google Analytics et a pour avantages :

L'inconvénient du temps réel

Le principal inconvénient de Piwik est dans le cas d'une utilisation en temps réel (configuration par défaut).

À chaque action du visiteur, une requête est envoyée au serveur Piwik, sauvegardée dans sa base de données et peut être analysée quasiment en temps réel depuis son interface.

Le temps réel est justifié si le site / l'application Web a un trafic important et qu'il est nécessaire de suivre tout au long de la journée l'évolution des visiteurs pour pallier le plus rapidement possible à tout problème.

Mais le bon fonctionnement de la mesure de statistiques en temps réel nécessite un serveur dédié à Piwik suffisamment puissant pour ne pas ralentir le site ou l'application.

Le traitement différé avec Log Analytics Tool

nginx et apache génèrent des logs qui contiennent des informations sur les visiteurs (date/heure, ip, navigateur, ...).

Pour éviter un ralentissement des applications et un surcoût lié à un serveur supplémentaire dédié à Piwik, ces logs peuvent être régulièrement téléchargés (la nuit) sur un ordinateur local classique, pour être ensuite importés dans Piwik avec son outil Log Analytics Tool.

Le script Log Analytics Tool :import_logs.py nécessite que Python soit installé.
Il est généralement situé dans le répertoire log-analytics de Piwik.

Par exemple, pour importer le fichier access.log dans Piwik (installé localement et accessible par l'URL http://localhost/piwik) :

python /var/www/piwik/misc/log-analytics/import_logs.py --url=http://localhost/piwik --enable-http-errors --enable-http-redirects --enable-static --enable-bots --add-sites-new-hosts --enable-reverse-dns access.log

Une fois importées, les données des visites peuvent être analysées à partir de l'interface Web de Piwik.

piwik

Téléchargement et importation automatique des logs

Un fichier logs contient par exemple :

163.172.129.102 179.215.186.175 - - [27/Apr/2017:06:39:50 +0000] "POST /command.php HTTP/1.0" 401 204 "-" "Wget(linux)"
projects.glicer.com 180.76.15.135 - - [27/Apr/2017:07:53:49 +0000] "GET /chat HTTP/1.1" 301 194 "-" "Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)"
projects.glicer.com 180.76.15.161 - - [27/Apr/2017:07:53:49 +0000] "GET /chat/ HTTP/1.1" 200 724 "-" "Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)"

Chaque ligne du fichier logs correspond à une requête d'un navigateur Web sur le serveur.

nginx enregistre par défaut ses logs dans le répertoire /var/log/nginx et apache dans /var/log/apache.

Le répertoire des logs de nginx contient par exemple :

root@scw:/var/log/nginx# ls -1
access.log
access.log.1
access.log.10.gz
access.log.11.gz
access.log.12.gz
access.log.13.gz
access.log.14.gz
access.log.2.gz
access.log.3.gz
access.log.4.gz
access.log.5.gz
access.log.6.gz
access.log.7.gz
access.log.8.gz
access.log.9.gz

Ces logs peuvent être automatiquement importés avec Log Analytics Tool une fois téléchargés du serveur.

La rotation des logs et les doublons

Linux limite la taille des fichiers de logs en réalisant une rotation.
La rotation archive le fichier logs sous un autre nom et supprime la plus ancienne archive.

Le fichier access.log se remplit jusqu'à ce que le système décide de le renommer en access.log.1 et de remettre le fichier access.log à zéro.

Dans le cas d'une rotation entre deux téléchargements, des informations seront perdues si l'on importe uniquement le fichier access.log.

La commande cat est utilisée pour refusionner tous les fichiers logs en un seul :

gzip -d ./remotelog/*.gz                      # décompresser les fichiers logs si nécessaire
cat ./remotelog/* > rotated-merged-new.log    # fusionner tous les logs en un seul fichier

Le fichier fusionné contient tous les logs mais Log Analytics Tool ne gère pas les doublons : si le même fichier logs est importé 2 fois dans Piwik alors toutes les visites seront comptabilisées 2 fois.

Pour importer uniquement les nouveaux logs, il faut conserver l'ancien fichier fusionné de la dernière importation et utiliser la commande diff pour comparer le nouveau fichier avec l'ancien :

diff --changed-group-format='%<' --unchanged-group-format='' rotated-merged-new.log rotated-merged-old.log > toimport.log

Serveur accessible par FTP

Pour un serveur accessible par FTP, l'outil lftp permet de faire un miroir du répertoire logs en téléchargeant uniquement les fichiers modifiés.

Par exemple, pour télécharger les fichiers logs modifiés d'Apache dans le répertoire local ./remotelog :

lftp sftp://login:password@url -e "set sftp:auto-confirm yes ; mirror -e --include-glob=access* /var/log/apache ./remotelog ; quit"

Serveur accessible par SSH

Pour un serveur accessible par SSH, l'outil rsync permet de synchroniser le répertoire logs en transférant uniquement les parties modifiées des fichiers.

Il faut configurer SSH pour s'authentifier par un système de clés publique / privée afin d'éviter l'utilisation d'un mot de passe.

Par exemple, pour synchroniser les logs de nginx avec le répertoire local ./remotelog :

rsync -e ssh -avz login@IP:/var/log/nginx/access ./remotelog/ 

Le script complet

En utilisant toutes les solutions ci-dessus, on obtient le script qui télécharge et importe les nouveaux logs :

#!/bin/bash
IMPORTSCRIPT=/var/www/piwik/misc/log-analytics/import_logs.py # chemin du script Piwik d'importation
SSHAUTH=login@IP # login et IP du serveur pour le téléchargement des logs par SSH
FTPAUTH=login:password@IP # login, password et IP du serveur pour le téléchargement des logs par FTP
REMOTELOG=/var/log/nginx # ou /var/log/apache pour apache
LOGDIR=./remotelog # répertoire contenant les logs téléchargés
TMPDIR=./tmp # répertoire temporaire de traitement
NEWFILE=rotated-merged-new.log # nom du fichier contenant la fusion des logs
OLDFILE=rotated-merged-old.log # nom du fichier contenant la fusion des logs lors la dernière importation
NEWIMPORT=toimport.log # nom du fichier contenant uniquement les nouveaux logs à importer
URLPIWIK=http://localhost/piwik # URL de Piwik

rsync -e ssh -avz $SSHAUTH:$REMOTELOG/access* $LOGDIR/ 2>&1 # synchronisation du répertoire local avec le répertoire distant
# ou lftp sftp://$FTPAUTH -e "set sftp:auto-confirm yes ; mirror -e --include-glob=access* $REMOTELOG remoteloggandi ; quit"
if [ $? -ne 0 ]; then 
    exit 1 # le script est stoppé si une erreur de synchronisation se produit
fi
cp -r $LOGDIR $TMPDIR
gzip -d $TMPDIR/*.gz   # décompresser les logs téléchargés
cat $TMPDIR/* > $NEWFILE && rm -r $TMPDIR # concaténer les fichiers de rotation en un seul
touch $OLDFILE 

diff --changed-group-format='%<' --unchanged-group-format='' $NEWFILE $OLDFILE > $NEWIMPORT # extraire uniquement les nouveaus logs depuis la dernière importation
python $IMPORTSCRIPT --url=$URLPIWIK --enable-http-errors --enable-http-redirects --enable-static --enable-bots --add-sites-new-hosts --enable-reverse-dns $NEWIMPORT # importer les nouveaux logs dans piwik
if [ $? -eq 0 ]; then 
   cp $NEWFILE $OLDFILE # si l'importation a réussi, on garde l'historique des logs importés pour une comparaison à la prochaine importation
fi

Ce script peut être automatiquement exécuté à intervalle régulier (chaque jour) en utilisant cron.

Prochain article

Le prochain article traitera de l'installation d'un certificat SSL pour l'accès au serveur par HTTPS.