Visualiser ses logs d'accès nginx avec goaccess

Lorsque l’on veut avoir des statistiques d’accès sur un site, on peut mettre en place google analytics, ou la solution hébergeable et opensource matomos (anciennement piwik).

On peut aussi se contenter des logs fournis par nginx, et utiliser le programme goaccess qui va lire notre fichier de logs généré par nginx afin d’en traiter les données.

La première chose à vérifier est que nginx stocke bien les logs d’accès. Dans /etc/nginx/nginx.conf, on peut vérifier la présence de la ligne suivante :

access_log /var/log/nginx/access.log;

Notons que l’on peut aussi spécifier un fichier de log différent par virtualhost. Nous allons faire en sorte de pouvoir accéder aux logs de notre serveur, via l’emplacement /log, et sécurisé par un mot de passe (on suppose que le serveur nginx est déjà lancé, et propulse un serveur web en http+ssl).

La commande suivante va analyser les logs d’accès générés par nginx, et en générer un rendu html dans /var/www/log/index.html.

# Concatène tous les fichiers access.log
$ /bin/zcat -f /var/log/nginx/access.log* \

# Ignore les accès à la page de logs
  | grep -v "GET /log/" \

# Génère les statistiques des logs dans un fichier html
  | /usr/bin/goaccess - -a --log-format=COMBINED -o /var/www/log/index.html &>/dev/null

En une seule ligne:

$ /bin/zcat -f /var/log/nginx/access.log* | grep -v "GET /log/" | /usr/bin/goaccess - -a --log-format=COMBINED -o /var/www/log/index.html &>/dev/null

Il suffit de rajouter cette commande au crontab, afin qu’elle soit exécutée assez souvent. Par exemple pour que les stats soient rafraîchies toutes les 15 minutes, après un crontab -e :

# m h  dom mon dow   command
*/15   *  *   *   *  /bin/zcat -f /var/log/nginx/access.log* | grep -v "GET /log/" | /usr/bin/goaccess - -a --log-format=COMBINED -o /var/www/log/index.html &>/dev/null

Reste à rendre accessible ce fichier. Générons d’abord des mots de passe d’accès (nécessite htpasswd, présent dans le paquet apache2-utils sous debian).

htpasswd -c "/etc/nginx/.htpasswd" USERNAME

Rentrez un mot de passe, et rajoutons le chemin /log à notre fichier nginx. Vous devriez avoir un fichier /etc/nginx/sites-enabled/WEBFILE. Rajoutez dedans :

    location /log {
        root /var/www;
        index index.html;
        auth_basic "Restricted";
        auth_basic_user_file "/etc/nginx/.htpasswd";
    }

Après un systemctl reload nginx, vous devriez pouvoir accéder à vos log depuis https://<servname>/log/.