Laborator 9. Accelerarea accesului web

Cunoștințe și abilități ce vor fi dobândite

  • Folosirea Varnish pentru accelarea accesului web
  • Configurarea Varnish
  • Scenarii de folosire Varnish

Pregătire infrastructură de laborator

Pentru a pregăti configurația de laborator va trebui să descărcați pe mașina fizică (mjolnir), în directorul saisp/, arhiva laboratorului:

student@mjolnir:~/saisp$ wget --user=user-curs --ask-password http://repository.grid.pub.ro/cs/saisp/laboratoare/lab-09.zip
student@mjolnir:~/saisp$ unzip lab-09.zip

În urma dezarhivării rezultă două fișiere imagine KVM (format qcow2, web.qcow2 și varnish.qcow2) și un script de pornire a mașinilor virtuale (xlr8-start-kvm). Fișierul imagine de bază base.qcow2 este deja în directorul saisp/ și este baza pentru celelalte două fișiere imagine: web.qcow2 și varnish.qcow2.

Puteți urma pașii de mai sus pentru a descărca infrastructura KVM pentru laborator pentru lucru acasă.

Pentru pornirea celor două mașini virtuale (una cu serverul web, alta cu instanța Varnish) rulați scriptul de pornire:

student@mjolnir:~/saisp$ ./xlr8-start-kvm

Vor porni cele două mașini virtuale KVM pentru laborator.

Pentru accesarea celor două mașini folosiți SSH către adresele IP aferente fiecăreia. Pentru conectarea la mașina virtuală pentru serverul web folosiți comanda

student@mjolnir:~/saisp$ ssh -l root 192.168.0.2

iar pentru conectarea la instanța Varnish folosiți comanda

student@mjolnir:~/saisp$ ssh -l root 192.168.0.3

Parola pe cele două mașini virtuale este student atât pentru utilizatorul root cât și pentru utilizatorul student.

Exerciții

01. [20p] Utilitate Varnish

Dorim să urmărim efectul folosirii Varnish față de accesarea directă a unui server web. Vom folosi utilitarul httperf pentru a evalua comportamentul accesului web folosind Varnish sau fără Varnish.

Pe mașina virtuală varnish (accesibilă folosind ssh -l root 192.168.0.3) este instalat Varnish. Este configurat să asculte conexiuni pe portul 80, lucru pe care îl putem verifica folosind comanda:

root@varnish:~# netstat -tlpn | grep varnish
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      2366/varnishd
tcp        0      0 127.0.0.1:6082          0.0.0.0:*               LISTEN      2364/varnishd
tcp6       0      0 :::80                   :::*                    LISTEN      2366/varnishd
tcp6       0      0 ::1:6082                :::*                    LISTEN      2364/varnishd

Portul 6082 este portul de administrare. Configurația aferentă se găsește în fișierul /etc/default/varnish. Putem folosi un editor/viewer sau comanda de mai jos pentru a investiga configurația:

root@varnish:~# grep -A 4 DAEMON_OPTS /etc/default/varnish | grep -v '^#'
--
--
DAEMON_OPTS="-a :80 \
             -T localhost:6082 \
             -f /etc/varnish/default.vcl \
             -S /etc/varnish/secret \
             -s malloc,256m"
--
--

Pentru a urmări utilitatea folosirii Varnish, vrem să ne conectăm la un server pe legătură directă și prin intermediul Varnish. Alegem serverul ocw.cs.pub.ro. Pentru aceasta, serviciul Varnish a fost configurat să folosească pe post de back end ocw.cs.pub.ro. Putem consulta această configurație în fișierul /etc/varnish/default.vcl folosind un editor/viewer sau comanda de mai jos:

root@varnish:~# grep -A 3 'backend default' /etc/varnish/default.vcl 
backend default {
    .host = "ocw.cs.pub.ro";
    .port = "80";
}

