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.pl
- 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.pl
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.