Analítica web en el servidor sin JavaScript en el cliente con GoAccess

Escrito por picodotdev el .
planeta-codigo web
Enlace permanente Comentarios

Google Analytics es la herramienta más utilizada para implementar la funcionalidad de analítica en un sitio web. Es fácil de usar, de implementar, no requiere mantenimiento de infraestructura propia, es gratuita, ofrece numerosas funcionalidades que ayudan enormemente a obtener información del sitio web, de los usuarios, obtener informes. Sin embargo, Google Analytics es una tercera parte con la que se comparte la información del sitio web que supone una pérdida de privacidad y protección de datos del sitio web y requiere instalar un script de JavaScript que ralentiza la carga de las páginas web. GoAccess ofrece analítica web en tiempo real que al contrario que Analytics obtiene los datos únicamente desde el lado del servidor basándose en los archivos del log del servidor web, es software libre y es utilizable sin necesidad de involucrar a terceras partes.

GoAccess

La analítica web es una funcionalidad imprescindible en la mayoría de sitios públicos accesibles desde internet web incluso en aquellos privados. La analítica web es una funcionalidad que proporciona valiosa información acerca del sitio web, desde número de visitas en determinados periodos de tiempo así como información de los usuarios y la interacción de estos con el sitio web.

La información proporcionada por la analítica web ayuda a la toma de decisiones basadas en datos observando el comportamiento de los usuarios en el sitio web con métricas que permiten conocer cuales son las páginas más visitas, en cuales permanecen más tiempo, que versión de navegador web usan, cuales son los países de los usuarios, cuál es el tráfico por hora del día, las fuentes del tráfico, sitios web de referencia, tráfico según días de la semana, ciertas fechas señaladas, periodos de vacaciones u cualesquiera otras formas de conocimiento interesantes para el negocio.

Google Analytics, la herramienta más utilizada para hace analítica web

La herramienta más utilizada para hacer analítica web es Google Analytics, es gratuita, fácil de instalar en un sitio web y tiene gran cantidad de funcionalidades básicas y avanzadas que cubren las necesidades de cualesquiera usuarios. Almacena la información recogida a lo largo del tiempo que es consultable con posterioridad incluso pasados varios años de forma muy flexible con diferentes criterios de búsqueda y filtros, también ofrece varios paneles para observar el tráfico en tiempo real.

Goolge Analytics

Goolge Analytics

Basta con tener una cuenta de Google para tener acceso a Google Analytics. Para integrarlo en un sitio web únicamente requiere insertar el script de JavaScript proporcionado por Google Analytics al configurar el sitio web en todas las páginas del sitio web. Este script se ejecuta en el navegador del usuario, recopila información y la envía a Google para su procesamiento y generación de la analítica web.

1
2
3
4
5
6
7
8
<!-- Google Analytics -->
<script>
window.ga=window.ga||function(){(ga.q=ga.q||[]).push(arguments)};ga.l=+new Date;
ga('create', 'UA-XXXXX-Y', 'auto');
ga('send', 'pageview');
</script>
<script async src='https://www.google-analytics.com/analytics.js'></script>
<!-- End Google Analytics -->
google-analytics-script.html

El principal inconveniente de Google Analytics es introducir una tercera parte en la relación entre el sitio web y el usuario, una tercera parte que recoge métricas del sitio web e información de los usuarios. Los sitios web han de tener en cuenta que han de cumplir con las regulaciones y leyes como la GDPR en Europa en el tratamiento de la información de los usuarios para para proteger la privacidad de los usuarios que algunas empresas ponen en riesgo si no fuera por esas leyes que impiden o ponen límites a la recopilación de datos bajo penas de importantes multas, utilizar cookies de seguimiento que permiten identificar a los usuarios de forma inequívoca o el tratamiento de información personal. Leyes que afectan también a la propia Google junto a otras empresas como Amazon, Facebook o Twitter de EEUU con unas regulaciones más permisivas, las leyes les afecta por ejemplo impidiendo transferir los datos de los usuarios europeos fuera de Europa.

La privacidad del los usuarios ya es un buen motivo para utilizar una alternativa a Google Analytics. Otro motivo es que el script de Google Analytics se ejecuta en el navegador del usuario y afecta en una pequeña medida al rendimiento en la carga de la página web.

Otros sitios web privados de una intranet u aquellos que tienen interés en proteger la privacidad de sus usuarios prefieren utilizar otras herramientas para realizar analítica del sitio web que no involucren terceras partes.

GoAccess, una alternativa de analítica

