Desde hace unos meses he dejado de lado a Piwik, el maravilloso sistema de estadísticas que he venido usando durante los tres últimos años. Piwik ha evolucionado muchísimo desde que empecé a usarlo: ya no usa gráficos flash, mantiene muy controlado el tamaño de su base de datos, es más rápido y tiene nuevos plugins que lo convierten en un perfecto competidor libre de google analytic y lo están haciendo escalar puestos poco a poco en el competitivo ranking de los sistemas de estadísticas. Pero… tiene un enorme problema: el consumo de memoria resulta del todo inasumible para una máquina con RAM escasa que es el gran cuello de botella de un servidor web con Apache, así que cuando me pasé a un servidor VPS en Linode, con la limitación de RAM que eso supone, fue lo primero que tuve que sacrificar. Algún día me pararé a probar lighttpd o a ver si realmente el módulo MPM worker mejora tanto como cuentan la gestión de memoria, pero por el momento los alrededor de 128 Megas que consumen los scripts de Piwik me resultan del todo inasumibles.
AWStats tiene un aspecto realmente «viejuno» de web sacada de Geocities, pero hace bien lo que tiene que hacer, apenas consume RAM y obtiene sus resultados leyendo directamente de los logs de Apache con lo que no pierde ni una sóla visita. Cualquier otro método (usando javascript en cliente, PHP en el servidor, etc.) es susceptible de perder información en determinadas circunstancias.
El hecho de que no ofrezca datos en tiempo real se puede mitigar haciendo que los logs se procesen en intervalos más pequeños o, incluso, añadiendo un enlace para que estos se procesen bajo demanda. El filtro de estadísticas diario que por defecto no es posible también puede conseguirse mediante la extensión Day by Day que también veremos en esta entrada.
Los únicos requisitos previos son tener instalados perl (necesario para ejecutar los scripts de awstats) y nuestro servidor web que, en este ejemplo, será Apache. La instalación en una debian es tan fácil como siempre (apt-get install awstats) pero la versión en el repositorio estable es la 6.9.5 que tiene más de dos años. Si quieres trabajar con la última versión (la 7.0 o la beta 7.1 en estos momentos) lo más fácil es bajarte el paquete desde aquí y descomprimirlo en tu servidor en el directorio /usr/local. Todo lo que vamos a ver a continuación supone que estamos instalando por este segundo método.
A continuación creamos un virtual host en nuestro Apache para realizar el acceso a las estadísticas o incluimos las siguientes líneas (sacadas del modelo que tendremos en el fichero /usr/local/awstats/tools/httpd_conf) en, por ejemplo, la instancia por defecto del mismo:
Alias /awstatsclasses "/usr/local/awstats/wwwroot/classes/"
Alias /awstatscss "/usr/local/awstats/wwwroot/css/"
Alias /awstatsicons "/usr/local/awstats/wwwroot/icon/"
Alias /awstatsjs "/usr/local/awstats/wwwroot/js/"
ScriptAlias /awstats/ "/usr/local/awstats/wwwroot/cgi-bin/"
Options None
AllowOverride None
Order allow,deny
Allow from all
Una vez editado debemos de pedir a apache que vuelva a leer la configuración para que tengan efecto estas líneas (service apache2 reload).
Vamos ahora a crear un fichero de configuración para awstats. Partimos del modelo que habrá en /usr/local/awstats/wwwroot/cgi-bin/awstats.model.conf. Lo copiamos en el directorio /etc/awstats (que debemos de haber creado antes) con un nombre distintivo (por ejemplo awstats.miweb001.conf) y lo editamos para adecuarlo a nuestra instalación. Mucha antención a la partícula miweb001 que debería de identificar a la web cuyas estadísticas queremos ver y que tendremos que usar en otras instrucciones más adelante. Las líneas que deberías de modificar sobre la configuración por defecto (y que no aparecen consecutivamente como aquí ¿eh?) son estas:
LogFile="/var/log/apache2/apache2-myweb001-access.log"
SiteDomain="www.miweb001.es"
HostAliases="www.miweb0001.com www.miweb001.net"
DNSLookup=1
DirData="/var/lib/awstats"
DirCgi="/awstats"
DirIcons="/awstatsicons"
AllowToUpdateStatsFromBrowser=1
AllowFullYearView=3
Las tres primeras definen, respectivamente, el emplazamiento del fichero de logs de la instancia de apache, el nombre de la web y los posibles alias a través de los cuales podamos acceder a la misma (separados estos por espacios). La cuarta línea habilita la resolución completa por DNS de las IP’s de acceso. En la quinta línea decimos donde queremos que deje los ficheros resultantes de procesar los ficheros de log (¡no olvides crearlo!). En la sexta y la séptima se define donde están los diferentes componentes de awstats según los hemos definido anteriormente en el fichero de configuración de la instancia de apache. Las dos últimas líneas hacen que nos aparezca un enlace que permita refrescar los datos en cualquier momento y habilitan la posibilidad de realizar informes estadísticos de todo un año.
Existen muchos otros parámetros interesantes o útiles para activar plugins, funcionalidades extras, personalización, etc, pero yo te recomiendo que lo eches a funcionar sólo con esto que es lo mínimo y luego ya te metas en experimentar otras cosas. Sobre todo si no tienes mucha experiencia en estas lides.
Vamos ahora a programar el cron de nuestra máquina para que procese los logs de apache, por ejemplo, cada 15 minutos. Creamos un fichero llamado /etc/awstats/cron-awstats.sh, le damos permisos de ejecución y copiamos lo siguiente en él:
#!/bin/sh
perl /usr/local/awstats/wwwroot/cgi-bin/awstats.pl -config=miweb001 -update
perl /usr/local/awstats/wwwroot/cgi-bin/awstats.pl -config=miweb001 -databasebreak=day -update
Fijate bien en que la partícula que aparece a continuación de config en ambas líneas (miweb001) debe de ser exactamente la misma que aparece en el nombre del fichero de configuración que hemos creado anteriormente (awstats.miweb001.conf). Bien, ahora editamos el fichero /etc/crontab y añadimos al final del mismo lo siguiente:
*/15 * * * * root /etc/awstats/cron-awstats.sh > /dev/null
Y listo. Nos quedan unos pequeños retoques pero ahora ya cada 15 minutos se analizarán los logs del servidor de apache y podremos consultar la información, ya procesada, en la siguiente URL. Atención, de nuevo, a la partícula miweb001:
http://ip-del-servidor/awstats/awstats.pl?config=miweb001
Si, como es habitual, nuestro sistema rota los ficheros de log tenemos que evitar perder el procesado de los últimos minutos antes de una rotación. Para ello editamos el fichero /etc/logrotate.d/apache2 y bajo la línea donde pone prerotate volvemos a ejecutar el procedimiento que llama a los scripts de awstats:
prerotate
/etc/awstats/cron-awstats.sh > /dev/null
Lo último que nos resta por hacer es habilitar la posibilidad de mostrar informes diarios. Para ello usaremos la extensión Day by Day. Para instalarla y configurarla tenemos que descargarnos la última versión, descomprimirla y copiar los dos archivos javascript (day-by-day-head.js y day-by-day-end.js) en el directorio /usr/local/awstats/wwwroot/js/. A continuación editamos el fichero de configuración de awstats (recuerda que en nuestro ejemplo se llama awstats.miweb001.conf y está en el directorio /etc/awstats) y reemplazamos los valores de los dos parámetros HTMLHeadSection y HTMLEndSection (casi al final del fichero) por las siguientes líneas:
HTMLHeadSection=""
HTMLEndSection=""
Una vez hecho esto, la pantalla principal de nuestro awstats aparecerá con un cintillo en la parte superior donde podemos escoger un día concreto y, al hacerlo, en la gráfica principal aparecerá un corte de detalle por horas. El resto de los datos también serán referidos al día escogido. Para volver a la vista mensual pulsamos el enlace «Back to monthly report» del cintillo superior.
Si tenemos otras instancias web separadas en nuestro servidor y también queremos obtener sus estadísticas sólo tenemos que repetir, por cada una de ellas, dos de los pasos anteriores:
- Crear un fichero de configuración separado en el directorio /etc/awstats con los datos pertinentes. No olvides incluir las líneas finales que hemos visto para la extensión Day by Day.
- Añadir un par de líneas adicionales correspondientes a la nueva instancia en el fichero /etc/awstats/cron-awstats.sh
La URL para consultar las estadísticas de estas nuevas instancias será también diferente, claro. Y recuerda que la partícula distintiva que usamos en el nombre del fichero de configuración será la que nos permitirá construirla.