Configurația de mai sus înseamnă că pentru cererile venite către serviciul Varnish se vor realiza cereri mai departe către serverul ocw.cs.pub.ro. Cererile vor fi cache-urite astfel încât viitoare cereri vor fi servite direct din cache.

Evaluarea o vom face de pe sistemul gazdă (mjolnir). Pentru acesta va trebui să configurăm sistemul astfel încât cererile către ocw.cs.pub.ro să ajungă la mașina virtuală varnish. Pentru aceasta, folosiți un editor și adăugați în fișierul /etc/hosts linia:

192.168.0.3	ocw.cs.pub.ro

Cu linia de mai sus, cererile către ocw.cs.pub.ro vor ajunge la mașina virtulă varnish. Putem verifica acest lucru folosind comanda:

student@mjolnir:~$ ping ocw.cs.pub.ro
PING ocw.cs.pub.ro (192.168.0.3) 56(84) bytes of data.
64 bytes from ocw.cs.pub.ro (192.168.0.3): icmp_seq=1 ttl=64 time=0.361 ms
^C

Pentru început puteți să vă conectați din browserul de pe stația gazdă (mjolnir) și să accesați URL-ul aferent: http://ocw.cs.pub.ro. O să vedeți că primul acces durează mai mult dar viitoarele accese ale aceleiași pagini sunt mai rapide.

Pentru a evalua acest lucru, instalați utilitarul httperf pe stația gazdă folosind comanda:

student@mjolnir:~$ sudo apt-get install httperf

Apoi măsurați conexiunile realizate pentru pagina de la URL-ul http://ocw.cs.pub.ro folosidn comanda:

student@mjolnir:~$ httperf --server=ocw.cs.pub.ro --wsess=2000,10,2 --rate 300 --timeout 5

Observați în output informații precum Connection rate, Request rate, Net I/O.

Ca să comparăm trebuie să ne conectăm în mod direct la serverul ocw.cs.pub.ro. Pentru acesta ștergeți (sau comentați) linia adăugată anterior în fișierul /etc/hosts și rulați din nou comanda httperf de mai sus. Observați diferențele parametrilor și, astfel, utilitatea folosirii Varnish ca accelerator pentru conexiuni web.

02. [20p] Configurare Varnish

Ne propunem să configurăm Varnish ca front-end pentru un server web configurat de noi. Pentru aceasta vom configura instanța Varnish de pe mașina virtuală varnish ca front end pentru serverul web de pe mașina virtuală web și apoi vom face măsurători.

Pentru început, configurați instanța Varnish de pe mașina virtuală varnish să folosească pe post de back end serviciul web de pe mașina virtuală web.

Serviciul web de pe mașina virtuală ascultă conexiuni pe portul 80 la adresa IP 192.168.0.2.

După configurarea Varnish serviciul trebuie repornit folosind comanda

root@varnish:~# service varnish restart

Pentru a testa conectați-vă din browser-ul de pe stația gazdă la adresa serverului Varnish: http://192.168.0.3/. Dacă totul a mers cum trebuie va apărea o pagină cu mesajul Say hello to my little friend!.

Același mesaj poate fi accesat direct de la serverul web: http://192.168.0.2/, doar că nu va mai trece prin serverul Varnish.

Pentru a măsura durata transferului cu și fără Varnish, folosiți httperf pe stația gazdă (mjolnir) pentru a descărca un fișier dintre cele accesibile la adresa http://192.168.0.3/data/ (sau http://192.168.0.2/data/); de indicat este să folosiți fișierul 10M.dat de dimesiunea cea mai mare. Folosiți conectarea la ambele servere (cu și fără suport Varnish) pentru a face diferența.

În timpul în care rulați httperf urmăriți folosind htop încărcarea pe cele două mașini virtuale. Observați încărcarea serverului Varnish atunci când acesta este folosit, sau a serverului Apache la conexiunile directe.

Folosiți opțiunea --uri la httperf ca să precizați pagina care să fie accesată. În cazul nostru ar fi vorba de http://192.168.0.2/data/10M.dat sau http://192.168.0.3/data/10M.dat.