GoAccess es una pequeña utilidad que cubre una pequeña parte de la funcionalidad de analítica de un sitio web, en concreto ofrece la analítica en tiempo real de uno o múltiples sitios web, Matomo es una alternativa equivalente a Google Analytics que ofrece las funcionalidades de tracking de eventos y tag manager. Sus características principales son que es una herramienta sencilla y pequeña, no requiere insertar ningún script en las páginas del sitio web, no involucra terceras partes y es software libre.

Para realizar la analítica web no requiere insertar ningún script de JavaScript en el cliente lo que mejora el tiempo de carga de las páginas. La analítica la hace completamente en el lado del servidor analizando los archivos de log de acceso y errores del servidor web. Soporta los servidores web más utilizados como Nginx y Apache HTTPD.

GoAccess permite obtener información de analítica en tiempo real del número de usuarios, que navegadores utilizan, URLs solicitadas, distribución de las peticiones en el tiempo, navegadores y sistemas operativos de los usuarios, sitios y URLs de referencia, palabras clave de búsqueda, códigos de estado HTTP, geolocalización, … Ofrece dos interfaces distintas, una basada en una interfaz de terminal y otra basada en una interfaz web.

Analítica de sitio web con GoAccess en un servidor web Nginx

En el ejemplo de uso de GoAccess para realizar analítica web de un servidor web y acceder a las dos interfaces que ofrece utilizo la herramienta Docker que evita tener que instalar estas herramientas de forma directa en la computadora, hace fácil su instalación, prueba, uso y eliminación de la computadora local una vez evaluada la herramienta. En el ejemplo el servidor web que he utilizado ha sido Nginx para Apache HTTPD se sigue el mismo principio de proporcionar a GoAccess los archivos de log de acceso al servidor web.

Para realizar el ejemplo son de utilidad los siguientes otros artículos en los que me he apoyado para crear este.

Lo primero es crear una imagen de Docker con GoAccess, la imagen oficial de Docker para GoAccess es allinurl/goaccess, sin embargo esta no me ha funcionado y he tenido que crear una propia basada en Ubuntu. El archivo Dockerfile para crear la imagen de Docker con GoAccess y el comando para construirla son los siguientes.

1
2
3
4
5
6
7
8
9
FROM ubuntu:20.04
MAINTAINER picodotdev <pico.dev@gmail.com>

RUN apt-get -y update && apt-get -y install goaccess

VOLUME /var/www/goaccess
EXPOSE 7890

CMD ["/bin/goaccess"]
Dockerfile
1
2
#!/usr/bin/env bash
docker build -t "picodotdev/goaccess:1.0" docker/
docker-build.sh

Una vez construida la imagen de GoAccess se almacena en el repositorio local de imágenes.

1
2
$ docker images

docker-images.sh
1
2
3
4
5
REPOSITORY            TAG       IMAGE ID       CREATED          SIZE
picodotdev/goaccess   1.0       677276d5bc0d   37 minutes ago   102MB
allinurl/goaccess     latest    e48d0ac2f6d1   11 hours ago     14.3MB
nginx                 latest    ae2feff98a0c   3 weeks ago      133MB
ubuntu                20.04     f643c72bc252   6 weeks ago      72.9MB
docker-images.out

Nginx también tiene su propia imagen de Docker, en este caso utilizo la imagen oficial del servidor web. Se requiere iniciar dos contenedores de Docker, uno para el servidor web Nginx con varios volúmenes de datos configurados enlazados con los directorios de la máquina anfitrión para proporcionarle los archivos de configuración para los servidores web virtuales de un sitio web a analizar, el servidor virtual de la interfaz web de GoAccess y para compartir con GoAccess los archivos de log dal servidor web. El segundo contenedor es el de GoAccess utilizando la imagen propia también con varios volúmenes de datos configurados, entre ellos el del directorio con los archivos de log de acceso del servidor web.

La configuración de Nginx incluye servidores web virtuales y configuración de proxy con WebSockets para ofrecer las métricas en tiempo real desde la interfaz web.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
log_format nginx_vcombined '$host:$server_port ' '$remote_addr - $remote_user [$time_local] ' '"$request" $status $body_bytes_sent ' '"$http_referer" "$http_user_agent"';

server {
    listen 80;
    server_name www.127.0.0.1.xip.io;

    access_log /var/log/nginx/nginx-access.log nginx_vcombined;
    error_log /var/log/nginx/nginx-error.log;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }
}
www.127.0.0.1.xip.io.conf
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
log_format goaccess_vcombined '$host:$server_port ' '$remote_addr - $remote_user [$time_local] ' '"$request" $status $body_bytes_sent ' '"$http_referer" "$http_user_agent"';

