varnishncsa + awstats + nginx + newsyslog

Hier beschreibe ich, wie ich das Erstellen der Logs mit varnishncsa und die Erstellung der Reports mit awstats umgesetzt habe.

Posted by Holm Spitzer on 29. November 2016
In FreeBSD, Varnish, Awstats, Nginx,

Vor einiger Zeit habe ich varnish auf meinen Server installiert, um der Website Beine zu machen. Nun habe ich das Logging komplett umgebaut und nutze varnishncsa zum Schreiben der Logdaten und awstats zur Erstellung der Statistiken. Hier beschreibe ich, wie ich das umgesetzt habe.

Zuerst habe ich das Logformat festgelegt. Dafür habe ich unter /usr/local/etc/varnish die Datei logformat angelegt. Der Name sagt es schon, darin wird das Logformat für varnishncsa festgelegt. Man kann es natürlich auch direkt mittels varnishncsa_logformat in /etc/rc.conf setzen. Da einige Werte aber in double quotes eingeschlossen werden sollen, wird es mit einer separaten Datei für das Logformat einfacher und übersichtlicher. Das Format ist an das NCSA Logformat des Apachen angelehnt.


%{X-Forwarded-For}i %{Host}i %l %u %t \"%r\" %s %b \"%{Referer}i\" \"%{User-agent}i\" %{Varnish:handling}x

Zuerst wird die IP-Adresse des Clients, die nginx in den Header X-Forwarded-For gesetzt hat, geloggt. Danach folgt der Name des vhosts, der ebenfalls von nginx in den Header Host geschrieben wurde. Dann folgen der remote Logname, meistens ein -, dann der Username eines angemeldeten Nutzers, oder ein - falls nicht. Nun folgen der Zeitstempel des Zugriffs (%t), die Requestart, die URL und das verwendete HTTP-Protokoll eingeschlossen in double quotes (%r), der HTTP Statuscode (%s), die Anzahl der gesendeten Bytes (%b), der Referer und der Useragent, beide eingeschlossen in double quotes und zum Schluss das Handling durch Varnish, also ob der Request von Varnish behandelt wurde, an das backend weitergereicht wurde usw. Nun noch das Verzeichnis für das Logfile anlegen, varnishncsa konfigurieren und starten:

mkdir /var/log/varnishncsa
sysrc varnishncsa_enable=YES
sysrc varnishncsa_flags="-t off -P /var/run/varnishncsa.pid -D -a -w /var/log/varnishncsa/varnishncsa.log -f /usr/local/etc/varnish/logformat"
service varnishncsa start

Anschließend habe ich das Logging in nginx deaktiviert und nginx seine Konfiguration neuladen lassen.


access_log off;


service nginx reload

Nun komme ich zu awstats. Ich habe es zuvor mit poudriere bauen lassen und es mit pkg install awstats installiert. Ich beschreibe hier nicht die komplette Konfiguration von awstats, sondern gehe hier mehr oder weniger nur auf die Konfiguration des Logformats und das Auswerten des Varnish-Handlings ein. Es gibt genug HowTos zu Konfiguration von awstats. Ich halte es so, dass ich allgemeine Dinge in die awstats.model.conf schreibe und domainspezifische Dinge in eine extra Datei awstats.holminger.de.conf schreibe, die die Datei awstats.model.conf inkludiert. Die auskommentierten Zeilen stehen für Zeilen, die in der Domainspezifischen Konfiguration überschrieben werden sollen.

/usr/local/www/awstats/cgi-bin/awstats.model.conf


LogFile=“/var/log/varnishncsa/varnishncsa.log”
LogFormat = “%host %virtualname %other %logname %time1 %methodurl %code %bytesd %refererquot %uaquot %extra1”
#SiteDomain=“”
#HostAliases=“localhost 127.0.0.1 REGEX[myserver.com$]”
#DirData=“.”
DirIcons=“/awstatsicons”
StyleSheet=“/awstatscss/awstats_default.css”
AllowToUpdateStatsFromBrowser=0
BuildReportFormat=xhtml
NotPageList=“css js class gif jpg jpeg png bmp ico rss xml swf asc woff woff2 eot svg ttf”
MiscTrackerUrl=“/js/awstats_misc_tracker.js”
…
ExtraSectionName1=“Varnish Cache Handling”
ExtraSectionCodeFilter1=“200 304”
ExtraSectionCondition1=“extra1,(hit|miss|pass|pipe|synth)”
ExtraSectionFirstColumnTitle1=“Varnish handling method”
ExtraSectionFirstColumnValues1=“extra1,(hit|miss|pass|pipe|synth)”
ExtraSectionFirstColumnFormat1=“%s”
ExtraSectionStatTypes1=HL
ExtraSectionAddAverageRow1=0
ExtraSectionAddSumRow1=1
MaxNbOfExtra1=5
MinHitExtra1=1

/usr/local/www/awstats/cgi-bin/awstats.holminger.de.conf


SiteDomain=“holminger.de”
HostAliases=“127.0.1.1 REGEX[holminger.de$] REGEX[jungaus.hamburg$”
DirData=“/usr/local/www/awstats/data/holminger.de”
LogoLink=“https://holminger.de/awstats/"
Include “./awstats.model.conf”

Nun noch das Verzeichnis anlegen, wo awstats seine Daten ablegen soll. Anschließend können wir den ersten Report als statische HTML-Seiten erstellen.


mkdir -p /usr/local/www/awstats/cgi-bin/data/holminger.de
/usr/local/www/awstats/tools/awstats_buildstaticpages.pl -config=holminger.de -update -awstatsprog=/usr/local/www/awstats/cgi-bin/awstats.pl -dir=/data/www/wwwhome/awstats

Wenn das geklappt hat, kann man einen Eintrag in seine Crontab tätigen.

Bleibt nun noch nginx. Dafür habe ich folgende Zeilen in den server Block des http-Servers eingefügt.


        # awstats
        location ^~ /awstats/ {
            alias /data/www/wwwhome/awstats/;
            index awstats.holminger.de.xml;
            auth_basic "Restricted Access!";
            auth_basic_user_file /usr/local/etc/nginx/htpasswd/awstats.htpasswd;
        }

        location ^~ /awstatsicons/ {
            alias /usr/local/www/awstats/icon/;
        }

        location ^~ /awstatscss/ {
            alias /usr/local/www/awstats/css/;
        }

Anschließend nginx nochmal neustarten.

Nur so am Rande. Das Passwort für den User kann man mit


openssl passwd

erzeugen und anschließend mit vi in /usr/local/etc/nginx/htpasswd/awstats.htpasswd speichern.


Username:verschlüsseltes Passwort 

Als letzter Schritt bleibt noch die Rotation des varnishncsa Logfiles mit newsyslog. Dafür habe ich in /usr/local/etc/newsyslog.conf.d die Datei varnishncsa.conf mit folgendem Inhalt angelegt:


# configuration file for newsyslog for varnishncsa 
#
# see newsyslog.conf(5) for details
#
# logfilename          [owner:group]    mode count size when  flags [/pid_file] [sig_num]
/var/log/varnishncsa/varnishncsa.log varnishlog:varnish 640 7 * @T0012 JB /var/run/varnishncsa.pid

Nur kurz zu den Parametern. Zuerst der Pfad zum Logfile, dann folgen Eigentümer, Gruppe und Dateirechte, die das Logfile nach der Behandlung von newsyslog erhalten soll. Ich möchte 7 Logfiles behalten, die Größe, bei der eine Rotation erfolgen soll ist mir egal, dafür möchte ich, dass die Rotation jeden Tag um 0:12 Uhr erfolgen soll (@T0012). Das Logfile soll nach der Rotation als binary file behandelt (B) und bzip2 komprimiert werden (J). Mit der Markierung als binary file verhindern wir, dass newsyslog eine message ins Logfile schreibt. Ganz zum Schluss folgt der Pfad zum pid-File von varnishncsa. In diesem Fall wird SIGHUP als Signal an varnishncsa gesendet, worauf hin varnishncsa das Logfile rotiert bzw. neuanlegt.

Anschließend newsyslog neustarten.


service newsyslog restart

Und das war es dann auch schon.