tavis nörttimaailmassa

EksisONE - artikkeleita ja ohjeita nörttimaailmasta

AWStats: asennus

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 varsinaisesta awstats.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.