AWStats on tuttu useimmille webhotellien asiakkaille, koska se löytyy usein cPanelin takaa. Sen ulkonäkö antaa vahvan leyhähdyksen 1990-lukua, mutta AWStats tekee sen mihin se on tarkoitettukin: kertoo kuinka paljon ihmisiä suurin piirtein sivustolla käy, kauanko on viivytty ja mitä on ladattu. Perusasioita siis. Suurin ero vaikkapa Google Analyticsiin tulee siitä, että käyttäjäseurantaa ei ole. Se on asennettavissa AWStatsiin, mutta silloin kannattaa käyttää jotain, jos ei parempaa, niin laajempaa ratkaisua. Tavalliset tilastot AWStats hakee serverin logeista.
Logeihin kirjataan kaikki oleellinen asia käynneistä, mutta siinä on koukku. Jos käytät Varnishia välimuistina, kuten minä, niin suurin osa käynneistä ei koskaan saavu backendissä olevalle serverille, kuten vaikka Apachelle – jos päätyy, niin välimuistisi toimii perin huonosti. Silloin täytyy käyttää Varnishin logeja, mutta ne eivät toimi suoraan. Syy on se, että Varnish logittaa kävijän IP-osoitteeksi frontissa olevan palvelimen, joka esimerkiksi hoittaa portin 443 SSL-liikenteen, ja sen IP on Varnishille 127.0.0.1. Mutta tuo on korjattavissa.
AWStats ja asennus Ubuntulle
Ympäristönä on DigitalOceanin droplet ja Ubuntu 19.04. Edessä on Nginx, sitten Varnish ja sivustot majailevat Apache2 serverillä. Tuo pino ei sinällään vaikuta AWStatsin asentamiseen, mutta kylläkin hieman asettamiseen logikysymyksen takia. Jos käytät jotain muuta kuin Ubuntua, niin komennot eivät toimi muissa, jotka eivät ole Debian-pohjaisia, mutta osannet muuttaa ne. Samat asiat silti aina tehdään.
Käytän aina root-tunnusta SSH:ssa, ja jos se ei ole sinulle vaihtoehto, niin arvo sudo
tai su
oikeisiin paikkoihin.
Asentaminen alkaa tutulla tavalla:
apt update
apt dist-upgrade
Asennetaan AWStats sekä GeoIP:n tunnistamiseen tarvittavat pearl-palikat.
apt install awstats libgeo-ip-perl libgeo-ipfree-perl
Apachen asetukset
Jos virtual hostisi on Apachella, niin pari lisäysstä joudutaan tekemään domainin conf-tietoihin, että ylipäätään saadaan tilastosivu auki ja mielellän myös suojattua muulta maailmalta. Nginx-käyttäjiä en osaa auttaa virtual hostin säädöissä, mutta eiköhän Google auta tästä yli.
Avaa virtual hostin conf:
nano /etc/apache2/sites-available/example.com.conf
Lisää loppuun, ennen riviä </VirtualHost> tämä:
Alias /awstatsclasses "/usr/share/awstats/lib/" Alias /awstats-icon/ "/usr/share/awstats/icon/" Alias /awstatscss "/usr/share/doc/awstats/examples/css" ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/ ScriptAlias /awstats/ /usr/lib/cgi-bin/ Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Otetaan CGI käyttöön:
a2enmod cgi
Voit käynnistää tässä vaiheessa Apachen uudestaan, jos haluat. Se joudutaan kuitenkin tekemään uudestaan hetken kuluttua.
AWStat ja asetukset
AWStatin asetukset löytyvät kolmesta paikasta:
- ylipäätään tiedostosta
/etc/awstats/awstats.conf
joka sitten aina jyrätään päivityksissä - paikalliset kaikille virtual hosteille yhteiset asetukset tiedostosta
/etc/awstats/awstats.local.conf
- virtual hostin asetukset tiedostosta
/etc/awstats/awstats.example.com.conf
ja se on (muokattu) kopio varsinaisestaawstats.conf
tiedostosta
Siirrytään ensin AWStatsin hakemistoon, niin päästään hieman helpommalla.
cd /etc/awstats
Kopioidaan alkuperäinen virtual hostin conf-tiedostoksi. Nimen pitää olla tismalleen sama kuin myöhemmin asetuksissa laitettava SiteDomain
– useimmille se lienee www-alkuinen. Käytännössä kyse on enemmänkin siitä miten haluat sivuston nimen näkyvän AWStatsin otsikossa.
cp awstats.conf awstats.www.example.com.conf
Avataan se.
nano awstats.www.example.com.conf
Asetukset on kommentoitu kohtuullisen selvästi, joten ymmärtänet mitä mikäkin tekee. Lisäksi suurin osa oletusarvoista on toimivia.
Pariin kohtaan on kiinnitettävä huomiota.
Logeista ylipäätään
Usein suositellaan tekemään jokaiselle virtual hostille omat loginsa ja sehän onnistuu ihan vaan laittamalla vaikka domainin nimi virtual hostin conf-tiedostossa asetettuun logiin. Se helpottaa AWStatsin elämää jollain tavalla, vaikka se kykeneekin erottamaan domainit toisistaan logimerkintöjenkin avulla – ainakin periaatteessa. Periaatteellisuus tulee vastaan siinä, että logeihin tarvittaisiin yksi selvä tietue, joka kertoo mille domainille ollaan menossa ja sitä ei oletuksena ole. AWStats ei osaa metsästää pyynnön urlista hostia, ja maallikkona sanoisin, että tuo on koodauksessa selvä puute. Regexiä tai vastaavaa käytetään joka puolella rutiinisti ja se on nimenomaan omiaan tilanteessa, jossa joudutaan siivoamaan vakiotekstejä, kuten pyydytämään merkkijonon alusta https://www.example.com.
Tuo vaje sitten kierretään tekemällä jokaiselle virtual hostille ikioma logi.
Taas kerran asia, johon ei ole välttämättä oikeaa ja väärää vastausta. Logeja tarvitaan tilastoinnin lisäksi paljon oleellisemmassa asiassa ja se on virhetilanteet. Joskus saattaa olla helpompaa etsiä per virtual host, mutta itse väitän, että useimmiten kuitenkin ollaan kattavammin etsimässä tietoa, kun kaikki ovat samassa. Voin olla väärässäkin.
Jos käyttää vain yhtä serveriä, on se sitten Nginx tai Apache, niin log per domain helpottaa AWStatsin käyttöä ja asentamista. Saattaa kaikesta huolimatta olla pienimmän vaivan tie laittaa domainin nimi jokaisen access- ja error-tiedoston nimeen.
Sen sijaan jos haet tilastot Varnishin varnishncsa-logista, niin pidä logit yhteisenä, jos sinulla ei muuta syytä ole keskittää niitä per sivusto.
Minulla on Nginx ennen Varnishia hoitamassa SSL:n ja HTTP/2:en ja siellä olen uudelleenohjannut kaikki portin 80 pyynnöt, eli http-alkuiset, takaisin porttiin 443 eli pakottanut ne https-alkuisiksi. Varnish hoitaa proxy-hommat ja Apache2 taustalla, jossa sivut aidosti ovat, näkee vain ja ainoastaan sen liikenteen, jota ei löydy cachesta. Tarkoittaa myös sitä, että
- Nginx logittaa kaikki pyynnöt
- Varnish logittaa kaikki pyynnöt sekä itse generoimansa virheet, pääosin huonosti käyttäytyvien bottien suhteen
- Apache2 logittaa vain cachesta puuttumattomat sekä normaalit http-virheet, kuten 404.
En voi siis käyttää Apachen logeja, ellen halua nimenomaan logittaa cacheamatonta liikennettä – kyllä, tuollekin olisi tilauksensa. Tavalliseen kävijätilastointiin minulle jää siis enää Nginx ja Varnish. Kun virtuaalipalvelimella on useampi sivusto, niin ainoa järkevä tapa on käskeä Nginxiä tekemään sivustokohtaiset logit. Varnishin kanssa moinen ei ole edes mahdollista, koska välimuisti ei edes ymmärrä sivustojen konseptia, vaan sille jokainen pyyntö on erillinen objekti. Varnishin kanssa joudutaan siis säätämään.
Varnishin kanssa on yksi huomioitava asia. Jos olet toteuttanut asiat niin, että jokin (Apache2, Nginx, Hitch…) kuuntelee porttia 443 ja Varnish porttia 80, niin sinun pakko ottaa tilastot Varnishin logista, jos haluat http-liikenteen mukaan laskuihin. Samaten jos käytät jotain ”tyhmää” SSL-terminaattoria kuten Hitch, niin varnishncsa on taas ainoa vaihtoehto.
Koska olen utelias, niin teen molemmat ratkaisut, mutta eri sivustoille. Katiska.info saa luovuttaa tiedot Varnishin kautta, koska siellä iäkkäämpänä sivustona on vahvasti bottiliikennettä, joka aidosti kuormittaa. Täällä sen sijaan seuraan Nginxin kautta.
Takaisin asetuksiin
Joudut asettamaan login sijainnin:
- Apache2:
LogFile="/var/log/apache2/access.log"
jos on vaun yksi logi - Nginx:
LogFile="/var/log/nginx/access.SIVUSTO.log"
jos on sivustokohtaiset logit - Varnish:
LogFile="/var/log/varnish/varnishncsa.log"
Login muoto on myös asetettava – tässä kerrotaan mitä tietoja missä järjestyksessä löytyy, ja jos olet tehnyt jotain kustomointeja, niin joudut ehkä säätämään tätä:
- Apache2 ja Nginx:
LogFormat=1
- Varnish:
LogFormat= "%host %other %other %virtualname %other %other %time1 %methodurl %code %bytesd %otherquot %uaquot"
(tämä joudutaan myöhemmin säätämään Varnishissa)
AWStats suuttuu, jos tiedoston nimessä oleva domain on erilainen kuin tässä, joten laitetaan sama:
SiteDomain="www.example.com"
AWStats haluaa myös tietää kaikki nimet, joilla sivustolle tullaan. Joten tähän voit laittaa tarvittaessa molemmat, www:llä ja ilman. Itse en omissani tarvitse lkuin www-alkuisen, koska pakotan urlit siihen. AWStats käyttää näitä mm. miettiessään sivuston sisäistä liikennettä:
HostAliases="www.example.com example.com"
Tehdään erillinen hakemisto sivuston tiedoille. Se ei ole pakollinen, jos sinulla on vain yksi virtual host, mutta koska maailma voi muuttua ja tilanteet samalla, niin ennakoidaan:
mkdir /var/lib/awstats/example.com
Kerrotaan se AWStatsille:
DirData="/var/lib/awsstats/example.com"
Lisätään hieman turvallisuutta ja kerrotaan AWStatsille, että webistä saa tulla tosiaankin vain kirjautunut käyttäjä. Aseta arvoksi 1:
AllowAccessFromWebToAuthenticatedUsersOnly=1
Etsi rivi plugins
osiosta, jossa lukee LoadPlugin="hashfiles"
ja kommentoi se:
#LoadPlugin="hashfiles"
Tallenna ja poistu.
Avaa nyt AWStatin local-tiedosto:
nano awstats.conf.local
Laita sinne tämä:
LoadPlugin="hashfiles" LoadPlugin="geoip GEOIP_STANDARD /usr/share/GeoIP/GeoIP.dat"
GeoIP esittää saapuneiden maat IP-osoitteen mukaan lippuina, kun muutoin esitettäisiin maatunnus. Jos haet logit Varnishin takaa, niin tuo ei toimi, enkä tiedä miten sen korjaisi. Johtunee X-Forwarded-For headerin rakenteesta, jonka takia AWStats ei tunnista IP-osoitetta. Nginxin ja Apachen kautta kylläkin toimii. Päivitetyt kartat saat rekisteröitymällä sivustolle Maxmind. Perustietokanta on ilmainen, mutta jos halut vaikka kaupungit, niin joudut maksamaan. Ja valitan, vaihtoehtoja ei ole. Se on Maxmind tai ei mitään.
Tallenna ja poistu.
Käyttäjällä www-data eli webserveri tarvitsee käyttöoikeudet logeihin. Asenna ensin acl
, jos sitä ei ole:
apt install acl
Annetaan oikeudet:
- Apache2:
setfacl -R -m "u:www-data:rx" /var/log/apache2/
- Nginx:
setfacl -R -m "u:www-data:rx" /var/log/nginx/
- Varnish:
setfacl -R -m "u:www-data:rx" /var/log/varnish/
Käyttäjätunnus ja salasana
Oletuksena AWStatin tilastoihin pääsee kuka tahansa käsiksi. Koska sen url on aina sama, niin uteliaita riittää. Jos et halua paljastaa tilastojasi koko maailmalle, niin otetaan käyttöön Apachen perustason käyttäjätunnus/salasana -pari.
Luodaan käyttäjä admin ja sille salasana – tämä on vain tunnus admin, eikä liity mitenkään mihinkään muuhun, joten voit vaihtaa sen miksi haluat (ei, en tiedä miten tämä tehdään Nginxillä):
htpasswd -c /etc/apache2/htpasswd admin
- Jos joskus haluat päästä totaalisesti eroon tunnus/salasana-parista, niin
rm /etc/apache2/htpasswd
tekee tempun (ja samalla sitten häviää kaikki sinne tallennetut muut. jos sellaisia on; voit toki muokatakin sitä)
Avaa virtual hostin conf:
nano /etc/apache2/sites-available/example.com.conf
Lisää osioon <VirtualHost> tämä:
<Directory "/usr/lib/cgi-bin/> AuthUserFile /etc/apache2/htpasswd AuthName "Please Enter Your Password" AuthType Basic Require valid-user </Directory>
Käynnistä Apache2 uudestaan:
systemctl restart apache2
Varnish
Varnishin logeja on muokattava, että niihin saadaan näkyviin käyttäjän IP ja host sellaisessa muodossa, että AWStat sen ymmärtää.
Otetaan ensimmäiseksi talteen hostin nimi.
Lisää tiedostoon default.vcl
vaikka rivin
set req.http.host = regsub(req.http.host, ":[0-9]+", "");
jälkeen tämä:
sub rec_vcl { .. set req.http.X-Req-Host = req.http.host; std.log("X-Req-Host:" + req.http.X-Req-Host); .. }
IP-osoite on jo tiedossa ja tallennettuna X-Forwarded-For headeriin. Mutta kummatkin on kirjoitettava myös logiin.
- Pysäytä ensin
varnishncsa
:
systemctl stop varnishncsa
- Avaa asetukset:
systemctl edit --full varnishncsa
- Kommentoi risuaidalla rivi, joka alkaa
ExecStart
ja tee uusi:
- Käynnistetään demoni uudestaan:
systemctl daemon-reload
- Käynnistetään varniscncsa:
systemctl start varnishncsa
Nyt sinulla pitäisi logiin tulla ensimmäiseksi kävijän aito IP sekä host. Voit tarkistaa sen:
cat /var/log/varnish/varnishncsa.log
AWStats käyttöön
Ennen ensimmäistä varsinaista käyttöä, ajetaan olevat logit AWStatsille:
/usr/lib/cgi-bin/awstats.pl -config=example.com -update
Cron on asetettu oletuksena päivittämään dynaamiset tilastot kerran 10 minuutissa ja staattiset tiedot kerran päivässä kello 3.10. Löydät AWStatin oman cronin täältä /etc/cron.d/awstats
. Voit asettaa cronin lisäksi erikseen. Tämä ajaisi AWStatsin tilastot kerran tunnissa domainille example.com:
0 * * * * /usr/lib/cgi-bin/awstats.pl -config=example.com -update >/dev/null 2>&1
Ja tärkein viimeisenä. AWStatsin tilastot löydät osoitteesta:
https://www.example.com/cgi-bin/awstats.pl
Virheet
Error while processing /etc/awstats/awstats.conf
Error: SiteDomain parameter not defined in your config/domain file. You must edit it for using this version of AWStats.
Setup ('/etc/awstats/awstats.conf' file, web server or permissions) may be wrong.
Check config file, permissions and AWStats documentation (in 'docs' directory)
.
Tuo on ehkä yksi yleisimmistä virheistä, ainakin Googlen perusteella näin uskallan väittää. Ilmestyy aina cronin myötä. Se tarkoittaa sitä mitä sanookin: awstats.conf
tiedostossa ei ole määritetty SiteDomain
kohtaa. Älytöntä, koska koko conf-tiedostoa ei edes pitäisi tarvita. Siitä pääsee eroon, kum laittaa siihen ja DomainAlias
kohtaan vaikka domain.com. Siis oikeasti domain.com.
Error while processing /etc/awstats/awstats.www.eksis.one.conf
Create/Update database for config "/etc/awstats/awstats.www.eksis.one.conf" by AWStats version 7.6 (build 20161204)
>From data in log file "/var/log/varnish/varnishncsa.log"...
Phase 1 : First bypass old records, searching new record...
Direct access after last parsed record (after line 141795)
Tuo virhe tulee melkein mistä tahansa, mutta yleensä syynä on väärät kirjoitusoikeudet tai omistajuudet. Tuossa nimenomaisessa tapauksessa komento
chown www-data:www-data /var/lib/awstats/eksis.one
korjasi virheen. Toinen mahdollinen paikka on logien oikeudet, jos muutit kesken kaiken niiden rakennetta tai paikkaa.