Observati diferența de Request rate între conexiunea directă la serverul web și conexiunea prin intermediul serverului Varnish.

03. [15p] Statistici în Varnish

Ca să urmărim starea serviciului Varnish dispunem de câteva utilitare de analiză și monitorizare a acestuia. Acestea sunt, respectiv, varnishlog, varnishstat și varnishhist.

Toate afișează informații despre serviciul Varnish din momentul rulării comenzii, nu și dinainte.

Comanda varnishlog afișează informații despre conexiunile realizate la serviciul Varnish. Rulați comanda varnishlog și apoi realizați conexiuni la serviciu. Urmăriți informații despre aceste conexiuni în output-ul comenzii. Informațiile afișate sunt bogate; putem să filtrăm din acestea. De exemplu, dacă rulăm comanda

# varnishlog -O -i RxURL

va fi afișat doar URL de receive (ceea ce i-a fost solicitat serviciului Varnish).

Comanda varnishstat afișează informații despre starea serviciului. Output-ul ocupă un ecran și este actualizat periodic. Porniți comanda, realizați conexiuni către serviciul Varnish și urmăriți actualizarea output-ului. Urmăriți linia Hitrate ratio.

Comanda varnishhist afișează o histogramă a timpului de servire a cererilor. Pe partea orizontală sunt prezentați timpii de servire, la scară logaritmică. Accesele care nu ajung în cache apar cu # (diez) iar cele care ajung în cache apar cu | (pipe). Realizați mai multe conexiuni diferite (de exemplu la cele trei fișiere de dimensiuni diferite) și observați output-ul afișat de comandă. Observați că este foarte mic timpul de servire din cache față de cel de servire inițială, prin interogarea serverului web.

Folosiți comanda varnishlog pentru a afișa doar cererile către fișierul /data/100k.dat.

Folosiți opțiunea -m a varnishlog. Urmăriți și exemplele din pagina de manual a comenzii varnishlog.

04. [15p] Caching în Varnish

Vrem să vedem cum se comportă cache-ul în Varnish. Intrările în Varnish sunt cache-uite pentru o perioadă de timp înainte să expire. După expirarea timpului respectiv, se realizează o nouă cerere către serverul web pentru obținerea din nou a paginii.

Timpul de viață al cache-ului este dat de o variabilă TTL internă a Varnish. Valoarea sa este în mod implicit configurată la 120 de secunde. Putem determina acest lucru prin intermediul comenzii:

root@varnish:~# varnishadm param.show default_ttl

Valorea implicită, afișată de comanda de mai sus este 120 de secunde. Această valoare poate fi configurată în fișierul /etc/default/varnish; este vorba de directiva VARNISH_TTL.

Ca să urmărim expirarea cache-ului, vom folosi comanda varnishlog în forma de mai jos:

root@varnish:~# varnishlog -i VCL_Call

Apoi facem cereri către fișierele cu extensia .dat menționate în exercițiul anterior.

Observăm că apare un mesaj ce conține cuvântul miss atunci când informația nu se găsește în cache, și apoi un mesaj ce conține cuvântul hit când informația este în cache. După 120 de secunde cache-ul va expira și atunci un acces va genera un miss.

După ce ați generat un mesaj miss pe fișierul 100k.dat, adică informația nu era, dar acum este, în cache, rescrieți fișierul pe serverul web, în directorul /var/www/data/100k.dat folosind comanda:

root@web:/var/www/html/data# dd if=/dev/urandom of=100k.dat bs=100k count=1

Apoi accesați din nou fișierul și urmăriți output-ul comenzii varnishlog. Veți observa că fișierul a fost obținut din cache. Până când cache-ul nu expiră orice modificare a fișierului nu va fi vizibilă în cache.

