GoAccess unter Fedora mit Nginx

GoAccess wertet die Logfiles des Webservers aus, ist dabei sehr simpel und schnell. Das passt perfekt zu meinen Ansprüchen. Gedacht ist eine Auswertung im Terminal, aber auch ein HTML-Export ist vorgesehen. Ich hatte die Erstellung der HTML-Seite in mein tägliches Backup-Skript integriert. Leider hatte ich es bisher nie geschafft es in Echtzeit laufen zu lassen. Nun ist es mir endlich gelungen!

Nginx hinter Reverse Proxy

Mein Blog läuft hinter einem Reverse Proxy und ich hatte bisher das Problem, die reale IP-Adresse, z.B. für Fail2Ban, vernünftig auszuwerten. Als ich mich mit GoAccess beschäftigt habe, bin ich auf die Lösung gestoßen.

$ sudo nano /etc/nginx/nginx.conf

An einer Stelle im HTTP-Block die folgenden zwei Zeilen hinzufügen.

http {
    ...
    set_real_ip_from X.X.X.X;
    real_ip_header X-Forwarded-For;
    ...
}

Nginx Konfiguration

Je nachdem welche Anleitung man zu GoAccess findet, ist die Konfiguration des Proxy von Nginx für GoAccess unterschiedlich. Ich bin hier noch nicht ganz durchgestiegen, wann man welchen Parameter benötigt. Dafür beschäftige ich mich dann doch zu wenig damit.

$ sudo nano /etc/nginx/sites-available/blog

Ich möchte die Auswertung mit GoAccess unter meiner Domain des Blogs im Unterverzeichnis /stats abrufen. Das soll natürlich nicht jeder können und der Zugriff ist über eine Authentifizierung beschränkt.

location /stats {
        access_log off;

        auth_basic "Restricted Content";
        auth_basic_user_file /etc/nginx/.htpasswd;

        alias /var/www/stats;
        index report.html;
    }

    location /stats/ws {
        access_log off;

        auth_basic "Restricted Content";
        auth_basic_user_file /etc/nginx/.htpasswd;

        alias /var/www/stats;
        index report.html;

        proxy_pass http://localhost:7890;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "Upgrade";
    }

Über den Websocket /ws wird die Auswertung dann bei Zugriff und in "Echtzeit" generiert. Nicht vergessen die Änderungen zu testen und Nginx einmal neu zu starten.

$ nginx -t
$ systemctl restart nginx.service

GoAccess

Ich verwende aktuell Fedora 33 Server Edition und hatte zunächst über den Paketmanager dnf versucht GoAccess ans Laufen zu bekommen. Das war leider nicht von Erfolg gekrönt. Ich habe zudem Unterschiede zwischen der Webseite und der Installation bemerkt. Ich habe mir es dann letztendlich von der Webseite heruntergeladen und selber kompiliert.

$ dnf install ncurses-devel geoip-devel
$ wget https://tar.goaccess.io/goaccess-1.4.5.tar.gz
$ tar -xzvf goaccess-1.4.5.tar.gz
$ cd goaccess-1.4.5/
$ ./configure --enable-debug --enable-utf8 --enable-geoip=legacy --with-getline
$ make
$ make install

Die Konfiguration liegt dann unter /usr/local/etc/goaccess/ und goaccess selbst unter /usr/local/bin/. Damit der Befehl goaccess wieder funktionierte, habe ich dies einfach wieder verknüpfen.

$ cd /bin
$ ln -s /usr/local/bin/goaccess goaccess

Die Konfiguration von GoAccess habe ich dann nach meinen Wünschen angepasst.

$ nano /usr/local/etc/goaccess/goaccess.config

Ich habe im folgenden nur meine Änderungen an der Konfigurationsdatei festgehalten und die restlichen Parameter so belassen.

...
date-format %d/%b/%Y
...
log-format %h %^[%d:%t %^] "%r" %s %b "%R" "%u"
...
log-format COMBINED
...
addr 127.0.0.1
...
origin https://sharky.koeln
...
port 7890
...
real-time-html true
...
ws-url sharky.koeln:443/stats/ws
...
log-file /var/log/nginx/blog.access.log
...
anonymize-ip true # Datenschutzrichtlinie!
...
keep-last 7 # Datenschutzrichtlinie!
...
ignore-referer sharky.koeln
...
std-geoip true
...
db-path /tmp
...
persist true
...
restore true

Über den folgenden Befehl kann die Konfiguration zunächst getestet werden.

$ goaccess -o /var/www/stats/report.html --config-file=/usr/local/etc/goaccess/goaccess.conf

Systemd

Der Autostart und Betrieb wird mit systemd realisiert.

$ nano /etc/systemd/system/goaccess.service

Der Dienst hat den folgenden Inhalt.

[Unit]
Description=Goaccess Web log report.
After=network.target

[Service]
Type=simple
User=root
Group=root
Restart=always
ExecStart=/bin/goaccess -o /var/www/stats/report.html --config-file=/usr/local/etc/goaccess/goaccess.conf
StandardOutput=null
StandardError=null

[Install]
WantedBy=multi-user.target

Zu guter Letzt noch den Dienst starten und den Autostart einrichten

$ systemctl start goaccess.service
$ systemctl enable goaccess.service

Quellen

GoAccess

Yannick Pereira-Reis

bytes fyi

Anson Vandoren