Piwik

De Banane Atomic
Aller à la navigationAller à la recherche

Présentation

Piwik est un programme d'analyse statistique pour site web.

Mise à jour

Piwik's One Click update

Bash.svg
chown -R http:http /usr/share/webapps/piwik
# mise à jour
chown -R root:root /usr/share/webapps/piwik
chown -R http:http /usr/share/webapps/piwik/tmp
chown http:http /usr/share/webapps/piwik/config/config.ini.php
chown http:http /usr/share/webapps/piwik/piwik.js

# si besoin, maj de la bdd
php /usr/share/webapps/piwik/console core:update

Désactiver le tracking

config/config.ini.php
; disable Piwik Tracking
[Tracker]
record_statistics = 0

Faire une sauvegarde du fichier de configuration

« config/config.ini.php »

MAJ des fichiers

N'oublier pas de restaurer le fichier de configuration « config/config.ini.php ».
Mais ne réactivez pas encore le tracking.

FTP

Télécharger la nouvelle version de PIWIK et l'envoyer sur le FTP en remplaçant les anciens fichiers.

Veiller à ce que le transfert FTP se fasse en mode BINAIRE.

SSH

Bash.svg
wget http://builds.piwik.org/latest.zip # download latest version
cd /srv/http # se rendre là où se trouve le dossier piwik
7z x latest.zip # extraire l'archive
rm latest.zip How\ to\ install\ Piwik.html # supprimer l'archive et le fichier d'aide

MAJ de la base de données

Aller sur la page d'accueil de votre PIWIK, un lien vous permettant de mettre à jour la BdD sera disponible.

N'oublier pas de réactiver le tracking.
Bash.svg
# en ligne de commande
php /usr/share/webapps/piwik/console core:update

Configuration

Support Do Not Track preference

Settings → Privacy → Support Do Not Track preference

Exclure des IPs

Settings → Websites → Global list of Excluded IPs

Version

Le fichier « piwik/core/Version.php » contient la version de piwik.

Utiliser les fichiers de log au lieu du tracker javascript

Installer Python 2.6 ou 2.7, mais pas 3.x
Bash.svg
python2 /usr/share/webapps/piwik/misc/log-analytics/import_logs.py \
--url=http://piwik \
--idsite 1 \
/var/log/nginx/access.log \
--log-format-name ncsa_extended \
--recorders=4

# archivage quotidien
/usr/share/webapps/piwik/console core:archive --url='http://piwik'

# archivage  et recalcule de tous les rapports historiques 
/usr/share/webapps/piwik/console core:archive \
--force-all-websites \
--force-all-periods=315576000 \
--force-date-last-n=1000 \
--url='http://piwik'

# utiliser l'utilisateur « http »
su -c "/usr/bin/php /usr/share/webapps/piwik/console core:archive --url=http://piwik" http

# « php-gd » doit être installé

ReadMe

Options import_logs.py
url url de piwik
idsite dans le cas où hostname n’apparaît pas dans le log, il faut spécifier l'id du site
log-format-name spécifie le format du log: common, common_vhost, ncsa_extended, common_complete, ...

s'il n'est pas spécifié tous sont essayés

recorders nombre de cpu à utiliser
show-progress affiche le nombre de lignes traitées en temps réel
--debug --debug liste les lignes invalides
dry-run aucune donnée n'est ajoutée à piwik
skip=N passe les N première ligne du fichier de log
enable-http-errors traite les erreurs HTTP (status code 4xx et 5xx)
enable-http-redirects traite les redirections HTTP (status code 3xx sauf 304)
exclude-path=/url ignore l'url

ERROR CoreConsole Got invalid response from API request

/etc/php/php.ini
extension=curl.so

Format du log

Regex piwik _NCSA_EXTENDED_LOG_FORMAT Log Nginx combined Exemple de log Nginx combined
ip $remote_addr x.x.x.x
userid $remote_user -
date $time_local 1/Apr/2016:00:00:00
timezone $time_local +0200
path $request /page.php
status $status 200
length $body_bytes_sent 10000
referrer $http_referer -
user_agent $http_user_agent Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)
Regex piwik _NCSA_EXTENDED_LOG_FORMAT
(?P<ip>\S+)\s+\S+\s+(?P<userid>\S+)\s+\[(?P<date>.*?)\s+(?P<timezone>.*?)\]\s+"\S+\s+(?P<path>.*?)\s+\S+"\s+(?P<status>\S+)\s+(?P<length>\S+)\s+"(?P<referrer>.*?)"\s+"(?P<user_agent>.*?)"

Log Nginx combined
$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"

Exemple de log Nginx combined
x.x.x.x - - [1/Apr/2016:00:00:00 +0200] "GET /page.php HTTP/1.1" 200 10000 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"

logrotate