server {
    listen 80;
    server_name goaccess.127.0.0.1.xip.io;

    access_log /var/log/nginx/goaccess-access.log goaccess_vcombined;
    error_log /var/log/nginx/goaccess-error.log;

    location /report.html {
        root   /usr/share/goaccess/html;
    }

    location / {
	proxy_pass http://goaccess:7890;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "Upgrade";
	proxy_set_header Host $host;
	proxy_set_header X-Real-IP $remote_addr;
	proxy_set_header X-Forwarded-Proto https;
    }
}

goaccess.127.0.0.1.xip.io.conf

En el archivo de configuración de GoAccess o en la configuración desde la linea de comandos se especifican varias propiedades de configuración.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
port 7890
ws-url goaccess.127.0.0.1.xip.io:80

log-format VCOMBINED
log-file /var/log/nginx/nginx-access.log
log-file /var/log/nginx/goaccess-access.log

output /usr/share/goaccess/html/report.html
real-time-html true

goaccess.conf

Ambos contenedores están definidos en un archivo de Docker Compose.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
version: "3.9"
services:
  goaccess:
    image: picodotdev/goaccess
    ports:
      - "7890"
    volumes:
      - ${PWD}/goaccess.conf:/etc/goaccess/goaccess.conf
      - ${PWD}/nginx/log:/var/log/nginx:ro
      - ${PWD}/nginx/goaccess:/usr/share/goaccess/html
    command: ["--no-global-config", "--config-file=/etc/goaccess/goaccess.conf"]
  nginx:
    image: nginx
    ports:
      - "80:80"
    volumes:
      - ${PWD}/www.127.0.0.1.xip.io.conf:/etc/nginx/conf.d/www.127.0.0.1.xip.io.conf:ro
      - ${PWD}/goaccess.127.0.0.1.xip.io.conf:/etc/nginx/conf.d/goaccess.127.0.0.1.xip.io.conf:ro
      - ${PWD}/nginx/log:/var/log/nginx
      - ${PWD}/nginx/goaccess:/usr/share/goaccess/html:ro
    depends_on:
      - goaccess
docker-compose.yml
1
2
$ docker-compose up

docker-compose-up.sh

GoAccess se puede iniciar individualmente para acceder a su interfaz basada en la terminal.

1
2
3
$ docker run -it --rm \
    -v "${PWD}/nginx/log:/var/log/nginx" \
    picodotdev/goaccess:1.0 goaccess --no-global-config --log-format=VCOMBINED /var/log/nginx/nginx-access.log /var/log/nginx/goaccess-access.log
goaccess-run.sh

Una vez los contenedores están en ejecución es posible acceder a las interfaces que ofrece GoAccess y observar las métricas que ofrece del acceso a los sitios web.

1
2
$ docker ps

docker-ps.sh

Interfaz de terminal

La interfaz de terminal o consola no requiere herramientas adicionales, desde la propia terminal es posible acceder a la información de analítica. Hay que ejecutar el comando de GoAccess, al usar Docker desde dentro de su contenedor.

1
2
3
$ docker run -it --rm \
    -v "${PWD}/nginx/log:/var/log/nginx" \
    picodotdev/goaccess:1.0 goaccess --no-global-config --log-format=VCOMBINED /var/log/nginx/nginx-access.log /var/log/nginx/goaccess-access.log
goaccess-run.sh

Es posible navegar entre los diferentes paneles de analítica pulsando varias teclas, la tecla de navegación están documentadas en una ventana de ayuda a la que se accede con la tecla ?, en la ayuda están indicadas el reto de teclas de navegación en la interfaz.

Interfaz consola de analítica GoAccess

Interfaz consola de analítica GoAccess

Interfaz de navegador web

La interfaz de terminal no es la más cómoda de usar ni más accesible de forma remota, por ello GoAccess también proporciona una interfaz web accesible con un navegador web.

Para ello genera un archivo html de informe con los datos que se ha de servir desde un servidor web y ofrece un servidor con WebSockets para las métricas en tiempo real. En el ejemplo su dirección de acceso con el navegador http://goaccess.127.0.0.1.xip.io/report.html, la interfaz se actualiza con analítica de acceso del servidor web Nginx del sitio web http://www.127.0.0.1.xip.io/.

Sitio web con Nginx Interfaz web de analítica GoAccess Interfaz web de analítica GoAccess

Sitio web e interfaz web de analítica GoAccess
Terminal

El código fuente completo del ejemplo puedes descargarlo del repositorio de ejemplos de Blog Bitix alojado en GitHub y probarlo en tu equipo ejecutando siguiente comando:
./docker-compose up

Comparte el artículo: