Co prawda na swojej stronie zrobiłem kilka podstawowych statystyk i coś tam sobie loguję do bazy danych, ale gdyby się chwilę zastanowić to przecież to samo robi serwer www - wrzuca do logów każde zapytanie HTTP, kod błędu, nazwę agenta, itd. Dublowanie tych danych nie jest najbardziej optymalne.
Stąd też chwilę pogooglałem i znalazłem świetny Open Source’owy projekt: AWStats, który jest webowym analizatorem logów dla serwerów HTTP, FTP i SMTP.

Instalacja i konfiguracja

Najpierw instalacja, na moim Debianie leci to tak:

sudo apt-get install awstats

Teraz trzeba się chwilę zastanowić nad konfiguracją serwera i celem, który chcemy osiągnąć:

  • czy staty będą dostępne publicznie?
  • czy tylko dla ograniczonego grona zainsteresowanych (np. w pewnej sieci)?
  • a może zabezpieczenie hasłem?

Wiedząc, że AWStats działają jako skrypt CGI wystawianie takiego serwisu “na świat” nie wydaje mi się bezpiecznym rozwiązaniem. Wolę np. skonfigurować serwis tak aby był dostępny tylko w LAN’ie, gdzie mam większą władzę i szybciej poradzę sobie z namierzeniem i zablokowaniem ewentualnego napastnika 😉

Opiszę tylko dwa pierwsze przypadki (jak ktoś chce hasło to szybko znajdzie jak je ustawić) - pierwsza dla leniwych, druga dla ambitnych 😉

Przygotowania

Bez względu na wybraną metodę konfiguracji (leniwą, bądź nie) do działania serwisu potrzebny jest włączony w Apache moduł CGI. Jest tak w domyślnej konfiguracji ale jeśli nie masz pewności to odpal:

a2enmod cgi

Musi też być zdefiniowany katalog ze skryptami CGI z uaktywnioną interpretacją CGI - domyślnie w pliku /etc/apache2/sites-available w pliku default jest poniższa konfiguracja:

ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
<Directory "/usr/lib/cgi-bin">
    AllowOverride None
    Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
    Order allow,deny
    Allow from all
</Directory>

Na potrzeby metody leniwej jest to wystarczająca konfiguracja, dla ambitnych zalecam trochę inne umiejscowienie tego kodu.

Metoda dla leniwych

Ponieważ pakiet AWStats instaluje się przykładową konfiguracją można bardzo szybko uruchomić staty, wystarczy skopiować jeden plik:

cp /usr/share/doc/awstats/examples/apache.conf /etc/apache2/conf.d/awstats

No i tyle 😉

Metoda dla ambitnych

Ambitnym zalecam nieco inną konfigurację: z ograniczeniem dostępu do statystyk wyłącznie z LAN’u i tak samo z dostępem do skryptów CGI. W moim przypadku żaden z wystawianych przezemnie serwisów nie korzysta z CGI, więc udostępnianie tych skryptów wszystkim “zainteresowanym” nie ma sensu.

Proponuję wykorzystać taki lub podobny plik konfiguracyjny dla hosta serwującego statystyki:

<VirtualHost *:80>
        ServerName staty.domena.pl
        ServerAdmin webmaster@domena.pl

        DocumentRoot /var/www/stats/
        <Directory />
                Options FollowSymLinks
                AllowOverride None
        </Directory>
        <Directory /var/www/stats/>
                Options -Indexes FollowSymLinks MultiViews
                AllowOverride None
                Order Deny,Allow
                Deny from all
                Allow from 192.168.1.0/24
        </Directory>

        ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
        <Directory "/usr/lib/cgi-bin">
                AllowOverride None
                Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
                Order Deny,Allow
                Deny from all
                Allow from 192.168.1.0/24
        </Directory>

        <Directory /var/lib/awstats>
                Options None
                AllowOverride None
                Order Deny,Allow
                Deny from all
                Allow from 192.168.1.0/24
        </Directory>

        Alias /awstats-icon/ /usr/share/awstats/icon/
        <Directory /usr/share/awstats/icon>
                Options None
                AllowOverride None
                Order Deny,Allow
                Deny from all
                Allow from 192.168.1.0/24
        </Directory>

        ErrorLog /var/log/apache2/error.log
        LogLevel warn

        CustomLog /var/log/apache2/access.log combined

    <IfModule mod_rewrite.c>
        RewriteEngine On
        RewriteCond $1 !^$
        RewriteCond %{REQUEST_URI} !.*cgi-bin
        RewriteCond %{REQUEST_URI} !.*awstats.pl
        RewriteRule /(.*)/? /cgi-bin/awstats.pl?config=$1 [PT]
        RewriteRule ^/awstats.pl(.*?) /cgi-bin/awstats.pl$1 [QSA,R,L]
    </IfModule>
</VirtualHost>