/etc/nginx/nginx.conf
# Créer un log journalier dans nginx
access_log  /var/log/nginx/mediawiki_access_daily.piwik;
/etc/logrotate.d/nginx
/var/log/nginx/mediawiki_access_daily.piwik {
    # archive le log tous les jours à 00h00
    daily
    # conserve 7 archives
    rotate 7
    # ajoute la date aux noms des archives
    dateext
    # format par défaut de la date: -%Y%m%d
    dateformat -%Y-%m-%d
    # ajoute la date avant l'extension
    extension .piwik
    missingok
    create 640 http log
    su http log
    compress
    postrotate
        test ! -r /run/nginx.pid || kill -USR1 `cat /run/nginx.pid`
    endscript
}
crontab
# tous les jours à 1:00
0 1 * * *	import_piwik_log_and_archive.sh
import_piwik_log_and_archive.sh
#!/bin/bash

set -e
set -o pipefail
set -u

python2 /usr/share/webapps/piwik/misc/log-analytics/import_logs.py \
  --url='http://piwik' \
  --idsite 1 \
  $(date +/var/log/nginx/mediawiki_access_daily-\%Y-\%m-\%d.piwik.gz) \
  --log-format-name ncsa_extended \
  --recorders=4

/usr/share/webapps/piwik/console core:archive --url='http://piwik'

Script perso

crontab
* * * * *	/path/to/piwik-import-log.sh 2>&1 | mail -s "Piwik Import Log" -r cron@mon-domain.fr xxx@gmail.com
piwik-import-log.sh
#!/bin/bash

set -e
set -o pipefail
set -u


log_file='/var/log/nginx/bananeatomic_access.log'


nb_of_lines_to_skip=0
if [[ -r .piwik-skip ]] ; then
    nb_of_lines_to_skip=$(cat .piwik-skip)
fi


nb_of_lines_in_the_log_file=$(wc -l < $log_file)
# si il n'y a pas eu de nouvelles entrées dans le log on ne fait rien
if [[ $nb_of_lines_to_skip -eq $nb_of_lines_in_the_log_file ]] ; then
    exit 0
# si il le log a été archivé
elif [[ $nb_of_lines_to_skip -gt $nb_of_lines_in_the_log_file ]] ; then
    nb_of_lines_to_skip=0
fi
echo $nb_of_lines_in_the_log_file > .piwik-skip


python2 /srv/http/piwik/misc/log-analytics/import_logs.py \
--url=http://piwik.mon-domain.fr \
"$log_file" \
--recorders=4 \
--exclude-path="/load.php" \
--exclude-path="/api.php" \
--skip=$nb_of_lines_to_skip

# déclencher manuellement l'archivage / la création des rapports
su http -m -c "/usr/bin/php /srv/http/piwik/console core:archive --url=http://piwik.mon-domain.fr"
# « http » n'ayant pas le droit de se connecter à un shell, il faut utiliser l'option « -m »

Confidentialité

Créer un lien vers « http://monsite/piwik/index.php?module=CoreAdminHome&action=optOut&language=fr » pour créer un cookie signifiant à Piwiki de ne pas collecter les données.

Configure Privacy Settings in Piwik

GeoLocalisation

Installation GeoIP

Bash.svg
pacman -S php-geoip geoip-database-extra
# les paquets geoip et geoip-database seront installés comme dépendances
# geoip-database contient GeoIP.dat
# geoip-database-extra contient GeoIPCity.dat
/etc/php/conf.d/geoip.ini
extension=geoip.so

; redéfinir le dossier où se trouve les fichiers dat
geoip.custom_directory=/usr/share/GeoIP/
Tester: Piwik → Administration → Geolocalisation

Installation PECL

PECL est plus rapide que la version GeoIP PHP
Bash.svg
pacman -S autoconf
pecl install geoip

Appliquez la géolocalisation aux anciens log visiteurs

Bash.svg
# Mettre à jour la base de données :
/usr/bin/php /srv/http/piwik/console usercountry:attribute 2015-01-01,2016-01-01

# Reconstruire les rapports
/usr/bin/php /srv/http/piwik/console core:archive --force-all-websites --force-all-periods=315576000 --force-date-last-n=1000 --url=http://piwik

Supprimer toutes les données statistiques

Mysql.svg
# supprimer toutes les tables commençant par archive_
select concat('drop table ', group_concat(table_name), ';')
from information_schema.tables where table_schema = 'piwik_db' and table_name like 'archive_%';
# DROP TABLE archive_*;

DELETE FROM log_visit WHERE idsite = 1;
DELETE FROM log_link_visit_action WHERE idsite = 1; 
DELETE FROM log_conversion WHERE idsite = 1; 
DELETE FROM log_conversion_item WHERE idsite = 1;

Installation

Bash.svg
cd /usr/share/webapps
wget https://builds.piwik.org/piwik.zip
# unzip piwik.zip
7z x piwik.zip
rm -f piwik.zip

