Escrito el 20 junio 2012 por Luis Ignacio Díaz Martínez
Tabla de contenidos
Las estadísticas es algo muy importante en el diseño y programación web. Sencillamente si nosotros obtenemos cierta información de los clientes como puede ser que resolución de pantalla utiliza, por que navegador suelen entrar o que país es el que predomina podemos adaptar todo el diseño/contenido y focalizarlo hacía el sector que más nos convenga.
Para ello hay infinidades de herramientas capaz de realizar estos procesos. Nosotros empezaremos con una muy conocida y que da muy buen rendimiento y como no es de software libre. La herramienta en concreto se hace llamar AWStats.
AWStats es una aplicación que simplemente realiza la función de analizar e interpretar los logs. Entre muchos puede analizar los logs de Apache(2) y así darnos cierta información en forma de estadísticas sobre los visitantes o mostrarnos que navegador es el más utilizado..
Lo bueno de esta aplicación es que lógicamente es accesible desde una interface web y que tiene una gran estabilidad. Quizás al principio podamos ver demasiada información acumulada pero uno se acostumbra rápido a saber interpretarla.
No me voy a entretener mucho hoy aquí, simplemente el sistema operativo que estamos utilizando es una distribución GNU/Linux bajo el nombre Debian Squeeze en su modalidad de 64bits.
Nota: Tendríamos que tener conocimientos medios de Apache2 para realizar bien todos los pasos que aquí se presentan.
Vamos a explicar por encima el funcionamiento de AWStats. Sencillamente como hemos explicado lo que hace es generar una serie de registros en formato html por medio de los logs de apache. Bien, cuando nosotros llamamos a la aplicación escrita en perl ( awstats.pl ) y le pasamos el fichero de configuración que hemos determinado ( más alante se explica ) con el flag -update lo que hace es revisar el log de apache y generar una serie de archivos como ya repetidas veces hemos dicho.
Los archivos que genera no son bien bien html, si no que son datos estructurados que más tarde la propia aplicación ( awstats.pl ) necesitará para mostrarnos la información en formato html.
Por lo tanto, cuando nosotros queremos entrar a la aplicación lo hacemos de la siguiente forma:
http://midominio.org/awstats.pl?config=midominio.org
Como podemos ver estamos llamando a «awstats.pl» para que genere los informes. Por lo tanto tendremos que tener las librerías as de Perl CGI en funcionamiento.
Para que todo esto funcione correctamente y de forma limpia deberemos de tener en cuenta que los logs de apache tienen que estar separados por dominio. Esto quiere decir que tendremos que editar las directivas de configuración de cada uno de nuestros VirtualHost añadiendo rutas personalizadas de logs. Aquí no lo voy a explicar ya que pienso explicarlo en el post de configuración de Apache2.
Simplemente voy a indicar que mis logs están formados con la siguiente sintaxis:
/var/log/apache2/
Como podemos ver consta de:
[TIPO_LOG]_[SUBDOMINIO]_[DOMINIO]_[TLS].log
A continuación instaremos el paquete introduciendo lo siguiente:
1 |
apt-get install awstats |
Si no nos ha dado ningún problema ya está instalado.
Primero, lo que tendremos que hacer es añadir la configuración de awstats a la de apache, para ello introduciremos lo siguiente en la linea de comandos:
1 |
cp /usr/share/doc/awstats/examples/apache.conf /etc/apache2/conf.d/awstats |
Con esto estamos copiando la configuración de ejemplo que tiene awstats en el directorio de configuraciones de apache.
Ahora vamos hacer unas modificaciones en el fichero ( la verdad es que son muchas ) así que copiaremos y pegaremos esta configuración:
1 |
nano /etc/apache2/conf.d/awstats |
Ahora introducimos lo siguiente:
1 2 3 4 5 6 7 8 9 10 |
<Directory /var/lib/awstats> Options None AllowOverride None Order allow,deny Allow from all </Directory> Alias /awstatsicon/ /usr/share/awstats/icon/ Alias /awstatsclasses/ /usr/share/java/awstats/ ScriptAlias /awstats/ /usr/lib/cgi-bin/ |
Después de todos estos cambios reiniciaremos el servicio de apache.
1 |
/etc/init.d/apache2 restart |
La verdad es que con el fichero de configuración nos pasará igual… mucho comentario y pocas nueces. Así que vamos a eliminar directamente el archivo de configuración básico:
1 |
rm -R /etc/awstats/awstats.conf |
Ahora crearemos un fichero de ejemplo. Aquí podemos ver las campos necesarios para que funcione las estadísticas en base a un dominio dado.
1 |
nano /etc/awstats/awstats.dominio.org.conf |
1 2 3 4 |
LogFile="/var/log/apache2/access_dominio_org.log" SiteDomain="dominio.org" LogFormat=1 DirIcons="/awstatsicon" |
Como podemos ver son pocos los campos. Principalmente estamos definiendo el acceso al log principal del dominio, el dominio, el tipo de formato del log y el directorio de iconos.
Para que todo funcione correctamente tendremos que arreglar una serie de permisos. Así que editaremos los permisos de los logs de apache introduciendo el siguiente comando:
1 |
chmod o+r /var/log/apache2/* |
Aquí vamos a crear un VirtualHost para ello. El objetivo es que tengamos un subdominio por servicio y no un directorio. Así que para crear el nuevo VirtualHost nos vamos al directorio «/etc/apache2/sites-available».
Vamos a crear un nuevo documento:
1 |
nano stats.midominio.org |
Ahora añadimos lo siguiente:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<VirtualHost *:80> DocumentRoot "/var/lib/awstats" ServerAlias stats.dominio.org <Directory /var/lib/awstats> Options None AllowOverride all Order allow,deny Allow from all </Directory> Alias /awstatsicon/ /usr/share/awstats/icon/ Alias /awstatsclasses/ /usr/share/java/awstats/ ScriptAlias / /usr/lib/cgi-bin/ </VirtualHost> |
Ahora guardamos el documento y habilitamos el sitio:
1 |
a2ensite stats.midominio.org |
Atención! Implementando esto ( como ya lo pone es opcional ) tendremos que cargarnos la configuración anterior ( la que se encuentra en el directorio de configuración de apache ) para ello realizaremos simplemente lo siguiente:
1 |
rm -R /etc/apache2/conf.d/awstats |
Con ello habremos eliminado la configuración anterior. Ahora reiniciaremos apache para que se cargue las nuevas modificaciones.
1 |
/etc/init.d/apache2 restart |
Esto es MUY OPCIONAL simplemente nos servirá para mejorar algunos aspectos visuales en la UR.
Esto que va hacer? Esto nos facilitará una dirección URL más amigable, esto quiere decir que el acceso será más sencillo.
Por ejemplo pongamos el caso que tenemos la siguiente dirección de acceso a nuestro awstats:
Esto es bastante largo, sería más sencillo si fuera de la siguiente manera:
Simplemente toda la otra parte de la URL la añadirá el solito.
Por lo tanto para activar el modulo tan solo realizaremos lo siguiente:
1 |
a2enmod rewrite |
Ahora reiniciaremos el servicio de apache:
1 |
/etc/init.d/apache2 restart |
Nota: Si no te quieres complicar la vida no hace falta que lo hagas!
Esto se va complicando verdad? ahora vamos a implementar el módulo RewriteEngine junto con el sistema de subdominio. Esto como ya he dicho en el apartado anterior nos será de utilidad ( aun que tampoco variará mucho la forma de trabajar simplemente es mera comodidad.
Primero vamos a realizar algunos cambios en el VirtualHost que hemos creado:
1 |
nano stats.midominio.org |
Tendría que quedar así:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<VirtualHost *:80> DocumentRoot "/var/www/__srv/awstats" ServerAlias stats.dominio.org <Directory /var/www/__srv/awstats> Options None AllowOverride all Order allow,deny Allow from all </Directory> Alias /awstatsicon/ /usr/share/awstats/icon/ Alias /awstatsclasses/ /usr/share/java/awstats/ ScriptAlias /awstats/ /usr/lib/cgi-bin/ </VirtualHost> |
Exactamente que hemos editado?
1 |
nano /var/www/__srv/awstats/.htaccess |
1 2 3 4 5 6 7 8 |
Options +FollowSymLinks RewriteEngine On #@@-> Cuando visitamos raiz "/" vamos a awstats #RewriteRule ^/?$ /awstats/awstats.pl?config=midominio.org [R=301,L] #@@-> Cuando visitamos otra cosa que no sea raiz o awstats saltamos #RewriteRule !^(/?|awstats(/.*)?)$ /awstats/awstats.pl?config=$1 [R=301,L] #@@-> Redirigimos cualquier campo ( "directorio" ) al config RewriteRule ^(.*)/$ /awstats/awstats.pl?config=$1 [R=301,L] |
Ahora mismo con esta configuración tendríamos que poder acceder sin problemas mediante la siguiente dirección:
Ahora vamos a realizar un punto muy importante. Como hemos explicado más arriba AWStats genera los ficheros con extensión HTML por medio de los «logs» de apache. Bien, tenemos que tener en cuenta que estos ficheros se tienen que generar cada «X» tiempo.
Existen varias alternativas para lograr esto, desde crear un script enlazado con un cron para que genere los informes cada «X» tiempo o uno que personalmente me gusta más ( y que se encuentra en la Wiki oficial de Debian 😛 ) es anidar la funcionalidad de generar los informes a la vez que apache genera los suyos.
Pero nos encontramos con un pequeño problema que tenemos que añadir una linea por cada informe ( dominio ) que tenemos.. y claro, soy perezoso por naturaleza y si cuando tengo que añadir una nueva linea por cada nuevo dominio que creo… mal voy, así que generaremos un pequeño script que será lanzado conjunto a los informes de apache.
El script viene a ser el siguiente:
1 |
nano /usr/lib/cgi-bin/awstats_auto.sh |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
#!/bin/bash dir="/etc/awstats/"; for i in `ls $dir` do dom=`cat "$dir$i" | grep SiteDomain`; dom=`echo $dom | cut -f2 -d"\""`; if test $dom then /usr/lib/cgi-bin/awstats.pl -config=$dom -update fi done |
El script es bastante sencillo, lo único que hace es realizar un listado del directorio donde están almacenados los «.conf» de los dominios y los lanza con la aplicación de awstats.
EDITADO: He modificado el Script, tiene control de parámetro ( si el fichero es realmente un documento «.conf» o no ) y corregido algunos fallos.
Ahora le daremos permiso de ejecución:
1 |
chmod +x /usr/lib/cgi-bin/awstats_auto.sh |
Y lo más importante lo añadimos al fichero de configuración de apache que se encuentra en:
1 |
nano /etc/logrotate.d/apache2 |
Y lo dejamos así:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
/var/log/apache2/*.log { weekly missingok rotate 52 compress delaycompress notifempty create 640 root adm sharedscripts prerotate /usr/lib/cgi-bin/awstats_auto.sh endscript postrotate /etc/init.d/apache2 reload > /dev/null endscript } |
Ahora reiniciaremos apache para cargar la nueva configuración. Si todo ha ido bien tendríamos que tener los logs automáticos en funcionamiento =).
De nuevo, soy perezoso, y mucho… y me niego a generar manualmente cada uno de los ficheros de configuración de awstats a mano. Así que he generado un pequeño script que realiza esta tarea por mi.
El script en cuestión es el siguiente:
1 |
nano /usr/lib/cgi-bin/awstats_conf.sh |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
#!/bin/bash dir_ap="/etc/apache2/sites-available/"; dir_aw="/etc/awstats/"; for i in `ls $dir_ap` do out="$dir_aw/awstats.$i.conf"; log=`echo $i | tr -s "." "_"`; echo "LogFile=\"/var/log/apache2/access_$log.log\"" > $out echo "SiteDomain=\"$i\"" >> $out echo "LogFormat=1" >> $out echo "DirIcons=\"/awstatsicon\"" >> $out done |
Por último le damos permiso de ejecución:
1 |
chmod +x /usr/lib/cgi-bin/awstats_conf.sh |
Es un script muy sencillo que no tiene control de errores y puede llegar a ocasionar algún tipo de problema, más adelante cuando tenga más tiempo lo mejoraré.
Ahora vamos con otro pequeño script, este tiene como funcionalidad generar un archivo «list.html» que contendrá el nombre de los ficheros dentro de una etiqueta HTML ( li ). Luego este pequeño html será tratado con un pequeño javascript para realizar un listado de las url’s de acceso a las diferentes estadísticas.
Actualmente este pequeño sistema cuenta con cuatro documentos:
Primero mostramos index.html:
1 |
nano /var/www/__srv/awstats/index.html |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<html> <head> <title>Index AWStats</title> <script type="text/javascript" src="jquery-1.7.2.min.js"></script> </head> <body style="font-family:arial"> <script type="text/javascript"> //Introducimos las listas $.get('list.html',function(data){ $("ul").append(data); }); </script> <h1>Index AWStats</h1> <hr/> <ul> </ul> </body> </html> |
Y ahora mostraremos el script awstats_index.sh
1 |
nano /usr/lib/cgi-bin/awstats_index.sh |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
#!/bin/bash dir_aw="/etc/awstats/"; dir_in="/var/www/__srv/awstats/"; out="$dir_in/list.html"; echo "" > $out for i in `ls $dir_aw` do dom=`cat "$dir_aw$i" | grep SiteDomain`; dom=`echo $dom | cut -f2 -d"\""`; if test $dom then echo "<li><a href=\"/$dom/\">$dom</a></li>" >> $out fi done |
Nota: Los documentos «list.html» y «jquery-1.7.2.min.js» no los mostraré ya que uno es autogenerado y otro descargado.
Vale, como podemos observar tampoco tiene el tema mucha complicación. Cuando ejecutamos el script «awstats_index.sh» estamos generando el fichero «list.html» en el directorio «/var/www/__srv/awstats/» con una serie de etiquetas «<li>» que en su interior contienen el enlace relativo de las estadísticas. Más tarde el fichero «index.html» con un pequeño código javascript ( con la ajuda de la librería JQuery ) añade el contenido de «list.html» a su interior.
Este tema tambien es importante. Imaginate que algún maldito robot nos juega una mala pasada e indexa todos los reportes en público… nos podríamos meter en un buen lio verdad? por lo tanto tenemos que proteger el directorio de AWStats con una contraseña. Apache con mucha facilidad nos permite esto.
Primero tendremos que crear un directorio donde almacenar las contraseñas, para ello teclearemos lo siguiente:
1 |
mkdir /etc/apache2/pwd |
Ahora crearemos el fichero de la siguiente manera:
1 |
htpasswd -cb /etc/apache2/.htpasswd_awstats luis.diaz mipasswd |
Ahora para añadir un nuevo usuario realizamos lo siguiente:
1 |
htpasswd -b /etc/apache2/.htpasswd_awstats user2 passwd2 |
Como podemos observar el segundo comando no tiene el flag «-c».
Ya tenemos el fichero creado y ahora que? bueno, tenemos dos opciones o bien añadimos a la configuración del site los valores pertinentes para que acepte la configuración o bien editamos nuestro fichero .htaccess. Prefiero editar el fichero .htaccess ya que la configuración del site es genérica. PERO EN ESTE CASO como el site de por si no cumple las normas genéricas de los otros ya implementados lo añadiremos directamente.
Así que realizamos lo siguiente:
1 |
nano /etc/apache2/sites-available/stats.midominio.org |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
<VirtualHost *:80> DocumentRoot "/var/www/__srv/awstats/" ServerAlias stats.midominio.org <Directory /var/www/__srv/awstats/> Options None AllowOverride all Order allow,deny Allow from all AuthUserFile /etc/apache2/pwd/.htpasswd_awstats AuthName "AWStats - Login" AuthType Basic require valid-user </Directory> #Logs ErrorLog ${APACHE_LOG_DIR}/error_stats_midominio_org.log LogLevel info CustomLog ${APACHE_LOG_DIR}/access_stats_midominio_org.log combined Alias /awstatsicon/ /usr/share/awstats/icon/ Alias /awstatsclasses/ /usr/share/java/awstats/ ScriptAlias /awstats/ /usr/lib/cgi-bin/ </VirtualHost> |
Guardamos el documento y reiniciamos apache.
Ahora comprobamos que funciona intentando entrar, si nos pide el usuario y la contraseña y nos deja entrar es que funciona correctamente.
Bueno comprobando el funcionamiento de todo esto me he dado cuenta que hay ciertos problemas en los permisos de los logs… y otros ficheros.
Revisando el correo me he encontrado con los siguientes mensajes:
1 2 3 4 5 6 |
Create/Update database for config "/etc/awstats/awstats.demo.sdsbdn.org.conf" by AWStats version 6.95 (build 1.943) From data in log file "/var/log/apache2/access_demo_sdsbdn_org.log"... Warning: HostAliases parameter is not defined, awstats choose "demo.sdsbdn.org localhost 127.0.0.1". Error: Couldn't open server log file "/var/log/apache2/access_demo_sdsbdn_org.log" : Permission denied Setup ('/etc/awstats/awstats.demo.sdsbdn.org.conf' file, web server or permissions) may be wrong. Check config file, permissions and AWStats documentation (in 'docs' directory). |
Realmente lo que he echo es cambiar los permisos del directorio apache:
1 |
chmod 644 /var/log/apache2/ |
Eso nos dará permisos de lectura en todo lo que necesitemos. Pero como estos logs se auto generan tenemos el problema de que los permisos también se modifican por lo tanto modificaremos también la configuración del logrotate para que genere los archivos con los permisos pertinentes:
1 |
nano /etc/logrotate.d/apache2 |
Quedando así:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
/var/log/apache2/*.log { weekly missingok rotate 52 compress delaycompress notifempty create 644 root root sharedscripts prerotate /usr/lib/cgi-bin/awstats_auto.sh endscript postrotate /etc/init.d/apache2 reload > /dev/null endscript } |
Por si acaso modificaremos también los permisos por medio del script que lanzamos ( awstats_auto.sh ) así que lo editaremos:
1 |
nano /usr/lib/cgi-bin/awstats_auto.sh |
Quedando así:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
#!/bin/bash dir="/etc/awstats/"; apc="/var/log/apache2"; chmod 644 $apc/*.log for i in `ls $dir` do dom=`cat "$dir$i" | grep SiteDomain`; dom=`echo $dom | cut -f2 -d"\""`; if test $dom then /usr/lib/cgi-bin/awstats.pl -config=$dom -update fi done |
Una vez realizado estonos aparece otro problemaque viene a ser el siguiente:
1 2 3 4 5 6 7 8 |
Create/Update database for config "/etc/awstats/awstats.demo.sdsbdn.org.conf" by AWStats version 6.95 (build 1.943) From data in log file "/var/log/apache2/access_demo_sdsbdn_org.log"... Phase 1 : First bypass old records, searching new record... Direct access to last remembered record is out of file. So searching it from beginning of log file... Error: Couldn't open file "/usr/lib/cgi-bin/awstats062012.demo.sdsbdn.org.tmp.9152" for write: Permission denied Setup ('/etc/awstats/awstats.demo.sdsbdn.org.conf' file, web server or permissions) may be wrong. Check config file, permissions and AWStats documentation (in 'docs' directory). |
Como podemos ver no tiene permisos en el directorio «/usr/lib/cgi-bin/» para crear el temporal ( de escritura si lo vemos bien ) por lo tanto le daremos permisos:
1 |
chmod 666 /usr/lib/cgi-bin/ |
Por último a realizar esto aparece un último error:
1 2 |
Error: Couldn't open config file "awstats.awstats.conf" nor "awstats.conf" after searching in path "/usr/lib/cgi-bin, /etc/awstats,/usr/local/etc/awstats,/etc,/etc/opt/awstats": No such file or directory |
Así que lo he solucionado creando un awstats.awstats.conf simbólico:
1 |
ln -s awstats.sdsbdn.org.conf awstats.awstats.conf |
Y en teoría los errores han sido solucionados =) y actualiza de momento bien AWStats!