Por seguridad, NGINX no ejecuta CGIs nativamente, por lo que no se puede ejecutar directamente awstats.pl. En NGINX se debe instalar un sistema de estadísticas estáticas actualizables cada 5-10 minutos. Para ello realizamos la instalación de awstats y GEOIP, y configuramos el primero para alimentarse de los logs de NGINX en lugar de los de Apache. La configuración de cron para el update de BBDD es igual que en el caso de Apache:
/etc/awstats# grep nginx awstats.*.com.conf awstats.dominio1.com.conf:LogFile="/var/log/nginx/dominio1.com.access.log" awstats.dominio2.com.conf:LogFile="/var/log/nginx/dominio2.com.access.log" /etc/awstats# cat /etc/crontab (...) # Actualizar bbdd awstats a partir de logs 0-50/10 * * * * root /usr/lib/cgi-bin/awstats.pl -config=dominio1.com -update >/dev/null 23 6 * * * root /usr/lib/cgi-bin/awstats.pl -config=dominio1.com -update >/dev/null 0-50/10 * * * * root /usr/lib/cgi-bin/awstats.pl -config=dominio2.com -update >/dev/null 23 6 * * * root /usr/lib/cgi-bin/awstats.pl -config=dominio2.com -update >/dev/null
A continuación creamos los directorios específicos:
# cd /var/www # mkdir stats # cd stats # mkdir dominio1 # mkdir dominio1/historico # mkdir dominio2 # mkdir dominio2/historico
El siguiente script generará y rotará las estadísticas:
/var/www/stats# cat /usr/local/bin/genera_estadisticas_awstats.sh #!/bin/bash BINSTATIC="/usr/share/doc/awstats/examples/awstats_buildstaticpages.pl" BIN="/usr/lib/cgi-bin/awstats.pl" for WEB in dominio1.com dominio2.com ; do # Entramos en el directorio de ficheros de estadisticas cd /var/www/stats/${WEB}/ # Si estamos a dia 1, guardamos estadisticas del mes pasado antes # de generar las del nuevo mes. Se debe realizar antes de generar # las paginas estaticas nuevas. DIA="`date +%d`" if [ "x${DIA}x" == "x01x" ]; then YESTERDAY="`date -d yesterday +%Y-%m`" OLD="historico" if [ ! -d ${OLD}/${YESTERDAY} ] ; then mkdir -p ${OLD}/${YESTERDAY} cp -f awstats.* ${OLD}/${YESTERDAY} cd ${OLD}/${YESTERDAY}/ ln -sf awstats.${WEB}.html index.html cd /var/www/stats/${WEB}/ fi fi # Generamos las estadisticas nuevas $BINSTATIC -update -config=${WEB} -lang=es -awstatsprog=${BIN} # Generamos un index.html estatico cat > index.html <<EOF <HTML> <CENTER><H1>Estadisticas de acceso a $WEB</H1></CENTER><BR><BR><P> <UL><LI><A HREF="awstats.${WEB}.html">Mes actual.</A></LI> <LI><A HREF="historico/">Historico.</A></LI> </UL></HTML> EOF done
Ponemos dicho script en cron:
# Actualizar estadisticas en disco 5-55/10 * * * * root /usr/local/bin/genera_estadisticas_awstats.sh >/dev/null
Las estadísticas son actualizadas en la bbdd cada 5 minutos (10 entre update y update y en los minutos 5 por el script de generación).
A continuación creamos el fichero de passwords de apache, pero dentro de nginx, y configuramos nginx con autenticación:
#--- Estadisticas estaticas awstats ----------------------------- location /stats { auth_basic "Acceso privado a estadisticas Web"; auth_basic_user_file /etc/nginx/http_passwords; autoindex on; alias /var/www/stats/dominio1.com/; index index.html break; } include /etc/nginx/awstats.conf;
Y se crea el siguiente fichero:
# cat /etc/nginx/awstats.conf; location /awstats-icon/ { alias /usr/share/awstats/icon/; } location /awstatsclasses/ { root /usr/share/awstats/lib/; } location /awstatscss/ { alias /usr/share/doc/awstats/examples/css/; }
También se pueden configurar las estadísticas en un virtualhost:
/etc/nginx/sites-enabled# cat 001-stats server { listen 80; server_name stats.dominio.es; access_log /var/log/nginx/stats.access.log; error_log /var/log/nginx/stats.error.log; root /var/www/stats/dominio.es/; index index.html; location / { auth_basic "Acceso privado a estadisticas Web"; auth_basic_user_file /etc/nginx/http_passwords; autoindex on; alias /var/www/stats/dominio.es/; index index.html break; } include /etc/nginx/awstats.conf; }
Si el servidor cuenta con un backend Apache (que sí que podrá ejecutar awstats.pl), podemos configurar awstats en Apache de la manera tradicional, y hacer un proxypass de las peticiones (un fallback estándar al backend será suficiente).