cd piwik
chown http:http tmp
chown http:http piwik.js
chown -R http:http config  # seulement pour l'installation

# après l'installation, retirer les droits sur le dossier config
chown -R root:root config
# et permettre au serveur de modifier le fichier config.ini.php
chown http:http config/config.ini.php

Nginx et uwsgi

/etc/nginx/nginx.conf
server {
    listen 80;
    server_name piwik;
    root        /usr/share/webapps/piwik;
    index       index.php;
    
    location ~ \.php$ {
        include uwsgi_params;
        uwsgi_modifier1 14;
        uwsgi_pass unix:/run/uwsgi/piwik.sock;
    }
}
/etc/uwsgi/piwik.ini
[uwsgi]

; log
logger = file:/var/log/uwsgi/%n.log

; maximum number of worker processes
processes = 40
; start with only 4 and spawn the others on demand, maintaining a minimal pool of 4 processes.
cheaper = 1

; the user and group id of the process once it’s started
uid = http
gid = http

master = true
socket = /run/uwsgi/%n.sock
chdir = /usr/share/webapps/%n

; clear environment on exit
vacuum = true

; php
plugins = php
php-docroot = /usr/share/webapps/%n
php-index = index.php
php-allowed-ext = .php
; For some mysterious reason, the opcode cache is disabled in the embed SAPI.
; You can bypass the problem by telling the PHP engine that is running under the apache SAPI
php-sapi-name = apache

; extensions
php-set = extension=pdo_mysql.so
php-set = extension=iconv.so
php-set = extension=geoip.so

; php config
php-set = open_basedir=/usr/share/webapps/piwik/:/tmp/:/usr/share/GeoIP/

php-set = iconv.input_encoding=ISO-8859-1
php-set = iconv.internal_encoding=ISO-8859-1
php-set = iconv.output_encoding=ISO-8859-1

; To give Piwik enough memory to process your web analytics reports, increase the memory limit to 512M
php-set = memory_limit=512M

; define the GeoIP directory
php-set = geoip.custom_directory=/usr/share/GeoIP/

Database Setup

Mysql.svg
CREATE DATABASE `piwik_db` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
CREATE USER 'piwik_user'@'localhost' IDENTIFIED BY 'mot de passe';
GRANT ALL ON `piwik_db`.* TO `piwik_user`@`localhost`;

# LOAD DATA INFILE
show grants for 'piwik_user'@'localhost';
# GRANT USAGE ON *.* TO 'piwik_user'@'localhost' IDENTIFIED BY PASSWORD 'xxx'
grant file on *.* TO 'piwik_user'@'localhost';
show grants for 'piwik_user'@'localhost';
# GRANT FILE ON *.* TO 'piwik_user'@'localhost' IDENTIFIED BY PASSWORD 'xxx'
Database Server localhost
Login piwik_user
Database Name piwik_db
Adapter PDO\MYSQL
Bash.svg
# LOAD DATA INFILE
chown http:mysql /usr/share/webapps/piwik/tmp/assets

FTP

  1. Télécharger l'archive, la désarchiver et transférer le dossier sur le serveur via FTP en mode BINAIRE (important sinon la vérification de l'intégrité des fichiers ne marche pas).
  2. Suivre les étapes ...
  3. Pour le login et le mot de passe Piwik, il est plus aisé de réutiliser le mot de passe de l'utilisateur MediaWiki
  4. Le code JavaScript :
    • il peut être coller dans le fichier « skins/MonoBook.php » juste avant echo Html::closeElement( 'body' );
    • mais l'utilisation de l'extension FooterManager permet d'ajouter des scripts dans le footer

Erreurs

Can't get stat of '/usr/share/webapps/piwik/tmp/assets/option-xx.csv' (Errcode: 13 "Permission denied")

Administration → Diagnostic → System Check → Database abilities: LOAD DATA INFILE

Bash.svg
# le dossier assets n'est pas accessible par mysql
ll /usr/share/webapps/piwik/tmp/assets
# drwxr-x---

chmod o+rx /usr/share/webapps/piwik/tmp/assets
ll /usr/share/webapps/piwik/tmp/assets
# drwxr-xr-x

The mysql driver is not currently installed

Décommentez la ligne suivante

/etc/php/php.ini
extension=pdo_mysql.so
Bash.svg
# redemarrez le serveur
sudo systemctl restart httpd

SQLSTATE[HY000] [2002] Connection refused

Mauvais hôte, identifiant ou mot de passe.
Essayez localhost au lieu de 127.0.0.1

You need to configure and rebuild PHP with "iconv" support enabled, --with-iconv

Décommentez les lignes suivantes

/etc/php/php.ini
extension=iconv.so

[iconv]
iconv.input_encoding = ISO-8859-1
iconv.internal_encoding = ISO-8859-1
iconv.output_encoding = ISO-8859-1
Bash.svg
# redemarrez le serveur
sudo systemctl restart httpd