tavis nörttimaailmassa

EksisONE - artikkeleita ja ohjeita nörttimaailmasta

Varnish: uudelleenkäynnistys ilman, että välimuisti katoaa

Jokaisessa asiassa on oppimiskäyränsä. Joskus se on jyrkempi ja korkeampi. Välillä yrittää olla piittaamatta moisesta. Molemmissa tapauksissa tulee töppejä ja virheitä, mutta vain jälkimmäisessä saa kiittää pelkästään itseään. Minulla yritys olla fiksumpi tuli vastaan yhtälössä Varnishin uudelleenkäynnistys ja samalla cachen tyhjentyminen. Tein sen väärin, koska en miettinyt ja hinnan eräällä tavalla maksoi sivustoilla kävijät pidempinä latausaikoina. Koska hölmöilin, niin tyhjensin välimuistin useita kertoja päivässä.

Kun opettelee Varnishin ”kuuman ytimen” default.vcl -tiedoston säätöjä, niin tuo määritystiedosto siirtyy välillä kymmeniä kertoja päivässä serverille ja joka kerran Varnishille on kerrottava miten sen asetukset ja työohjeet ovat muuttuneet. Joka kerran jouduin tyhjentämään samalla välimuistin, koska se on seuraus uudelleenkäynnistyksestä. Nopein tapa muuten tyhjentää Varnishin cache.

Seurasin ohjeita, joiden mukaan säätöjä tehdään. Hieman annan anteeksi itselleni, sillä käytännössä jokainen ohjeistus netin syövereissä neuvoo väärän tavan. Oikea tapa löytyy piilotettuna kouralliseen teknisempään jatkokurssimateriaaliin. Tuolla millään ei olisi ollut mitään väliä, jos olisin vaivautunut hieman enemmän selailemaan Varnishin dokumentaatiota – se on tehty hyvin pitkälle innokkaille aloittelijoille, jotka eivät tiedä aiheesta käytännössä mitään. Mutta ei sielläkään neuvo ihan ensimmäiseksi vastaan tullut. Se tuli noin ensimmäisenä luvussa Getting Started.

Asioiden oikea puoli selvisi, kun aloin ensimmäisen kerran vakavissani ihmettelemään, että todellako minun täytyy tyhjentään koko välimuisti. jos teen pienen muutoksen, joka ei liity mitenkään cacheen. Kuten, että käsken Varnishin seurata Apachen tervdeydentilaa, onko se pystyssä.

Ei, minun ei todellakaan tarvitse tyhjentää joka kerta välimuistia. Ei edes pitäisi.

Ennen uudelleenkäynnistystä

Mikään ei ole niin turhaa puuhaa, kuin käyttää live-tilassa olevaa toimivaa sivustoa default-vcl -tiedoston virheenkorjaukseen. Se, että pyytää Varnishilta mahdottomia ja siitä syystä error 503 on oma juttunsa. Mutta saada sama virhe ihmisten koneille vain siksi, että unohti puolipisteen, on vain typerää.

Olen ollut monta kertaa typerä. Älä ole kuten minä.

Kun olet siirtänyt serverille uuden default.vcl tiedoston (tai jonkun muun, joka on koplattu mukaan include -lausekkeella), niin testaa se ensin:

varnishd -C -f /etc/varnish/default.vcl

Ei, minä en muista tuota ulkoa. Mutta tein siitä bashiin aliaksen, joka suorittaa tuon paljon helpommin muistettavalla komennolla v-ok. Laita itsellesi sopivampi.

Systemctl

Ubuntussa suunnilleen kaikki palvelut käynnistetään muodossa systemctl start <palvelu>. Kun ollaan muutettu jotain, niin vaihdetaan väliin restart. Kun eräällä tavalla kerrotaan uudet asiat, esimerkiksi Apachelle uuden domainin virtual host, niin käytössä on reload.

Aivan. Tiedät jo mihin tämä johtaa.

Kun muutin jotain, niin komensin

systemctl restart varnish

Silloin ensin sammutin sen, jolloin myös välimuisti katoaa suureen tuntemattomaan. Sen jälkeen käynnistin Varnishin kokonaan uudelleen, joka pitää sisällään myös default.vcl -tiedoston kääntämisen mukaan ajettavaan koodiin.

Jos olisin komentanut

systemctl reload varnish

niin

  • Varnish olisi pysynyt päällä,
  • uusi koodi olisi käännetty default.vcl huomioiden,
  • Varnish olisi käynnistynyt siinä ohessa
  • välimuistitus olisi ollut koko ajan käytössä, eikä cachea olisi pyyhitty tyhjäksi.

Joten jos haluat olla fiksu, ja säilyttää kävijoiden rakentaman välimuistin, niin pidä näppisi erossa komennosta restart ja käytä komentoa reload.

