Configuración de GoAccess y nginx para contar visitas en sitio Web

Me solicitaron contabilizar las visitas y los visitantes únicos a uno de los sitios a los que le doy mantenimiento pero tenía que ser de una forma pública, una sola página, que se viera muy bien en varios tamaños de pantalla y que funcionara de lado del servidor. Pensé que GoAccess era la mejor solución, esta herramienta genera una página única (de momento) en forma de tablero mostrando varios datos además de visitas y visitantes únicos, como; navegadores usados, sistemas operativos, ubicación geográfica, etc.

GoAccess funciona como otros programas de estadísticas al analizar los logs del servidor web y aplicar las reglas y la base de datos geográfica de distribución de IP GeoLite . También funciona con GeoIP2.

Instalación

Utilicé la versión actual que es la 1.2, la instalación es rápida y sencilla. Es cuestión de obtener el archivo, descomprimirlo, configurar y compilar. Suponemos que todo lo vamos a trabajar en el directorio /estadisticas :

cd /estadisticas
wget http://tar.goaccess.io/goaccess-1.2.tar.gz
tar -xzvf goaccess-1.2.tar.gz
cd goaccess-1.2/
./configure --enable-utf8 --enable-geoip=legacy
make
make install

La opción --enable-geoip=legacy nos permite usar la base de datos de IP GeoLite City, también hay que descargarla del sitio oficial y descomprimirla:

wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz
gunzip GeoLiteCity.dat.gz

Configuración

El directorio por defecto para los logs de nginx es /var/log/nginx/ de aquí vamos a sacar los archivos access a analizar.

También debemos ir a editar /usr/local/etc/goaccess.conf y configurar las siguientes opciones:

time-format %H:%M:%S
date-format %d/%b/%Y
log-format %h %^[%d:%t %^] "%r" %s %b "%R" "%u"

Que se corresponde con un log en el siguiente formato

200.25.35.45 - - [29/May/2017:11:53:42 -0600] "GET /index.html HTTP/1.1" 200 133 "http://www.sitioweb.com/" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"

Más información de logs en Wikipedia , también ejecutando man strftime para información sobre el patrón. El archivo goaccess.conf también puede estar en /etc/ o en /usr/etc/ depende como se haya instalado.

Si ahora ejecutamos el programa usando:

goaccess-1.2/goaccess /var/log/nginx/access.log -o salida.html

nos generara un archivo con los resultados de analizar ese archivo, el primer problema viene de que access.log no va a tener todos los registros que necesitamos por lo cual debemos analizar los logs que ya han sido rotados (access*.gz). Y aquí ya hay otro problema, al analizar todos los archivos obtendremos datos de todo cuanto haya, depende tu configuración, pueden ser 2 meses o 3 o más. Ya que GoAccess de momento no cuenta con la capacidad para seleccionar las estadísticas por mes hay que delimitar qué se le va a enviar al programa.

Vamos a generar un archivo .html por cada mes de un determinado año. Abrimos un archivo de shell (visitas.sh) y copiamos los siguientes contenidos

#!/bin/bash

#La configuración de directorios
HOME="/estadisticas/visitas"
GOACCESS="/estadisticas/goaccess-1.2"
TEMP=${HOME}"/logs-temporales"
WEB="/var/www/visitas"

#Determinamos el mes actual
MM=$(date +%m)
AAAA=$(date +%Y)

#Los meses abreviados en inglés porque así lo requiere ésta configuración
#del log de nginx. Ya que bash interpreta los números de forma octal usamos
#"10#" antes del número para convertirlo a decimal
MESES[10#"1"]="Ene"
MESES[10#"2"]="Feb"
MESES[10#"3"]="Mar"
MESES[10#"4"]="Apr"
MESES[10#"5"]="May"
MESES[10#"6"]="Jun"
MESES[10#"7"]="Jul"
MESES[10#"8"]="Aug"
MESES[10#"9"]="Oct"
MESES[10#"10"]="Sep"
MESES[10#"11"]="Nov"
MESES[10#"12"]="Dec"

#Formamos el mes para hacer grep en los logs y definimos el nombre del
#archivo del reporte
MES="/${MESES[10#${MM}]}/${AAAA}:"
ARCHIVO="${MM}-${AAAA}"

#Borramos todos los temporales si hay
rm ${TEMP}/*.* > 2/dev/null
#Copiamos los logs de nginx a temporales
cp -p /var/log/nginx/access* ${TEMP}/
#Descomprimimos los logs en gz
(cd ${TEMP}/ && gunzip access*.gz)
#Leemos lo que hay en todos los logs y seleccionamos sólo los que concuerdan
#con el mes actual, el resultado va a el archivo log que se trabajará
cat ${TEMP}/access.* | grep "${MES}"  > ${ARCHIVO}.log

#Creamos el archivo del reporte final en el servidor web
touch ${WEB}/${ARCHIVO}.html

#Ejecutamos el programa con los parámetros, ir a la documentación para saber
#que significa cada uno y para ver más opciones https://goaccess.io/man
${GOACCESS}/goaccess ${ARCHIVO}.log -o ${WEB}/${ARCHIVO}.html --geoip-database ${HOME}/GeoLiteCity.dat --html-report-title "Visitas ${MM}-${AAAA}"

#Comprimimos el archivo log actual, lo almacenamos en un directorio para
#históricos y limpiamos los temporales
gzip -f ${ARCHIVO}.log
mv -f ${ARCHIVO}.log.gz ${HOME}/logs-historicos/
rm ${TEMP}/*.*

Llegando a este punto ya es funcional, salimos del editor de texto, le damos permisos de ejecución al archivo y lo lanzamos:

chmod +x visitas.sh
./visitas.sh

Si no aparece ningún mensaje quiere decir que se generó el archivo .html en la ubicación definida, ya se puede acceder vía navegador.

Automatización

Como siempre hay que automatizar estos procedimientos para que no dependan de una persona, por ejemplo usando CRON:

sudo crontab -e

y dentro escribimos:

58 * * * * /estadisticas/visitas/visitas.sh #Estadísticas de visitas

Generará el reporte cada hora en el minuto 58.

Conclusión

Según leo, en el futuro tendrá disponibles otros idiomas y la posibilidad de elegir fechas en el análisis de los logs o directamente en la interfaz. Pero así como está funciona bastante bien para un análisis rápido y muy llamativo al interesado.


Creado: 2017-05-29
Actualizado: 2017-05-29