J’ai déjà parlé de NGINX, ce formidable serveur web rapide et surtout léger installé sur mon Dockstar.
J’ai aussi installé logrotate sur mon serveur, outil qui permet de faire tourner et d’archiver les fichiers de logs
Pour que les 2 fonctionnent ensemble il faut ajouter une configuration dans logrotate pour qu’il prennent en compte NGINX, ce dernier n’étant pas reconnu par logrotate lors de son installation.
Il faut donc créer un fichier nginx sous /etc/logrotate.d/ et y coller ceci (à adapter) :
/var/log/nginx/*.log { #rotate the logfile(s) daily daily # adds extension like YYYYMMDD instead of simply adding a number dateext # If log file is missing, go on to next one without issuing an error msg missingok # Save logfiles for the last 10 days rotate 10 # Old versions of log files are compressed with gzip compress # Postpone compression of the previous log file to the next rotation cycle delaycompress # Do not rotate the log if it is empty notifempty #after logfile is rotated and nginx.pid exists, send the USR1 signal postrotate [ ! -f /var/run/nginx.pid ] || kill -USR1 `cat /var/run/nginx.pid` endscript }
C’est la directive postrotate qui est spécifique à NGINX et qui est importante : une fois les log tournées / archivées on lance un signal d’arrêt à NGINX pour qu’il recrée les fichiers de logs.
On testera la configuration avec la commande :
sudo logrotate -d /etc/logrotate.d/nginx
Voila pour le paramétrage de base.
J’y ai personnellement ajouté l’appel à un script de mon crû avant que logrotate ne fasse tourner les logs.
Ce script analyse les logs d’accès de NGINX et effectue une petite analyse des IPs et des utilisateurs qui se connectent :
#!/bin/bash cd $(dirname "${0}") log=[nom et chemin du fichier log] date > $log echo -e "\n" >> $log for file in /var/log/nginx/*access.log do echo ${file} >> $log echo -e "\nNb accès par IP" >> $log cat ${file} | awk '{print $1}' | sort | uniq -c >> $log sed -i 's/\(81..125.231.15$\)/\1 : Travail/' $log sed -i 's/\(89.5.45.52$\)/\1 : Maison/' $log echo -e "\nNb accès par utilisateur" >> $log cat ${file} | awk '{print $3}' | sort | uniq -c >> $log echo -e "\n-------------------------\n" >> $log done
qui produit ce genre de rapport :
jeudi 14 avril 2011, 13:35:21 (UTC+0200) /var/log/nginx/access.log Nb accès par IP 1 121.162.199.215 6 192.168.1.100 : Maison 1 208.80.194.29 1 222.187.222.26 Nb accès par utilisateur 4 - 5 mon_utilisateur ------------------------- /var/log/nginx/xxxx.access.log Nb accès par IP 250 125.54.42.12 Nb accès par utilisateur 250 utilisateur2 ------------------------- /var/log/nginx/yyyy.access.log Nb accès par IP Nb accès par utilisateur -------------------------
Pour prendre en compte ce script et le faire exécuter j’ai ajouté les directives suivantes au fichier nginx de logrotate :
# scripts are runned only once sharedscripts # before rotation log are analyzed prerotate /chemin/statistiques_nginx.sh endscript
Ainsi avant de faire tourner les logs NGINX logrotate exécute une seule fois le script que j’ai nommé statistiques_nginx.sh. Ce dernier produit un rapport que je m’envoie par email (via un autre script)
A noter qu’il existe des solutions clé en main et beaucoup plus évoluées, complètes d’analyse et de statistiques pour les logs des serveurs Web (voir dans les sources), mais cela me semble un peu trop pour mon usage.
Sources :
Logrotate :
- nginx logrotate config
- nginx log rotation
- How To Configure Logrotate Nginx Log in FreeBSD and Linux Machine.
Autres solutions de rotation des logs :
Script analyse des logs :
- HOWTO sort web-server logs to find top users
- Shell Script List All Top IP Address Accessing Apache / Lighttpd
Analyse des logs plus évoluées :