Tässä artikkelissa asennetaan Apache web-palvelimen rinnalle Varnish ja nopeutetaan näin web-sivujen tarjoilemista palvelimelta.

1. Johdanto

Käänteisen proxyn toimintaperiaate

Varnish on Apache-palvelimen eteen asennettava cache-palvelin. Varnish toimii käänteisenä proxyna web-palvelimen sisällä. Käänteinen proxy tarjoilee kaikelle kansalle sivuja portissa 80, ja hakee taas itse tarjoilemansa sivut Apachelta joka tarjoilee niitä Varnishille jossain muussa portissa.

Hyöty tästä saadaan ulos siinä, että Varnish pitää staattisia versioita tarjoiltavista sivuista omassa välimuistissaan, eikä Apachen tarvitse jokaisella käyttäjän tekemällä sivunlatauksella suorittaa mahdollista sivuilla olevaa PHP-koodia ja siihen liittyviä tietokantahakuja.

Varnishista on siis oikeaa hyötyä näillä ehdoilla:

  • Palvelimella on paljon liikennettä
  • Palvelimella pidetään dynaamisia sivuja, jotka ilman reverse-proxya rakennetaan jokaisella sivunlatauksella uudestaan.

Ihan kaikille dynaamisille sivuille Varnish ei toki sovi vaan pitää miettiä käyttötarkoitusta. Esimerkiksi WordPressin tai muiden julkaisujärjestelmien nopeuttamiseen Varnish on oiva apu kun artikkelit eivät päivity ihan reaaliaikaisesti, vaan minuuttien tai kymmenien minuuttien päivitysväli on ihan ok. Jos taas palvelimella pidettäisiin jotain reaaliaikaisempaa kuten Etherpadia niin varmasti tulisi ongelmia: sovelluksessa jossa käyttäjät kirjoittavat tekstiä yhteistyössä nähden reaaliaikaisesti muidenkin kirjoitukset, ei minuuttien pituinen päivitysväli riitä.

2. Varnishin asennus ja käyttöönotto

Asennan seuraavassa Varnishin esimerkinomaisesti tälle samaiselle palvelimelle jossa ylläpidän sivustoa www.jannewaren.fi. Käytössä on siis Linoden virtuaalipalvelin Ubuntu 12.04 Server LTS -käyttöjärjestelmällä. Alkutilanteessa on asennettuna koko LAMP-pino ja Apache tarjoilee sivuja portissa 80.

Ensimmäiseksi asennetaan Varnish paketti komennolla apt-get install varnish

Varnishin asennus

..ja rivistä ” Starting HTTP accelerator varnishd  [ OK ]” voimme päätellä kaiken menneen suht ok.

2.1. Varnishin asetukset

Varnishin perusasetukset saadaan tehtyä kahta tiedostoa muokkaamalla: /etc/varmish/default.vcl ja /etc/default/varnish. Oletuksena Varnish tarjoilee sivuja portissa 6081 ja etsii pyytää vastaavia sivuja backendiltä (eli Apache web-palvelimelta) portista 8080.

1) /etc/varnish/default.vcl {#/etc/varnish/default.vcl}

Tässä konfiguraatiotiedostossa asetamme Varnishille tiedon backendistä, eli mihin porttiin Varnish lähettää itse pyyntöjä eteenpäin. Oletuksena portti on 8080 ja voimme sen hyvin siinä pitää, meidän pitää vaan muuttaa Apache tarjoamaan sivuja tuossa portissa. Toki voisimme valita jonkun toisenkin portin mutta 8080 on meille ihan ok.

default.vcl

2) /etc/default/varnish

Tässä konfiguraatiotiedostossa asetetaan Varnish-daemonin käynnistyksessä käytettävät asetukset. Saman asiat voisi siis tehdä käynnistämällä aina Varnishin itse komennolla varnishd mutta pidän mielummin asetuksen konfiguraatiotiedostossa ja Varnishin käynnistyksen automaattisena.

Tiedostossa on valmiina muutama erilainen malli asetuksille, käytämme mallia numero 2 joka oletuksena onkin käytössä. Eli osa asetuksista haetaan äskeisestä default.vcl tiedostosta ja osa taas asetetaan tässä tiedostossa.

