Joni Junni

Linux palvelimena: Web-palvelimen optimointi Varnishilla

Categories: [school]
Tags: [apache], [linux-server-course], [lamp], [optimization]

17.2.2013 klo 13.21

Tehtävänä oli asentaa johonkin web-palvelimeen Varnish-käänteisproxy ja testata sillä web-palvelun mahdollista nopeutumista. Päätin tälläkertaa tehdä tehtävän käyttäen Vagrantissa ajettavaa virtuaalikonetta käyttäen. Fyysisenä laitteistona toimii Lenovo Thinkpad T410 seuraavilla specseillä:

Vagrantin konfigurointi

Koneessa oli jo aikasemmin asentamani Vagrant, mutta virtuaalikone siitä puuttui. Hain uuden virtuaalikoneen siihen komennolla (Vagrant Get Started documentation):

vagrant box add lucid32 http://files.vagrantup.com/lucid32.box

Latauksen meni n. 10 minuuttia hitaasta yhteydestä johtuen. kun lataus valmistui, ajoin komennot

vagrant init lucid32
vagrant up
vagrant ssh

Ylin komento luo Vagrantfile-nimisen tiedoston joka sisältää virtuaalikoneen asetukset sen käyttöönottoa varten. Keskimmäinen komento käynnistää virtuaalikoneen ja viimeinen ottaa SSH-yhteyden koneeseen.

Seuraavaksi asensin virtuaalikoneeseen LAMP-stackin. En mene tässä postauksessa keskity LAMPin asennukseen, tarkemmat yksityiskohdat LAMP:n ja wordpressin konfigurointiin löydät täältä: https://jonijunni.com/blog/linux-palvelimena-lamp-stackin-ja-wordpressin-asennus-konfigurointi/

Vagrantin virtuaalikoneen HTTP-porttiohjaus

Jotta virtuaalikoneen Apachen saa näkymään paikallisella koneella, pitää poistaa kommentointi Vagrantfilen rivillä “config.vm.forward_port 80, 8080”.

Kun Vagrantfilestä on tuo muokkaus tehty, voidaan virtuaalikone käynnistää uudelleen komennolla:

vagrant reload

Testataan ohjauksen toimivuus avaamalla osoite localhost:8080 selaimessa:

Varnishin asennus

Asensin Varnishin komennolla:

sudo apt-get install varnish

Apachen porttimuutokset

Koska Varnish oletuksena on määritelty kuuntelemaan porttia 8080, muutetaan Apachen portiksi 8080. Aluksi muokataan /etc/apache2/ports.conf-tiedostoa:

Muokkaa NameVirtualHost- ja Listen-rivejä niin että ne kuuntelevat porttia 8080 portin 80 sijasta.

Sitten muokataan tiedostoa /etc/apache2/sites-enabled/000-default:

Muuta VirtualHost-riviä niin että se kuuntelee porttia 8080.

Koska käytän vagrantia, minun pitäisi muuttaa porttiohjausta niin, että apacheen määritetty uusi portti ohjautuisi oikein. En tee sitä, koska tiedän muutoksen onnistuneen kun apache ei enää vastaa portissa 8080:

apache_porttimuutos3

Kannattaa huomata, että paikallisessa koneessa portit ovat ohjattuna eri tavalla virtuaalikoneeseen kuin mitä virtuaalikoneessa on ohjattuna. Esimerkiksi Apacheen tehty porttimuutos EI vaikuta Vagrantissa tehtyihin porttiohjauksiin. Jos muuttaisin Vagrantfilen “config.vm.forward_port 80, 8080”-asetusta muotoon “config.vm.forward_port 8080, 8080”, saisin Apachen tarjoaman sivuston taas näkyviin. Mutta en tee niin nyt koska päämääränä oli saada Varnish Apachen ja asiakkaan välille proxyksi.

Varnishin porttimuutokset

Varnishin asetukset löytyvät kahdesta paikkaa: /etc/default/varnish-tiedostosta sekä /etc/varnish/default.vcl. Ensimmäisestä tiedostosta löytyy asetukset mitä asetuksia Varnishin käynnistykseen käytetään ja jälkimmäisessä on sisältöpalvelimen asetukset.

Muokataan /etc/default/varnish-tiedostoa ja määritetään Varnish kuuntelemaan porttia 80 portin 6081 sijaan:

sudo nano /etc/default/varnish

Oletuksena Varnish on määritetty hakemaan sisältöä osoitteesta 127.0.0.1 portista 8080 (määritetty tiedostossa /etc/varnish/default.vcl), joten minun ei tarvinnut muokata kyseistä tiedostoa. Lopuksi käynnistetään molemmat palvelut:

sudo service apache2 start
sudo service varnish start

Ja testataan selaimella näkyykö taas WordPress-sivusto:

Optimoinnin testaus

Testasin Varnishin vaikutusta sivuston nopeuteen ab-ohjelmalla.
Kaikki testit on tehty virtuaalikoneen sisällä ssh-yhteyden kautta.

Kuormitustesti suoraan Apacheen ilman Varnishia välissä

Kuormitustesti Varnishiin

Kun vertaamme tuloksia Apachen ja Varnishin välillä, huomaamme valtavia eroja. Apachella jopa 58 pyyntöä epäonnistuu! Tutkiessani tarkemmin asiaa, vaikuttaisi siltä että palvelimesta loppuu resurssit palvella asiakkaita:

Kuvankaappaus top-ohjelmasta samaan aikaan kun ab kuormittaa Apachea suoraan.

Ero on merkittävä Varnishiin verrattuna. Varnishissa alkaa ilmenemään epäonnistuvia pyyntöjä vasta 1000 samanaikaisella pyynnöllä 1000 asiakkaalta samaan aikaan:

Kuormitustesti Varnishiin 1000 samanaikaisella pyynnöllä 1000 asiakkaalta

Varnish ei myöskään aiheuta samanlaisia pitkäaikaisia kuormapiikkejä prosessorille kuin Apache.

ISO-tiedostojen välimuistittamisen ohitus Varnishista

Yritin muuttaa default.vcl-tiedostoa niin että Varnish cachettaisi niitä välimuistiin vaan lataisi ne suoraan Apachesta. Laitoin seuraavan rimpsun tiedostoon:

sub vcl_recv {
        if(req.url ~ "^/~vagrant/isos/") {
                return (pass);
        }
}

Jostakin syystä Varnishin kautta iso-tiedostoja noutaessa selaimeen tulee Connection Reset-virhe. Myöskään wgetillä tiedostoa ei saa hostilla noudettua, mutta paikallisesti saa ssh:n kautta. Syytä en ongelmalle keksinyt mutta oletan sen johtuvan porttiohjauksista Vagrantin kanssa. Linkki varnishin lokiin kiinnostuneille:  varnishlog.txt

Lähteet