Nopeutin blogini toimintaa hiukan ottamalla käyttöön Varnishin. Se on HTTP-reverse-proxy, joka pitää webbisivuja välimuistissa ja palvelee niitä tehokkaammin kuin Apache ja Django pystyvät niitä tuottamaan. Pikaisesti testattuna tämä vaatimaton virtuaalikoneeni pystyy palvelemaan nyt noin 400 hakupyyntöä sekunnissa, kun se ilman Varnishia jäi alle sadan.

Varnish on siitä mukava, että se osaa cachettaa sivuja, vaikkei niissä olisi "virallisia" Cache-Control-headereita. VCL-kielellä voi rakentaa oman logiikan sille, mitä cachetetaan ja mitä ei. Oletuksena sellaiset sivut jätetään pois cachesta, joissa on käytetty cookieita tai authorization-headereita, jotta käyttäjäkohtainen data pysyisi erillään.

Varnishissa on myös näpsäkkä CLI-rajapinta, jolla voi esimerkiksi tyhjentää haluttuja sivuja cachesta. Tein omaa blogiani varten tällaisen apufunktion, joka tyhjentää koko välimuistin aina silloin, kun joku kirjoittaa uuden kommentin tai itse kirjoitan uuden artikkelin:

def clear_varnish():
    try:
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.connect(('127.0.0.1', 6082))
        s.sendall('url.purge .*\n')
        s.recv(4096)
        s.close()
    except:
        pass

Tämä on toki aika tehotonta, jos saitilla on paljon liikennettä ja cache tyhjenee vähän väliä. Silloin on fiksumpaa käyttää jotain muuta ratkaisua.