Muutamme tässä tiedostossa ainoastaan porttia jossa Varnish tarjoaa sivuja ulkomaailmaan, asetamme sen tietysti portiksi 80.

varnish

Tämän muutoksen voimaansaattamiseksi varnish pitää uudelleenkäynnistää, mutta ei tehdä sitä ihan vielä. Jos varnish uudelleenkäynnistettäisiin samantien, meillä olisi kaksi daemonia tarjoilemassa sivuja samassa portissa 80.

2.2. Apachen asetukset

Apache laitetaan siis palvelemaan Varnishia portissa 8080, muutokset pitää tehdä tiedostoon /etc/apache2/ports.conf ja sivustosi asetustiedostoon eli tässä tapauksessa /etc/apache2/sites-enabled/jannewaren.fi:

ports.conf

Tiedostossa /etc/apache2/ports.conf muutetaan rivejä NameVirtualHost ja Listen

jannewaren.fi

Tiedostossa /etc/apache2/sites-enabled/jannewaren.fi muutetaan riviä <Virtualhost *:80>

2.3. Käyttöönotto

Kaiken pitäisi nyt olla ok asetuksissa, ja saamme muutetut asetukset käyttöön käynnistämällä sekä Apachen että Varnishin uudestaan.

Tässä välissä testataan kuitenkin hieman suorituskykyä vanhoilla asetuksilla eli kun Apache tarjoaa suoraan sivuja ja rakentaa ne jokaisella sivunlatauksella uudestaan. Suorituskykyä testataan komennolla ab -c Y -n X http://osoite.domain. Parametrilla -c määritellään yhtäaikaisten sivunlatausten määrä ja parametrilla -n suoritettavien sivunlatausten kokonaismäärä. Jos haluat nähdä muutoksen suorituskyvyssä Varnishin käyttöönoton jälkeen, tee mittauksia jo nyt ja tallenna tulokset. Lisää aiheesta artikkelin lopussa.

Sitten otetaankin muutokset käyttöön ja käynnistetään sekä Varnish että Apache uudestaan, komennot ovat /etc/init.d/apache2 restart ja /etc/init.d/varnish restart. Näiden kahden komennon välissä voit tietysti testata että tuleehan Varnish oikeasti käyttöön. Kun annat ensimmäisen komennin niin sivustosi lakkaa kokonaan vastaamasta (mutta vastaa portista 8080), ja toisen komennon antamisen jälkeen sivusto vastaa taas normaalisti.

3. Vaikutus suorituskykyyn

Testasin suorituskykyä komennolla ab -c 10 -n 100 http://jannewaren.fi/linux/linuxin-keskitetty-hallinta-puppet-osa-2-testiympariston-pystyttaminen-virtualboxiin/ sekä ennen että jälkeen muutosten.

Ennen muutoksia tulos näytti tältä:

ennen

Ja muutosten jälkeen tältä:

jälkeen

Testituloksia voi tietysti vertailla ja analysoida vaikka miten, mutta selkeiten eron ymmärtää ehkä tässä: ennen Varnishin käyttöönottoa 100 sivunlatauksen suorittamiseen meni aikaa 9,865 sekuntia, ja Varnishin käyttöönoton jälkeen vain 0,449 sekuntia. Ero on valtava. Tällä on suuri merkitys kun palvellaan suuria käyttäjämääriä. Palvelin pystyy palvelemaan huomattavasti enemmän käyttäjiä kyykkäämättä ja tietysti jos palvelimella on muutakin käyttöä niin enemmän resursseja jää sille.

Varoituksen sana: älä testaa suorituskykyä muilla kuin omilla palvelimillasi ja silloinkin mieluiten lokaalisti. Toiminta voi olla rinnastettavissa palvelunestohyökkäykseen.

Reverse-proxyn käyttö palvelimella on myös ekoteko: maalaisjärjellä ajateltuna prosessorin ja kaiken muunkin raudan käyttöaste jää pienemmäksi ja sähköä säästyy. Pitääkin joskus testata näitä vielä laajemmin ja mitata sähkönkulutusta ihan oikeilla laitteilla. Se on kuitenkin eri kirjoitus se.