Tuo toimii perustasolla, kun ei kikkailla taustalla liikaa. Paitsi että systemctl reload varnish on turvallisin, niin se on myös helpoin tapa käynnistää Varnish uudelle default.vcl -tiedostolle JA säilyttää välimuisti.

Tarvitset restart -komentoa ainoastaan kahdessa tapauksessa:

  • kun muutat esimerkiksi Varnishin tapaa käsitellä muistia tai annat sille lisää RAM:ia; siis eräällä tavalla käyttöjärjestelmään ja rautaan littyviä asioita
  • kun jokin on pahasti rikki
  • kun muutos vaikuttaa perutavalla tavalla välimuistiin tallennettuihin (eikä silloinkaan pakko ole, ne häviävät TTL:n myötä, mutta vuoden säilytysajan takia muistin kulutus lisääntyy tarpeettomasti)

On neljäskin peruste, mutta se liittyy laiskuuteen: kun oma selain ei suostu tyhjentämään välimuistiaan.

Varnishadm

Toinen tapa tehdä sama on käyttää Varnishin CLI:tä. Toki kaiken voi antaa myös ihan tavalliseen tapaan shellistäkin, mutta silloin joutuu aina antamaan mukaan secret -tiedoston polun. Tähän tapaan:

varnishadm -S /etc/varnish/secret -T localhost:6086 <komento>

Saisihan tuonkin meikattua käyttämällä aliasta, mutta turhaa vaivaa, kun CLI käynnistyy näin:

varnishadm

CLI:tä ei kannata käyttää kuin joskus ja (ainakin minulle) erikoistapauksissa. Kun normaalisti shellissä systemctl reload varnish lataa default.vcl -tiedoston, käynnistää Varnishin ja säätää välimuistin, niin CLI:n puolella tarvitaan kaksi komentoa.

Ensin käännetään Varnish uuden default.vcl -tiedoston kanssa:

vcl.load tunnus /etc/varnish/default.vcl

Tunnus saa olla mikä tahansa haluamasi, älä laita siihen mitään loppu- tai tiedostotunnistetta.

Sitten otetaan uusi ja ehompi Varnish käyttöön:

vcl.use tunnus

Ja sitten tullaan pois CLI:stä:

quit

Eli yhtä reload-komentoa vastaan CLI:tä käytettäessä tarvitaan neljä.

Oma erikoiskäyttö

Itse (nykyään) pääsääntöisesti käynnistän Varnishin uudelleen komentamalla systemctl reload varnish. Mutta koska kokeiluistani seuraa niin usein error 5xx eli kaadan koko systeemin kirjoitusvirheillä (kuka on keksinyt lopettaa rivit puolipisteellä ja oikeastiko aaltosulkeiden määrät täytyy mennä tasan…) tai kopioimalla liian vanhoja esimerkkejä, jotka eivät ole edes julkaisijalla koskaan toimineet tai ne vaativat jonkun moduulin, jota minulla ei ole.

Jos (kun) tuossa vaiheessa alkaisin palauttamaan lähtötilannetta, niin aikaa kuluisi liian paljon. Oikaisen mutkia käyttämällä varnishadm:iä ja siirryn CLI:hin.

Kun annettiin vcl.load niin muistiin käännettiin versio Varnishista, jonka nimi on antamasi tunnus.  Se ei kirjaudu yli ennenkuin komennat systemctl reload varnish. Sinulla voi olla niin monta erilaista Varnish-kokoonpanoa kuin haluat. Otat ne vain käyttöön komennolla vcl.use <tunnus>.

Joten kun teen muokkauksen, jonka toimivuudesta ei ole mitään takeita, niin teen sen CLI:n kautta. Jos se menee äitiinsä, niin palauta vanhan. Jos se toimii ja siitä tulee eräällä tavalla virallinen tuotantoversio, niin se saa olla sellaisenaan siihen asti, että teen taas joskun epätoivoisen kokeilun.

Jos et muista nimiä, niin kokeile vcl.list.

Kun haluat poistaa VCL:iä, niin saat tehtyä sen komennolla:

vcl.discard <tunnus>

Se ei anna poistaa käytössä olevaa.

Viimeinen muistettava

Jos tarkistit default.vcl -tiedoston syntaksin ennen sen lataamista eli ottamista käyttöön, niin periaatteessa et tarvitse jälkivarmistusta komennolla systemctl status varnish.

Tarkista mieluummin backendin eli webserverin tila:

varnishadm backend.list

Jos se kertoo, että backend (eli se VCL jonka otit käyttöön) on tilassa sick, niin Varnish ei saa juteltua syystä tai toisesta Apachen kanssa tai miltä Varnish sitten välimuistitettavat asiat hakeekaan. Jos muutit jotain, joka liittyy backendiin, niin syy on siinä. Tai sitten Apache2 on kaatunut.

Sen sijaan jos näet hetken ajan lisääntyviä pisteitä ja sen jälkeen huolestuneet ilmoituksen, että Varnish ei suostu juttelemaan, niin kaadoit Varnishin.