Varnish: Difference between revisions

From ICO wiki
Jump to navigationJump to search
Rsepp (talk | contribs)
Lliba (talk | contribs)
m Lehele kategooria juurde
 
(42 intermediate revisions by 9 users not shown)
Line 1: Line 1:
= Koostajad =
[[Category:IT infrastruktuuri teenused]]
Rene Sepp, Kersti Lang, Carolys Kallas
'''Varnish''' kasutatakse veebilehekülgede kiirendamiseks. Teenus installeeritakse HTTP serveri ette ning tehakse vastavad muutused sisu puhverdamiseks.


Kevad 2012
Varnish tavaliselt kiirendab andmete laadimist 300-1000 korda sõltuvalt veebilehe ülesehitusest. Varnish Cache hoiab veebilehti vahemälus kiirendades sellega javaskriptide ning piltide laadimist. Lisaks kasutatakse seda ka koormuse tasakaalustamiseks ning turvalisuse suurendamiseks.<ref>[https://www.varnish-cache.org/about About Varnish]</ref>


= Sissejuhatus =
==Ajalugu==
Varnishit kasutatakse veebilehekülgede kiirendamiseks. See installeeritakse HTTP serveri ette ning tehakse vastavad muutused sisu cachimiseks. Varnish cache tavaliselt kiirendab andmete laadimiset 300-1000 kordselt sõltuvalt veebilehe ülesehitusest. Varnish cache hoiab veebilehti vahemälus kiirendades sellega javaskriptide ning piltide laadimist. Lisaks kasutatakse seda ka koormuse tasakaalustamiseks ning turvalisuse suurendamiseks.
Projekti algatas Norra suurim tabloidformaadis ajaleht Verdens Gang<ref>[https://www.varnish-software.com/use-case/vg-norway VG (Norway)| Varnish Software]</ref>. Arhitekt ja juhtiv arendaja on Taani konsultant Poul-Henning Kamp (tuntud kui FreeBSDcore arendaja).<ref>[https://www.varnish-cache.org/trac/wiki/ArchitectNotes Notes from the Architect]</ref> Varnish Cache tugi, haldus ja arendus koondus hiljem eraldi haruks - Varnish Software<ref>[https://www.varnish-software.com/about-us About Us | Varnish Software]</ref>.


= Eeldused =
Varnishi versioon 1.0 avalikustati aastal 2006<ref>[https://www.varnish-cache.org/lists/pipermail/varnish-announce/2006-September/000638.html Varnish 1.0 released]</ref>, Varnish 2.0 aastal 2008<ref>[https://www.varnish-cache.org/lists/pipermail/varnish-announce/2008-October/000010.html Varnish 2.0 released]</ref>, Varnish 3.0 aastal 2011<ref>[https://www.varnish-cache.org/lists/pipermail/varnish-announce/2011-June/000670.html Varnish 3.0.0 released]</ref> ja Varnish 4.0 aastal 2014<ref>[https://www.varnish-cache.org/lists/pipermail/varnish-announce/2014-April/000696.html Varnish 4.0.0 released]</ref>.
Antud lahendus on testitud Ubuntu Server 10.10 peal, kuid võib töötada ka teiste Ubuntu versioonidega ning muude Linuxi distributsioonidega.


Eelduseks on töötav veebileht, näiteks wordpressi leht. Kui seda tehtud pole, siis seda kirjeldab
==Arhitektuur==
WordPress turvamise labor. https://wiki.itcollege.ee/index.php/WordPress_turvamine
Varnish Cache salvestab andmed virtuaalmällu ja jätab otsustada, mis salvestatakse mällu ja mida suunatakse ketta operatsioonisüsteemi. See aitab vältida olukorda, kus operatsioonisüsteem hakkab andmeid suunama vahemällu samal ajal kui nad paigutatakse rakenduse poolt kettale.


= Varnishi paigaldamine turvalisuse suurendamiseks =
Lisaks on Varnishi tugevalt "keermestatud", iga kliendi ühendust käsitletakse kui eraldi "keeret". Kui seadistatud aktiivsete "keerete" arv on täidetud, paigutatakse sisenevad ühendused ülevoolu järjekorda. Kui kui see järjekord jõuab teatud piirini, hakkab süsteem sissetulevaid ühendusi tagasi lükkama.
Varnish peatab mittetäielikel http päringutel jõudmast Apache veebiserverini.  
Põhineb "Putting Varnish In Front Of Apache On Ubuntu/Debian" artiklil, mis asub siin http://www.howtoforge.com/putting-avarnish-in-front-of-apache-on-ubuntu-debian


==Kontrollime kas on installitud kõige uuem varnishi versioon.==
Peamine seadistamise mehhanism on VCL (Varnishi Configuration Language). Enamus kasutajapoliitika otsuseid jäetakse VCL koodi, mis muudab Varnishi palju rohkem seadistatavaks ja kohanemisvõimelisemaks kui enamik teisi HTTP kiirendeid. Kui VLC skript on laetud, tõlgitakse see "C" keelde, kompileeritakse, et jagada objektid süsteemi poolt kompilaatorisse ja seotakse otse kiirendiga.
<pre>sudo apt-get install curl
sudo curl http://repo.varnish-cache.org/debian/GPG-key.txt | apt-key add -
sudo echo "deb http://repo.varnish-cache.org/debian/ $(lsb_release -s -c) varnish-2.1" >> /etc/apt/sources.list </pre>


==Apache konfiguratsiooni muutmine==
Arvu run-time parameetrid kontrollivad näiteks maksimaalset ja minimaalset aktiivsete keerete arvu, nende erinevaid süsteemipause jne. Käsurea juhtimise liides võimaldab neid parameetreid muuta, uusi VCL skripte kompileerida, laadida ja aktiveerida kiirendile taaskäivitust tegemata.
Muudame varnishi konfiguratsiooni faili, et varnish kuulaks defaultina port 80.
<pre>nano /etc/default/varnish</pre>
Muuda "DAEMON_OPTS="-a *:6081 \" selliseks
<pre>DAEMON_OPTS="-a *:80 \</pre>
ctrl-O ja muudame nime millekski muuks, nt mysite.vcl


Kopeerime /etc/varnish/default.vcl
Selleks, et vähendada süsteemi päringute arvu kiirelt miinimumini, on logi-andmed salvestatud mällu ning logi-andmete filtreerimine, vorminine ning kirjutamine aktiivsele kettale kettale.<ref>[https://en.wikipedia.org/wiki/Varnish_%28software%29#Architecture Varnish(software) Wikipedia]</ref>
<pre>cp /etc/varnish/default.vcl /etc/varnish/mysite.vcl</pre>


Täiendame /etc/varnish/mysite.vcl faili.
==Varnishi paigaldamine turvalisuse suurendamiseks==
<<!-- Warning style viksitud ArchWikist -->div style="padding: 5px; margin: 0.50em 0; background-color: #FFDDDD; border: thin solid #DDBBBB; overflow: hidden;">'''Hoiatus: '''Antud installatsiooni lahendus on testitud Ubuntu 14.04.2 LTS peal, kuid võib toimida muudel Debianil baseeruvate distributsioonide peal. Muude distributsioonide peal paigaldamiseks tasub uurida arendaja kodulehekülge<ref>[https://www.varnish-cache.org/releases Varnish Releases]</ref>.
 
Eelduseks on töötav veebileht, näiteks [[Veebiserveri_labor|Apache]] vaikeleht või WordPressi leht. Kui seda tehtud pole, siis seda kirjeldab [[WordPress_turvamine|WordPress turvamise labor]].</div>
Järgneva juhendi<ref>[https://www.howtoforge.com/putting-varnish-in-front-of-apache-on-ubuntu-debian Putting Varnish In Front Of Apache On Ubuntu/Debian]</ref> abil on võimalik sättida Varnish ülesse nii, et mitte-täielikud HTTP päringud püütakse kinni Varnishi teenuse poolt. Esialgne juhend on kohandatud uuema Varnishi versiooni ja Ubuntu väljalaske jaoks.
 
===Apache konfigureerimine===
Apache2 tuleb kuulama panna localhosti, selleks on vaja <code>/etc/apache2/ports.conf</code> konfiguratsioonifailis muuta vaikimisi kuulatav port 80 pealt 8080 peale.
 
Listen 8080
 
Järgmisena tuleb muuta virtualhosti failis olev kuulatav port.
Siin näites kasutame Apache2 vaikelehe konfiguratsioonifaili <code>/etc/apache2/sites-available/000-default.conf</code>, kus tuleb muuta vaikimisi kuulatav port 80 meile vajalikuks port 8080 peale. Seda saab teha manuaalselt tekstiredaktoriga, kuid kui on vaja mitu faili muuta, siis on mõtekas kasutusele võtta käsurea utiliit [[sed]]
 
cd /etc/apache2/sites-available
sed 's/:80/:8080/' 000-default.conf -i
 
Hetkeseisuga on konfiguratsioon selline, et Varnish saab kirjeid Apachelt ja külastajate IP addressiks logitakse lokaalse masina IP.
Selle parandamiseks paigaldame Apachele lisamooduli, et kuvataks kliendi õige ip aadress:
 
apt-get install libapache2-mod-rpaf
 
===Varnish Paigaldus===
Kuna Varnishi repositoorium<ref>[https://www.varnish-cache.org/installation/ubuntu Installation on Ubuntu]</ref> on turvalisel http kanalil, siis on vaja laiendada apt utiliiti, et see oleks võimeline tõlgendama https:// aadresse, kui vastav laiendus pole paigaldatud, siis saab selle Ubuntus installeerida järgnevalt:
 
apt-get install apt-transport-https
 
Lisame Varnishi repositooriumi krüptovõtme, et apt oleks suuteline autentima repositooriumist alla laetavaid faile:
 
curl <nowiki>https://repo.varnish-cache.org/GPG-key.txt</nowiki> | apt-key add -
 
Lisame Varnishi repositooriumi Ubuntu 14.04 Trusty Tahr jaoks oma apt utiliidi allikate loendisse:
 
echo "deb <nowiki>https://repo.varnish-cache.org/ubuntu/ trusty varnish-4.0</nowiki>" >> /etc/apt/sources.list.d/varnish-cache.list
 
Uuendame repositooriumi ja paigaldame Varnishi:
 
apt-get update && apt-get install varnish
 
===Varnishi konfiguratsiooni muutmine===
Muudame Varnishi konfiguratsioonifaili <code>/etc/default/varnish</code>, et Varnish kuulaks vaikimisi port 80 ja muudame VCL faili asukohta. Siin näites on kasutusele võetud <code>/etc/varnish/meieleht.vcl</code>:
<pre>
<pre>
## Redirect requests to Apache, running on port 8000 on localhost
DAEMON_OPTS="-a :80 \
backend apache {
            -T localhost:6082 \
        .host = "127.0.0.1";
            -f /etc/varnish/meieleht.vcl \
        .port = "8000";
            -S /etc/varnish/secret \
            -s malloc,256m"
</pre>
Kopeerime vcl struktuuri vaikefailist <code>default.vcl</code> uude faili <code>meieleht.vcl</code>:
 
cp /etc/varnish/default.vcl /etc/varnish/meieleht.vcl
 
Täiendame faili <code>meieleht.vcl</code>, et tõsta Apache turvalisust Varnishi abiga.
<<!-- Note style viksitud ArchWikist -->div style="padding: 5px; margin: 0.50em 0; background-color: #DDDDFF; border: thin solid #BBBBDD; overflow: hidden;">'''Märge: '''Esialgne juhend kasutas Varnish 2.1, mille süntaks erineb natukene Varnish 4.0.3 omast. <ref>[https://www.varnish-cache.org/docs/trunk/whats-new/upgrade-4.0.html Süntaksi muudatused versioon Varnish 4.0 versioonis]</ref></div>
<pre>
sub vcl_recv {
    # Add a unique header containing the client address.
    unset req.http.X-Forwarded-For;
    set req.http.X-Forwarded-For = client.ip;
    # Added security, the "w00tw00t" attacks are pretty annoying so let's block
    # it before it reaches our webserver.
    if (req.url ~ "^/w00tw00t") {
        return (synth(403, "Not permitted"));
    }
}
}
## Fetch
 
sub vcl_fetch {
sub vcl_backend_response {
## Remove the X-Forwarded-For header if it exists.
    # Remove the X-Forwarded-For header if it exists.
        remove req.http.X-Forwarded-For;
    unset bereq.http.X-Forwarded-For;
 
## insert the client IP address as X-Forwarded-For. This is the normal IP address of the user.
    # Insert the client IP address as X-Forwarded-For.
        set   req.http.X-Forwarded-For = req.http.rlnclientipaddr;
    # This is the normal IP address of the user.
## Added security, the "w00tw00t" attacks are pretty annoying so lets block it before it reaches our webserver
    set bereq.http.X-Forwarded-For = bereq.http.rlnclientipaddr;
        if (req.url ~ "^/w00tw00t") {
 
                error 403 "Not permitted";
    # Deliver the content
        }
    return (deliver);
## Deliver the content
        return(deliver);
}
}


## Deliver
sub vcl_deliver {
sub vcl_deliver {
## We'll be hiding some headers added by Varnish. We want to make sure people are not seeing we're using Varnish.
    # We'll be hiding some headers added by Varnish. We want to make sure people
              ## Since we're not caching (yet), why bother telling people we use it?
    # are not seeing that we are using Varnish.
        remove resp.http.X-Varnish;
    # Since we're not caching (yet), why bother telling people we are using it?
        remove resp.http.Via;
    unset resp.http.X-Varnish;
        remove resp.http.Age;
    unset resp.http.Via;
    unset resp.http.Age;
## We'd like to hide the X-Powered-By headers. Nobody has to know we can run PHP and have version xyz of it.
    # We'd like to hide the X-Powered-By headers. Nobody has to know we can run
        remove resp.http.X-Powered-By;
    # PHP and have version XYZ of it.
    unset resp.http.X-Powered-By;
}
}
</pre>
</pre>


==Varnishi konfiguratsiooni muutmine==
===Deemonite restart===
Apache2 tuleb kuulama panna localhosti.
Kõigepealt tuleb taaskäivitada Apache teenus:
<pre>nano /etc/apache2/ports.conf</pre>
 
Muuda
service apache2 restart
<pre>
 
NameVirtualHost *:80
Järgnevalt kontrollime netstat utiliidiga, kas Apache kuulab meie poolt konfigureeritud porti:
Listen 80
 
</pre>
netstat -lp | grep apache2
 
Tulemus peab olema taoline:


selliseks
tcp        0      0 localhost:8080          *:*                    LISTEN      4586/apache2
<pre>
NameVirtualHost *:8000
Listen 192.168.56.101:8000
</pre>


192.168.56.101 asemel kasuta oma IP.
Taaskäivitame Varnishi teenuse:


Paigaldame apachele lisamooduli, et kuvataks kliendi õige ip aadress.
service varnish restart
<pre>apt-get install libapache2-mod-rpaf</pre>


== Deemonite restart ==
Kontrollime, kas Varnishi teenus kuulab õigelt pordilt:
Kõigepealt tuleb apachele restart teha
<pre>/etc/init.d/apache2 restart</pre>


Kontrollime IP porti
netstat -lp | grep varnish
<pre>netstat -lp | grep apache2 </pre>


Tulemus peab olema taoline:
Tulemus peab olema taoline:
tcp        0      0 *:www                  *:*                    LISTEN      4498/varnishd
tcp6      0      0 [::]:www                [::]:*                  LISTEN      4498/varnishd
Varnish on ka võimeline kuulama pealt ipv6.
Nüüd on Varnish paigaldatud Apache2 ette ja sait peab nüüd töötama. Kui Apache2 peatada, kuvatakse Varnish veateate lehekülg.
==Logimine==
Veebilehe külastamisi saab jälgida <code>/var/log/varnish/access.log</code> logifailist.
===Detailsemate logide konfigureerimine===
<<!-- Warning style viksitud ArchWikist -->div style="padding: 5px; margin: 0.50em 0; background-color: #FFDDDD; border: thin solid #DDBBBB; overflow: hidden;">'''Hoiatus: '''Järgnev sektsioon on vabatahtlik. Kui oled siiani järginud juhendit siis on sul Apache2+Varnish konfigureeritud ja toimiv ning edasi pole vaja konfigureerida aine IT Infrastruktuuride raames.</div>
Vaikimisi kuvatakse Apache logides serveri aadressi asemel kliendi addres. Kuna kliendi asemel suhtleb Apache veebiserveriga Varnish, mis on lokaalse masina peal siis see tähendab, et logifailides kuvatakse iga kirje puhul serveri enda aadressi.
<ref>[http://willjackson.org/blog/configure-vanish-forward-client-ip-addresses-apache-logs Configure Varnish to forward client ip addresses in Apache logs]</ref>
<!--<ref>[http://webcache.googleusercontent.com/search?q=cache:eR2P_eWyRjoJ:theyusedtocallitablog.net/2011/07/configuring-varnish-and-apache-to-pass-the-original-client-ip-specifically-with-wordpress-comments-in-mind/+&cd=1&hl=en&ct=clnk&gl=ee&client=ubuntu Configuring varnish and apache to pass the original client ip]</ref>-->
====VCL faili reeglid====
Lisada oma Varnish konfiguratsiooni .vcl read:
Näiteks failis <code>/etc/varnish/meieleht.vcl</code>
<pre>
<pre>
tcp        0      0 localhost:8000          *:*                     LISTEN      4586/apache2
sub vcl_recv {
    # Rename the incoming XFF header to work around a Varnish bug.
    if (req.http.X-Forwarded-For) {
        # Append the client IP
        set req.http.X-Real-Forwarded-For = req.http.X-Forwarded-For ", " regsub(client.ip, ":.*", "");
        unset req.http.X-Forwarded-For;
    } else {
        # Simply use the client IP
        set req.http.X-Real-Forwarded-For = regsub(client.ip, ":.*", "");
    }
}
</pre>
</pre>


Teeme restarti Varnishile
====Apache pool====
<pre>/etc/init.d/varnish restart </pre>
Konfigureerime Apache uut logimisformaati kasutama käsklusega, mis loob faili <code>varnish-log</code>.


Kontrollime uuesti
echo 'LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" varnishcombined' > /etc/apache2/conf.d/varnish-log
<pre>netstat -lp | grep varnish </pre>


Tulemus peab olema taoline:
Samuti tuleb iga virtualhosti (nt. <code>000-default.conf</code>) logiformaadi rea puhul ülesse leida sõna <code>combined</code> ja asendada see sõnaga <code>varnishcombined</code>, selleks kasutame jällegi utiliiti sed:
<pre>
 
tcp        0      0 *:www                  *:*                    LISTEN      4498/varnishd
cd /etc/apache2/sites-available/
tcp6      0      0 [::]:www                [::]:*                  LISTEN      4498/varnishd
sed 's/combined/varnishcombined/' 000-default.conf -i
</pre>
 
Vahepealseks etapiks on teenuste taaskäivitamine:
 
service apache2 restart && service varnish restart
 
Siis tuleb virtualhostid välja ja sisse lülitada:


Nüüd on varnish paigaldatud apache2 ette. (Wordpress) sait peab nüüd töötama. Kui apache peatada kuvatakse varnish error lehekülg.
a2dissite 000-default.conf n2ide.conf n2ide3.conf
a2ensite 000-default.conf n2ide.conf n2ide3.conf


= Juhend, et Apache logides näidataks kliendi IP aadressi, mitte Varnishi serveri enda =
====Tulemuse kontroll====
==Varnishi pool==
Ühenda kliendiga veebiserveri külge ja vaata Apache2 <code>access.log</code> faili, mis ip logitakse kui külastada veebilehte.
Esimese asjana tuleks muuta Varnishi conf fail


<pre>nano /etc/varnish/mysite.vcl</pre>
tail /var/log/apache2/access.log
ja lisada sinna


<pre>sub vcl_pipe {
==Security.VCL paigaldamine==
set bereq.http.connection = "close";
<<!-- Warning style viksitud ArchWikist -->div style="padding: 5px; margin: 0.50em 0; background-color: #FFDDDD; border: thin solid #DDBBBB; overflow: hidden;">'''Hoiatus: '''Järgnev sektsioon on vabatahtlik. Kui oled siiani järginud juhendit siis on sul Apache2+Varnish konfigureeritud ja toimiv ning edasi pole vaja konfigureerida aine IT Infrastruktuuride raames.</div>
Security.vcl on Web Application tulemüür, mis on rakendatud vcl(Varnish Control Language) keeles.<ref>[https://github.com/comotion/security.vcl/blob/master/README Security.vcl README]</ref>


if (req.http.X-Forwarded-For) {
Oma funktsiooni poolest sarnaneb [[mod_security]]le, aga on rakendatud teistmoodi.
set bereq.http.X-Forwarded-For = req.http.X-Forwarded-For;
} else {
set bereq.http.X-Forwarded-For = regsub(client.ip, ":.*", "");
}
}


sub vcl_pass {
Esimese sammuna tuleks paigaldada vajalikud utiliidid kompileerimiseks:
set bereq.http.connection = "close";


apt-get install git make


if (req.http.X-Forwarded-For) {
Siis tuleks kloonida [[git]]i repositooriumis olev algmaterjal:
set bereq.http.X-Forwarded-For = req.http.X-Forwarded-For;
} else {
set bereq.http.X-Forwarded-For = regsub(client.ip, ":.*", "");
}
}</pre>


Taaskäivita Varnish
git clone <nowiki>https://github.com/comotion/security.vcl.git</nowiki>


<pre>
Järgmiste sammudena on vaja repositooriumis olev rakendus paigaldada ja luua sümboolne link Varnishi konfiguratsiooni kausta:
service varnish restart
</pre>


==Apache pool==
cd security.vcl/vcl/
Lisada vajalikud moodulid Apache jaoks
sudo make
cd ..
sudo ln -s $PWD/vcl/ /etc/varnish/security


<pre>apt-get update && apt-get install libapache2-mod-rpaf && a2enmod rpaf && apache2ctl graceful</pre>
Lisa Varnishi .vcl conf faili järgnev rida <code>backend default</code> koodiploki alla:


Avada Apache conf fail
include "/etc/varnish/security/main.vcl";


<pre>nano /etc/apache2/apache2.conf</pre>
Välja peaks nägema nii:
<pre>
backend default {
        .host = "127.0.0.1";
        .port = "8080";
}


ja lisada sinna see
include "/etc/varnish/security/main.vcl";


<pre><IfModule mod_rpaf.c>
</pre>
RPAFenable On
RPAFsethostname On
RPAFproxy_ips "127.0.0.1" xxx.xxx.xxx.xxx
</IfModule></pre>
Lisa Varnishi serveri IP 127.0.0.1 asemele


Apachele restart
Taaskäivita Varnishi teenus:
<pre>service apache2 restart</pre>


==Tulemuse kontroll==
service varnish restart
Ühenda kliendiga veebiserveri külge ja vaata apache access.log faili, mis ip logitakse
<pre>less /var/log/apache2/access.log</pre>


===Tulemuse kontroll===
Proovi nüüd minna enda veebiserveri külge aadressiga:
<nowiki>http://<sinu serveri ip>/javascript:</nowiki>
Kui kõik toimib, tuleb vastuseks:
Error 403 Naughty, not nice!


== Kasutatud materjal ==
==Kokkuvõte==
1. About Varnish - https://www.varnish-cache.org/about
Varnishi abil on võimalik suht triviaalselt täiendada oma veebiserveri kiirust, mis on tänapäeval kindlasti üks väga tähtis korraliku veebiteenuse loomisel.


2. Putting Varnish In Front Of Apache On Ubuntu/Debian - http://www.howtoforge.com/putting-varnish-in-front-of-apache-on-ubuntu-debian
Kui pisut süveneda VCL süntaksisse ja väga loetavasse dokumentatsiooni<ref>[https://www.varnish-cache.org/docs Varnish Docs]</ref> on võimalik ilma lisa programmideta, nagu näiteks [[modsecurity]], tuua sisse tulemüüri funktsioone. Kindlasti tasub uurida ka Varnishi enda wikit<ref>[https://www.varnish-cache.org/trac/ Varnish wiki]</ref>, kust võib leida ka VCL näitefaile, mida on rakendatud ''production'' süsteemides, mille pealt tasub šnitti võtta.


3. Configuring varnish and apache to pass the original client ip http://theyusedtocallitablog.net/2011/07/configuring-varnish-and-apache-to-pass-the-original-client-ip-specifically-with-wordpress-comments-in-mind/
==Viited==
<references />

Latest revision as of 17:09, 26 May 2015

Varnish kasutatakse veebilehekülgede kiirendamiseks. Teenus installeeritakse HTTP serveri ette ning tehakse vastavad muutused sisu puhverdamiseks.

Varnish tavaliselt kiirendab andmete laadimist 300-1000 korda sõltuvalt veebilehe ülesehitusest. Varnish Cache hoiab veebilehti vahemälus kiirendades sellega javaskriptide ning piltide laadimist. Lisaks kasutatakse seda ka koormuse tasakaalustamiseks ning turvalisuse suurendamiseks.[1]

Ajalugu

Projekti algatas Norra suurim tabloidformaadis ajaleht Verdens Gang[2]. Arhitekt ja juhtiv arendaja on Taani konsultant Poul-Henning Kamp (tuntud kui FreeBSDcore arendaja).[3] Varnish Cache tugi, haldus ja arendus koondus hiljem eraldi haruks - Varnish Software[4].

Varnishi versioon 1.0 avalikustati aastal 2006[5], Varnish 2.0 aastal 2008[6], Varnish 3.0 aastal 2011[7] ja Varnish 4.0 aastal 2014[8].

Arhitektuur

Varnish Cache salvestab andmed virtuaalmällu ja jätab otsustada, mis salvestatakse mällu ja mida suunatakse ketta operatsioonisüsteemi. See aitab vältida olukorda, kus operatsioonisüsteem hakkab andmeid suunama vahemällu samal ajal kui nad paigutatakse rakenduse poolt kettale.

Lisaks on Varnishi tugevalt "keermestatud", iga kliendi ühendust käsitletakse kui eraldi "keeret". Kui seadistatud aktiivsete "keerete" arv on täidetud, paigutatakse sisenevad ühendused ülevoolu järjekorda. Kui kui see järjekord jõuab teatud piirini, hakkab süsteem sissetulevaid ühendusi tagasi lükkama.

Peamine seadistamise mehhanism on VCL (Varnishi Configuration Language). Enamus kasutajapoliitika otsuseid jäetakse VCL koodi, mis muudab Varnishi palju rohkem seadistatavaks ja kohanemisvõimelisemaks kui enamik teisi HTTP kiirendeid. Kui VLC skript on laetud, tõlgitakse see "C" keelde, kompileeritakse, et jagada objektid süsteemi poolt kompilaatorisse ja seotakse otse kiirendiga.

Arvu run-time parameetrid kontrollivad näiteks maksimaalset ja minimaalset aktiivsete keerete arvu, nende erinevaid süsteemipause jne. Käsurea juhtimise liides võimaldab neid parameetreid muuta, uusi VCL skripte kompileerida, laadida ja aktiveerida kiirendile taaskäivitust tegemata.

Selleks, et vähendada süsteemi päringute arvu kiirelt miinimumini, on logi-andmed salvestatud mällu ning logi-andmete filtreerimine, vorminine ning kirjutamine aktiivsele kettale kettale.[9]

Varnishi paigaldamine turvalisuse suurendamiseks

Hoiatus: Antud installatsiooni lahendus on testitud Ubuntu 14.04.2 LTS peal, kuid võib toimida muudel Debianil baseeruvate distributsioonide peal. Muude distributsioonide peal paigaldamiseks tasub uurida arendaja kodulehekülge[10]. Eelduseks on töötav veebileht, näiteks Apache vaikeleht või WordPressi leht. Kui seda tehtud pole, siis seda kirjeldab WordPress turvamise labor.

Järgneva juhendi[11] abil on võimalik sättida Varnish ülesse nii, et mitte-täielikud HTTP päringud püütakse kinni Varnishi teenuse poolt. Esialgne juhend on kohandatud uuema Varnishi versiooni ja Ubuntu väljalaske jaoks.

Apache konfigureerimine

Apache2 tuleb kuulama panna localhosti, selleks on vaja /etc/apache2/ports.conf konfiguratsioonifailis muuta vaikimisi kuulatav port 80 pealt 8080 peale.

Listen 8080

Järgmisena tuleb muuta virtualhosti failis olev kuulatav port. Siin näites kasutame Apache2 vaikelehe konfiguratsioonifaili /etc/apache2/sites-available/000-default.conf, kus tuleb muuta vaikimisi kuulatav port 80 meile vajalikuks port 8080 peale. Seda saab teha manuaalselt tekstiredaktoriga, kuid kui on vaja mitu faili muuta, siis on mõtekas kasutusele võtta käsurea utiliit sed

cd /etc/apache2/sites-available
sed 's/:80/:8080/' 000-default.conf -i

Hetkeseisuga on konfiguratsioon selline, et Varnish saab kirjeid Apachelt ja külastajate IP addressiks logitakse lokaalse masina IP. Selle parandamiseks paigaldame Apachele lisamooduli, et kuvataks kliendi õige ip aadress:

apt-get install libapache2-mod-rpaf

Varnish Paigaldus

Kuna Varnishi repositoorium[12] on turvalisel http kanalil, siis on vaja laiendada apt utiliiti, et see oleks võimeline tõlgendama https:// aadresse, kui vastav laiendus pole paigaldatud, siis saab selle Ubuntus installeerida järgnevalt:

apt-get install apt-transport-https

Lisame Varnishi repositooriumi krüptovõtme, et apt oleks suuteline autentima repositooriumist alla laetavaid faile:

curl https://repo.varnish-cache.org/GPG-key.txt | apt-key add -

Lisame Varnishi repositooriumi Ubuntu 14.04 Trusty Tahr jaoks oma apt utiliidi allikate loendisse:

echo "deb https://repo.varnish-cache.org/ubuntu/ trusty varnish-4.0" >> /etc/apt/sources.list.d/varnish-cache.list

Uuendame repositooriumi ja paigaldame Varnishi:

apt-get update && apt-get install varnish

Varnishi konfiguratsiooni muutmine

Muudame Varnishi konfiguratsioonifaili /etc/default/varnish, et Varnish kuulaks vaikimisi port 80 ja muudame VCL faili asukohta. Siin näites on kasutusele võetud /etc/varnish/meieleht.vcl:

DAEMON_OPTS="-a :80 \
             -T localhost:6082 \
             -f /etc/varnish/meieleht.vcl \
             -S /etc/varnish/secret \
             -s malloc,256m"

Kopeerime vcl struktuuri vaikefailist default.vcl uude faili meieleht.vcl:

cp /etc/varnish/default.vcl /etc/varnish/meieleht.vcl

Täiendame faili meieleht.vcl, et tõsta Apache turvalisust Varnishi abiga.

Märge: Esialgne juhend kasutas Varnish 2.1, mille süntaks erineb natukene Varnish 4.0.3 omast. [13]
sub vcl_recv {
    # Add a unique header containing the client address.
    unset req.http.X-Forwarded-For;
    set req.http.X-Forwarded-For = client.ip;
    # Added security, the "w00tw00t" attacks are pretty annoying so let's block
    # it before it reaches our webserver.
    if (req.url ~ "^/w00tw00t") {
        return (synth(403, "Not permitted"));
    }
}

sub vcl_backend_response {
    # Remove the X-Forwarded-For header if it exists.
    unset bereq.http.X-Forwarded-For;

    # Insert the client IP address as X-Forwarded-For.
    # This is the normal IP address of the user.
    set bereq.http.X-Forwarded-For = bereq.http.rlnclientipaddr;

    # Deliver the content
    return (deliver);
}

sub vcl_deliver {
    # We'll be hiding some headers added by Varnish. We want to make sure people
    # are not seeing that we are using Varnish.
    # Since we're not caching (yet), why bother telling people we are using it?
    unset resp.http.X-Varnish;
    unset resp.http.Via;
    unset resp.http.Age;
    # We'd like to hide the X-Powered-By headers. Nobody has to know we can run
    # PHP and have version XYZ of it.
    unset resp.http.X-Powered-By;
}

Deemonite restart

Kõigepealt tuleb taaskäivitada Apache teenus:

service apache2 restart

Järgnevalt kontrollime netstat utiliidiga, kas Apache kuulab meie poolt konfigureeritud porti:

netstat -lp | grep apache2

Tulemus peab olema taoline:

tcp        0      0 localhost:8080          *:*                     LISTEN      4586/apache2

Taaskäivitame Varnishi teenuse:

service varnish restart

Kontrollime, kas Varnishi teenus kuulab õigelt pordilt:

netstat -lp | grep varnish

Tulemus peab olema taoline:

tcp        0      0 *:www                   *:*                     LISTEN      4498/varnishd
tcp6       0      0 [::]:www                [::]:*                  LISTEN      4498/varnishd

Varnish on ka võimeline kuulama pealt ipv6.

Nüüd on Varnish paigaldatud Apache2 ette ja sait peab nüüd töötama. Kui Apache2 peatada, kuvatakse Varnish veateate lehekülg.

Logimine

Veebilehe külastamisi saab jälgida /var/log/varnish/access.log logifailist.

Detailsemate logide konfigureerimine

Hoiatus: Järgnev sektsioon on vabatahtlik. Kui oled siiani järginud juhendit siis on sul Apache2+Varnish konfigureeritud ja toimiv ning edasi pole vaja konfigureerida aine IT Infrastruktuuride raames.

Vaikimisi kuvatakse Apache logides serveri aadressi asemel kliendi addres. Kuna kliendi asemel suhtleb Apache veebiserveriga Varnish, mis on lokaalse masina peal siis see tähendab, et logifailides kuvatakse iga kirje puhul serveri enda aadressi. [14]

VCL faili reeglid

Lisada oma Varnish konfiguratsiooni .vcl read: Näiteks failis /etc/varnish/meieleht.vcl

sub vcl_recv {
    # Rename the incoming XFF header to work around a Varnish bug.
    if (req.http.X-Forwarded-For) {
        # Append the client IP
        set req.http.X-Real-Forwarded-For = req.http.X-Forwarded-For ", " regsub(client.ip, ":.*", "");
        unset req.http.X-Forwarded-For;
    } else {
        # Simply use the client IP
        set req.http.X-Real-Forwarded-For = regsub(client.ip, ":.*", "");
    }
}

Apache pool

Konfigureerime Apache uut logimisformaati kasutama käsklusega, mis loob faili varnish-log.

echo 'LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" varnishcombined' > /etc/apache2/conf.d/varnish-log

Samuti tuleb iga virtualhosti (nt. 000-default.conf) logiformaadi rea puhul ülesse leida sõna combined ja asendada see sõnaga varnishcombined, selleks kasutame jällegi utiliiti sed:

cd /etc/apache2/sites-available/
sed 's/combined/varnishcombined/' 000-default.conf -i

Vahepealseks etapiks on teenuste taaskäivitamine:

service apache2 restart && service varnish restart

Siis tuleb virtualhostid välja ja sisse lülitada:

a2dissite 000-default.conf n2ide.conf n2ide3.conf
a2ensite 000-default.conf n2ide.conf n2ide3.conf

Tulemuse kontroll

Ühenda kliendiga veebiserveri külge ja vaata Apache2 access.log faili, mis ip logitakse kui külastada veebilehte.

tail /var/log/apache2/access.log

Security.VCL paigaldamine

Hoiatus: Järgnev sektsioon on vabatahtlik. Kui oled siiani järginud juhendit siis on sul Apache2+Varnish konfigureeritud ja toimiv ning edasi pole vaja konfigureerida aine IT Infrastruktuuride raames.

Security.vcl on Web Application tulemüür, mis on rakendatud vcl(Varnish Control Language) keeles.[15]

Oma funktsiooni poolest sarnaneb mod_securityle, aga on rakendatud teistmoodi.

Esimese sammuna tuleks paigaldada vajalikud utiliidid kompileerimiseks:

apt-get install git make

Siis tuleks kloonida giti repositooriumis olev algmaterjal:

git clone https://github.com/comotion/security.vcl.git

Järgmiste sammudena on vaja repositooriumis olev rakendus paigaldada ja luua sümboolne link Varnishi konfiguratsiooni kausta:

cd security.vcl/vcl/
sudo make
cd ..
sudo ln -s $PWD/vcl/ /etc/varnish/security

Lisa Varnishi .vcl conf faili järgnev rida backend default koodiploki alla:

include "/etc/varnish/security/main.vcl";

Välja peaks nägema nii:

backend default {
        .host = "127.0.0.1";
        .port = "8080";
}

include "/etc/varnish/security/main.vcl";

Taaskäivita Varnishi teenus:

service varnish restart

Tulemuse kontroll

Proovi nüüd minna enda veebiserveri külge aadressiga:

http://<sinu serveri ip>/javascript:

Kui kõik toimib, tuleb vastuseks:

Error 403 Naughty, not nice!

Kokkuvõte

Varnishi abil on võimalik suht triviaalselt täiendada oma veebiserveri kiirust, mis on tänapäeval kindlasti üks väga tähtis korraliku veebiteenuse loomisel.

Kui pisut süveneda VCL süntaksisse ja väga loetavasse dokumentatsiooni[16] on võimalik ilma lisa programmideta, nagu näiteks modsecurity, tuua sisse tulemüüri funktsioone. Kindlasti tasub uurida ka Varnishi enda wikit[17], kust võib leida ka VCL näitefaile, mida on rakendatud production süsteemides, mille pealt tasub šnitti võtta.

Viited