Z ważnych rzeczy do personalizacji:

  • ServerName - wpisz swoją nazwę serwisu,
  • Allow from 192.168.1.0/24 - zamień na adres/adresy, które Tobie odpowiadają,
  • mod_rewrite - ostatnich kilka linijek wykorzystuje mod_rewrite do uproszczenia odwołań do statystyk, wystarczy wtedy wpisać adres np. tak: http://staty.domena.pl/nazwa.domeny.ktora.nas.interesuje.plexternal link
  • plik zapisujemy jako /etc/apache2/sites-available/awstats

Teraz zostało nam uaktywnienie site’a:

a2ensite awstats

Część wspólna konfiguracji

Teraz tworzymy katalog na skrypt, który wypisze nam dostępne statystyki:

mkdir /var/www/stats
chown -R www-data:www-data /var/www/stats/

Właściwa konfiguracja AWStats

Pliki konfiguracyjne AWStats znajdują się w katalogu /etc/awstats. Jest ich dokładnie 2 szt.:

  • awstats.conf
  • awstats.conf.local

Plik awstats.conf zawiera przykładową konfigurację wystarczającą do odpalenia statystyk dla pojedynczego hosta. Z kolei plik awstats.conf.local jest miejscem gdzie można wrzucić wspólną konfigurację dla kilku plików hostów.

Jeżeli mamy wiele hostów (a taki przypadek tutaj omawiam) to wygodniej będzie nam wrzucić cały plik awstats.conf do awstats.conf.local i w kolejnych plikach konfiguracyjnych zmieniać tylko parametry rozróżniające poszczególne hosty. Robimy więc tak:

mv /etc/awstats/awstats.conf.local /etc/awstats/awstats.conf.local.orig
mv /etc/awstats/awstats.conf /etc/awstats/awstats.conf.local

Teraz musimy zmienić kilka linijek w pliku awstats.conf.local:

# musimy odszukać i zakomentować poniższe linie

LogFile="/var/log/apache/access.log"
SiteDomain=""
HostAliases="localhost 127.0.0.1"
Include "/etc/awstats/awstats.conf.local"

# w ten sposób

#LogFile="/var/log/apache/access.log"
#SiteDomain=""
#HostAliases="localhost 127.0.0.1"
#Include "/etc/awstats/awstats.conf.local"

# dodatkowo odszukujemy linię
LogFormat=4
# i zamieniamy na
LogFormat=1

Teraz możemy utworzyć pliki konfiguracyjne dla naszych vhostów raptem w kilku linijkach, np.:

LogFile="/var/log/apache2/access.log"
SiteDomain="domena.pl"
HostAliases="www.domena.pl"

Include "/etc/awstats/awstats.conf.local"

Oczywiście trzeba wpisać własną lokalizację pliku access.log. W powyższym przypadku jest to lokalizacja domyślna, wspólna dla wszystkich vhostów - rozróżnienie ruchu do poszczególnych vhostów następuje dzięki podaniu parametrów SiteDomain (podstawowej domeny danej strony) oraz HostAliases (innych domen wskazujących na tego samego vhosta).

Ostatnim elementem jest załadowanie pliku ze wspólną konfiguracją.

Zmiana uprawnień do logów

Aby umożliwić dostęp AWStats do logów serwera Apache musimy wykonać dwie czynności. Na początek zmiana atrybutu dla aktualnego pliku log:

chmod o+r /var/log/apache2/access.log

Później musimy zadbać aby logi po rotacji przez logrotate również zachowywały atrybuty, oraz aby przed rotacją AWStats wygenerowało statystyki, których nie zebrało wcześniej. W tym celu zmieniamy plik /etc/logrotate.d/apache2 tak by wyglądał jak poniżej:

/var/log/apache2/*.log {
        weekly
        missingok
        rotate 52
        compress
        delaycompress
        notifempty
        create 644 root adm
        sharedscripts
        prerotate
            /usr/share/doc/awstats/examples/awstats-update
        endscript
        postrotate
                if [ -f /var/run/apache2.pid ]; then
                        /etc/init.d/apache2 restart > /dev/null
                fi
        endscript
}

Przeładowanie konfiguracji Apache

Po tych wszystkich zmianach w konfiguracji musimy zrestartować Apache:

invoke-rc.d apache2 restart

Testy konfiguracji

Aby sprawdzić konfigurację AWStats spróbujemy wejść na stronę:http://staty.domena.pl/cgi-bin/awstats.pl?config=domena.pl

Jeżeli na żadnym z etapów nie popełniliśmy błędu to naszym oczom powinny ukazać się “wspaniałe i upragnione statystyki” 😃

Jedyną delikatną wadą awstats jest “brzydki” i długi link z cgi w środku… Nieco mnie to irytowało, więc przysiadłem chwilę przy mod_rewrite i przygotowałem regułki (były podane w konfiguracji dla ambitnych), które pozwalają rozpocząć przeglądanie statystyk z uproszczonego linku postaci:

http://staty.domena.pl/domena.plexternal link

Proste, czyste i klarowne, bez zbędnych śmieci.

Co prawda koniec tutora, ale nie koniec samej konfiguracji - proponuję aby przejrzeć przykładowy plik z konfiguracją i zapoznać się z zawartymi tam opcjami.