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ä:
- Intel Core i5-480-prosessori
- 8Gt RAM
- 60Gt SSD+500Gt 5400 RPM HDD
- Intel Quadro NVS 3100M 512Mt-näytönohjain
- Käyttöjärjestelmä: Xubuntu 12.04 64-bit
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:
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 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.
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.
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
- Vagrant Getting Started Guide (http://docs.vagrantup.com/v1/docs/getting-started/index.html)
- Tero Karvinen: Optimointi-luento (http://terokarvinen.com/2012/aikataulu-linux-palvelimena-ict4tn003-7-ict4tn003-kevaalla-2013)
- Introduction to Varnish (http://www.c50k.com/varnish-cache.html)