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 :

Autres solutions de rotation des logs :

Script analyse des logs :

Analyse des logs plus évoluées :

Les commentaires sont fermés.