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ä:
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/
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:
Asensin Varnishin komennolla:
sudo apt-get install varnish
Koska Varnish oletuksena on määritelty kuuntelemaan porttia 8080, muutetaan Apachen portiksi 8080. Aluksi muokataan /etc/apache2/ports.conf-tiedostoa:
Sitten muokataan tiedostoa /etc/apache2/sites-enabled/000-default:
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:
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 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:
Testasin Varnishin vaikutusta sivuston nopeuteen ab-ohjelmalla.
Kaikki testit on tehty virtuaalikoneen sisällä ssh-yhteyden kautta.
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:
Ero on merkittävä Varnishiin verrattuna. Varnishissa alkaa ilmenemään epäonnistuvia pyyntöjä vasta 1000 samanaikaisella pyynnöllä 1000 asiakkaalta samaan aikaan:
Varnish ei myöskään aiheuta samanlaisia pitkäaikaisia kuormapiikkejä prosessorille kuin Apache.
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