Installare AWStats con Nginx

AWStats è un’applicazione che permette di generare statistiche relative agli accessi ai siti ospitati sul proprio server.
In questa guida vediamo come installare e configurare AWStats per l’utilizzo su un server web Nginx.

Il presupposto è quindi che sul server sia già installato Nginx, per i dettagli relativi all’installazione di Nginx rimandiamo all’articolo pubblicato in passato.

La prima cosa da fare è quindi installare awstats, per completare questa operazione su un server Debian, basta eseguire il seguente comando.
sudo apt-get install awstats

Durante la fase di installazione viene chiesto se si vuole utilizzare la configurazione automatica per apache e lighttpd, non bisogna selezionare questa opzione visto che non si usano questi server web.

L’accesso all’applicazione AWStats viene fatto all’indirizzo /cgi-bin/awstats.pl, risulta quindi necessario creare uno script php a cui vengono inoltrate le richieste attraverso php-cgi.
sudo nano /etc/nginx/cgi-bin.php

<?php

$descriptorspec = array( 
0 => array(“pipe”, “r”),  // stdin is a pipe that the child will read from
1 => array(“pipe”, “w”),  // stdout is a pipe that the child will write to
2 => array(“pipe”, “w”)   // stderr is a file to write to
);

$newenv = $_ENV; 
$newenv[“SCRIPT_FILENAME”] = $_ENV[“X_SCRIPT_FILENAME”];
$newenv[“SCRIPT_NAME”] = $_ENV[“X_SCRIPT_NAME”];

if (is_executable($_ENV[“X_SCRIPT_FILENAME”])) { 
$process = proc_open($_ENV[“X_SCRIPT_FILENAME”], $descriptorspec, $pipes, NULL, $newenv);
if (is_resource($process)) {
fclose($pipes[0]);
$head = fgets($pipes[1]);
while (strcmp($head, “n”)) {
header($head);
$head = fgets($pipes[1]);
}
fpassthru($pipes[1]);
fclose($pipes[1]);
fclose($pipes[2]);
$return_value = proc_close($process);
}
else {
header(“Status: 500 Internal Server Error”);
echo(“Internal Server Error”);
}
}
else {
header(“Status: 404 Page Not Found”);
echo(“Page Not Found”);
}
?>

L’operazione successiva consiste nel modificare il formato dei log di Nginx, bisogna infatti utilizzare lo stesso formato dei log di Apache per permettere a Awstats di leggerli.

sudo nano /etc/nginx/nginx.conf

Trovare la seguente riga all’interno dei file.
include       /etc/nginx/conf/mime.types;

Inserire la seguente riga sotto quella indicata in precedenza.
log_format main    ‘$remote_addr – $remote_user [$time_local] “$request” ‘
‘$status $body_bytes_sent “$http_referer” ‘
‘”$http_user_agent” “$http_x_forwarded_for”‘;

A questo punto è necessario configurare tutti i domini in modo che venga utilizzato awstats.
sudo cp /etc/awstats/awstats.conf /etc/awstats/awstats.domain.com.conf
sudo nano /etc/awstats/awstats.domain.com.conf

All’interno del file è necessario modificare le seguenti righe in base alle impostazioni del dominio.
LogFile=”/home/user_name/public_html/domain.com/logs/access.log”
LogFormat=1
SiteDomain=”domain.com”
HostAliases=”www.domain.com localhost 127.0.0.1″

Salvare il file e eseguire AWStats per la generazione iniziale delle statistiche.
sudo /usr/lib/cgi-bin/awstats.pl -config=domain.com -update

Programmare l’esecuzione di AWStats con Cron in modo che le statistiche vengano generate ogni dieci minuti.
sudo crontab -e
*/10 * * * * /usr/lib/cgi-bin/awstats.pl -config=domain.com -update > /dev/null 2>&1

L’ultima operazione da eseguire consiste nel modificare il file di configurazione di Nginx e inserire il redirect cgi-bin in modo da inoltrare le richieste allo script creato in precedenza.
sudo nano /etc/nginx/sites-available/domain.com

Trovare la seguente riga.
location ~ .php$ {

Inserire le seguenti righe prima di quella indicata in precedenza.
location ^~ /awstats-icon {
alias /usr/share/awstats/icon/;
access_log off;
}

location ^~ /awstatscss { 
alias /usr/share/doc/awstats/examples/css/;
access_log off;
}

location ^~ /awstatsclasses { 
alias /usr/share/doc/awstats/examples/classes/;
access_log off;
}

# Configure /cgi-bin/scripts to go through php-fastcgi 
location ~ ^/cgi-bin/.*.(cgi|pl|py|rb) {
gzip off;
fastcgi_pass  127.0.0.1:49232;
fastcgi_index cgi-bin.php;
fastcgi_param SCRIPT_FILENAME    /etc/nginx/cgi-bin.php;
fastcgi_param SCRIPT_NAME        /cgi-bin/cgi-bin.php;
fastcgi_param X_SCRIPT_FILENAME  /usr/lib$fastcgi_script_name;
fastcgi_param X_SCRIPT_NAME      $fastcgi_script_name;
fastcgi_param QUERY_STRING       $query_string;
fastcgi_param REQUEST_METHOD     $request_method;
fastcgi_param CONTENT_TYPE       $content_type;
fastcgi_param CONTENT_LENGTH     $content_length;
fastcgi_param GATEWAY_INTERFACE  CGI/1.1;
fastcgi_param SERVER_SOFTWARE    nginx;
fastcgi_param REQUEST_URI        $request_uri;
fastcgi_param DOCUMENT_URI       $document_uri;
fastcgi_param DOCUMENT_ROOT      $document_root;
fastcgi_param SERVER_PROTOCOL    $server_protocol;
fastcgi_param REMOTE_ADDR        $remote_addr;
fastcgi_param REMOTE_PORT        $remote_port;
fastcgi_param SERVER_ADDR        $server_addr;
fastcgi_param SERVER_PORT        $server_port;
fastcgi_param SERVER_NAME        $server_name;
fastcgi_param REMOTE_USER        $remote_user;
}

Il file deve essere modificando a seconda della configurazione del proprio server.

Riavviare Nginx
sudo /etc/init.d/nginx restart