Pentru a preveni rămânerea în cache a unui obiect dat, se poate folosi purging sau banning. După ce au ajuns în cache fișierele cu extensia .dat, faceți ban acelor fișiere pentru a fi recitite de pe server.

Urmăriți indicațiile de aici. Folosiți comanda varnishadm pentru a accesa CLI-ul de configurare Varnish.

05. [15p] Utilizare VCL

Pentru a realiza configurări în Varnish se folosește sintaxa VCL (Varnish Configuration Language). Aceasta permite încărcarea dinamică de configurații într-o instanța Varnish în rulare.

Folosind fișierul de configurare /etc/varnish/default.vcl, configurați un TTL de 1 oră pentru fișierele din directorul /data/ servite de Varnish. Celelalte fișiere/pagini servite vor folosi valoarea implicită a TTL-ului (de 120 de secunde).

Urmăriți indicațiile de aici.

Reporniți serviciul varnish după realizarea configurației.

Așteptați 3-4 minute după primul acces la o pagină din directorul /data/ și apoi reaccesați-o. O configurație corectă va înseamna un hit în pagină (cache-ul de o oră nu va fi expirat).

06. [15p] Servire de mai multe servere

Dorim ca serviciul Varnish să accelereze accesul web atât către serverul web din mașina virtuală web cât și către ocw.cs.pub.ro. Pentru aceasta trebuie să fie configurate două back end-uri.

Configurați cele două back end-uri astfel încât dacă URL-ul începe cu /courses/ să fie servit de back end-ul de ocw.cs.pub.ro, altfel să fie servit de back end-ul mașinii virtuale web.

Porniți de la documentația Varnish.

07. [BONUS - 10p] Load balancing în Varnish

Dorim să facem load balancing (denumit și directors în Varnish). Înainte de această configurare, opriți mașina virtuală web și creați o copie a imaginii web.qcow2 într-un alt fișier, de exemplu web-copy.qcow2. Apoi editați scriptul xlr8-start-kvm pentru a porni o nouă mașina web, cu altă adresă IP. Această mașină web este al doilea back end.

Porniți doar copia mașinii virtuale, ca să nu aveți conflict de adresă IP. Apoi schimbați adresa IP în 192.168.0.4 în fișierul /etc/network/interfaces.

Schimbați adresa MAC a copiei mașinii virtuale în scriptul xlr8-start-kvm ca să fie diferită de adresele MAC ale celorlalte mașini virtuale.

În scriptul xlr8-start-kvm folosiți o nouă interfață TAP, de exemplu tap3, și stabiliți un nou port VNC, de exemplu :3.

Configurați Varnish pe mașina virtuală varnish să folosească cele două servere web de pe celelalte două mașini virtuale în load balancing de tip round robin.

Va trebui să configurați directorul pe post de backend folosind set req.backend …. Urmăriți și exemplul de aici.

08. [BONUS - 10p] Configurare Nginx ca reverse proxy

Nginx este un server web care poate îndeplini un rol de reverse proxy and cache server la fel ca Varnish. Instalați și configurați Nginx pe stația varnish.

Nginx ascultă în mod implicit conexiuni pe portul 80. Cel mai bine configurați serviciul Varnish să asculte conexiuni pe alt port (8080 de exemplu).

Urmăriți și indicațiile de aici. Trebuie să folosiți directiva listen pentru a configura portul pe care ascultă conexiuni Nginx.

De pe stația gazdă (mjolnir) folosiți utilitarul httperf pentru a măsură performanța Nginx ca reverse proxy față de Varnish.

09. [BONUS - 10p] Configurare Squid

Configurați Squid ca forward proxy pe mașina virtuală web și apoi configurați browserul local să folosească Squid ca proxy.

Pachetul aferent este squid3.

Urmăriți și indicațiile de aici.

Pentru verificare, accesați din browser anumite adrese și urmăriți fișierul de jurnalizare al Squid: /var/log/squid3/access.log.

saisp/labs/09.txt · Last modified: 2016/02/28 23:46 by alexandru.carp
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0