Varnish ja xkey: rebuild

You are currently viewing Varnish ja xkey: rebuild

Minulla on aina yksi toive ja pelko yhdessä, kun komennan serverillä apt update && apt dist-upgrade . Jos siellä näkyy Varnish ja Varnish-dev, niin se saattaa korjata jotain hassuja virhetoimintoja. Samalla se kuitenkin aina kaataa sivustoni. Varnishin kolmannen osapuolen moduulit kun ovat täysin versioriippuvaisia, ja siksi nekin on aina käännettävä uudelle versiolle.

Kääntäminen pitäisi olla ihan rutiinijuttuja. Tehdään make ja muita outoja taikoja, ja sitten kaikki on taas iloisen aurinkoisesti. Paitsi että minulla ei ole koskaan mikään mennyt käsikirjoituksen mukaan. Varnishin kohdalla käännetty moduuli on joko väärässä paikassa tai, kuten aina, saan ABI mismatch errorin.

ABI konfikti tarkoittaa sitä, että kun Varnish ja sen oheiskilkkeet ovat päivittyneet vaikkapa versioon 7.7.3 ja teen käännöksen, virheittä, niin Varnish on silti heti naamallaan. Pelkästään siksi, että moduuli onkin käännetty vanhalle 7.7.1 versiolle.

Enkä tiedä miksi noin käy. Varmasti kyse on jostain vanhoista synneistä asennusten kanssa, tai että en ymmärrä miten minun pitäisi mikäkin asetus laittaa, jolloin jokin mystinen vanhan version palikka hyökkää käyttöön jostain pimeästä piilostaan.

Olen aina saanut tuon jollain tapaa korjattua. Aikaa, kahvia, tupakkaa on palanut, ja vanhat sekä väsyneet aivojen synapsit kärsivät stressivälittäjäaineiden takia. Mutta jossain vaiheessa asiat taas toimivat.

Ongelma on siinä, että en yleensä tiedä mitä olen tehnyt, miksi ja sarjan copy&paste operaatioiden jälkeen en osaa vastata edes kysymykseen miten.

Olen karsinut yhtä lukuunottamatta kaikki kolmannen osapuolen moduulit Varnishista. Käytin niitä, koska pystyin. Varsinaista tarvetta ei ollut. Kun paranin tuosta sairaudesta, tai kognition virhetilasta, niin jätin sen yhden ainoan, jonka tarvitsin: xkey.

Cachen tyhjennys on yksi oleellisimmista asioista. Laitetaan välimuistiin asiat, jotka kannattaa nopeuden ja parin muun syyn takia välimuistittaa. Mutta cache on hyödyllinen vain jos siellä on ajantasainen versio. Kun jokin muuttuu, niin vanha versio on saatava katoamaan. Tuossa, eli cachen invalidisoinnissa, xkey helpottaa suunnattomasti elämää.

Mutta se ei ole Varnishin vakioasioita. Ihan siksi, että Varnishilla on tehokkaampi ykey käytössä (nuo ovat muuten vain nimiä, eivät sen enempää), joka on tarjolla vain tolkuttoman kalliin enterprice-version asiakkalle.

Me persaukiset tavikset käytämme kevyempää kolmannen osapuolen xkeytä — joka on käännettävä aina kun Varnishin versio muuttuu.

Varnishin emergency

Koska Varnish reverse proxyna on portinvartija kaikelle liikenteelle, ja kun portinvartija on taju kankaalla sairasvuoteellaan, niin portit pysyvät suljettuna. Toisin sanoen: yksikään sivusto ei toimi.

Tuota varten tarvitaan jonkinlainen paniikkiratkaisu, jolla sivustot saadaan edes linjoilla. Mutta koska systemctl restart varnish ei toimi, niin on kaksi vaihtoehtoa:

  • korjataan default.vcl tiedostosta kaikki viittaukset rikki menneeseen, tässä xkey; olen tuon tehnyt aikoinaan usein ja suoraan sanottuna se on urakkana huomattavan syvältä
  • tehdän jokin emergency-ratkaisu, jolla saadaan Varnish sen verran jaloilleen, ja nopeasti, että sivustot ovat käytettävissä

Minulla on nykyisessä setupissani paniikkinappulana bash-scripti panic.sh. Se käynnistää CLI:n kautta minimaalisen Varnishin, joka ei tiedä mahdollisista ongelmista yhtään mitään.

❯ Näytä koodi
#! /bin/bash

varnishd -I /etc/varnish/start.cli.emerg -P /var/run/varnish.pid -j unix,user=vcache -F -a :8080 -T localhost:6082 -f "" -S /etc/varnish/secret -s malloc,256M

Koska se on CLI, niin sen täytyy olla käynnissä koko ajan — mutta sitä varten on keksitty tmux (tai screen, jota en osaa käyttää.

Minä en käytä default.vcl rakennetta sinällään, vaan load/label tekniikkaa. Ihan siksi, että se helpottaa äärimmäisen paljon useamman hostin käyttöä. Siksi scriptin käyttämä start.cli.emerg näyttää tältä:

❯ Näytä koodi
vcl.load hot /etc/varnish/emergency.vcl
vcl.use hot

Tuossa lyhyessä komennossa hyödynnettävä vcl sitten kutsuu hostit, ilman moduuleja ja pelkällä return(pipe) kutsulla.

varnish-modules kääntäminen

Ennenkuin tekee mitään, niin uuden Varnish-version jälkeen, ennen rebuild hommia, serverille kannattaa antaa reboot. Ei se sinällään mitään auta, mutta aika ajoin se täytyy kuitenkin tehdä ja cache menetettiin muutenkin sillä samalla sekunnilla kun Varnish kaatui.

Ensimmäiseksi kannattaa varmistaa, että olennaiset osat taatusti ovat samalla versiolla.

❯ Näytä koodi
varnishd -V
varnishadm param.show vmod_path
pkg-config --modversion varnishapi

Jos eivät ole… en minä tiedä, jotain täytyy varmaan päivittää tai asentaa uudestaan. Googleta. Mutta varmaa on, että jos tuossa molemmat eivät ole samaa versiota, niin make ei onnistu. Tai jos onnistuu, niin ABI mismatch on taattu.

Tarkista vmod_path . Olen varma, että tässä kohtaa minulla on ollut ongelmia, ja tuli myös taas. Hieman riippuen ohjeista, niin se voi olla /usr/local/lib/varnish/ tai /usr/lib/... . Jos se on /usr/local/.. niin tapa se heti kuljeksimasta. Siitä ei seuraa kuin ongelmia ja jyrää myöhemmässä vaiheessa halutun polun. Eli haluttu polku on /usr, ei /usr/local .

❯ Näytä koodi
sudo rm -f /usr/local/lib/pkgconfig/varnishapi.pc
sudo rm -f /usr/local/lib/libvarnishapi*    2>/dev/null || true
sudo rm -rf /usr/local/include/varnish      2>/dev/null || true
sudo ldconfig

Nämä ohjelmat täytyy löytyä, ja luultavasti löytyykin jo valmiina:

❯ Näytä koodi
sudo apt-get update
sudo apt-get install -y \
  git build-essential automake libtool autotools-dev pkg-config \
  python3-docutils python3-sphinx \
  varnish-dev

Jos jostain syystä varnish-dev puuttuu, niin se on pakko asentaa samasta reposta samalla versiolla kuin itse Varnishkin.

Poista vanha/vanhat versiot. Löydät ne näin:

sudo find /usr -path "\*/varnish/vmods libvmod\_xkey.so" -ls

Hae varnish-modules:

❯ Näytä koodi
cd /usr/local/src
sudo git clone https://github.com/varnish/varnish-modules.git
cd varnish-modules

Tuolla kannattaa piipahtaa, koska tarvitser oikean tagin. Varnish 7.7 versioille se on 0.26.0, mutta tuo pätee vain tämän kirjoitushetkellä.

Aseta oikea tag:

❯ Näytä koodi
sudo git fetch --tags
sudo git checkout 0.26.0

Sitten tehdään se kuuluisa kääntäminen:

❯ Näytä koodi
./bootstrap
./configure --prefix=/usr
make -j"$(nproc)"
sudo make rst-docs
sudo make install

Tuon pitäisi nyt mennä virheittä läpi. Sitten sen jälkeen pysäytät emergencen ja teet Varnishille restartin.

Entä jos ei onnistu

Minulla tuo kaatui ABI ongelmaan. Syynä oli se, että osa oli polussa /usr/local/... ja nyt mentiin hakemistolla /usr/... . Vanha localissa oleva onnistui hyppäämään mukaan.

Joten siivosin paikkoja, poistin tuplat ja sain buildin menemään läpi.

rebuild_xkey.sh

Uskoakseni tämän scriptin pitäisi hoitaa homma seuraavan kerran kun Varnish päivittyy. Toki varnish-modulesin tagi täytyy olla oikea, ja nyt se on kirjoituspäivän mukainen versiolle 7.7.x.

Tätä en ole kokeillut, mutta en sinällään näe mitään syytä miksi se ei toimisi.

Tee scripti mihin haluat, minulla se on /etc/varnish/scripts/rebuild_xkey.sh . Muista chmod +x.

❯ Näytä koodi
#!/usr/bin/env bash
set -euo pipefail

# Estä väärä varnishapi
VD="$(varnishd -V 2>&1 | sed -n '1s/.* \([0-9]\+\.[0-9]\+\.[0-9]\+\).*/\1/p')"
VA="$(pkg-config --modversion varnishapi 2>/dev/null || echo unknown)"
if [ "$VD" != "$VA" ]; then
  echo "ERROR: varnishd ($VD) != varnishapi ($VA) – asenna täsmälleen sama varnish-dev." >&2
  exit 1
fi

# Pakota pkg-config hakemaan distro/upstream-polusta
export PKG_CONFIG_PATH=/usr/lib/x86_64-linux-gnu/pkgconfig

# Kieltäydy rakentamasta jos /usr/local:ssa on vanha .pc
test ! -e /usr/local/lib/pkgconfig/varnishapi.pc || {
  echo "ERROR: /usr/local/lib/pkgconfig/varnishapi.pc löytyy – poista se ensin." >&2
  exit 1
}

VMOD_PREFIX="/usr"
SRC_DIR="/usr/local/src/varnish-modules"
VMOD_TAG="0.26.0"   # Varnish 7.7: katso Releases-sivulta oikea tagi

echo "[*] Varnishd: $(varnishd -V 2>&1 | head -n1)"
echo "[*] Varnish API: $(pkg-config --modversion varnishapi)"

sudo apt-get update -qq
sudo apt-get install -y \
  git build-essential automake libtool autotools-dev pkg-config \
  python3-docutils python3-sphinx varnish-dev

if [[ ! -d "$SRC_DIR" ]]; then
  sudo git clone https://github.com/varnish/varnish-modules.git "$SRC_DIR"
fi

cd "$SRC_DIR"
sudo git fetch --all -p --tags
sudo git checkout "$VMOD_TAG"

sudo ./bootstrap
sudo ./configure --prefix="$VMOD_PREFIX"
make -j"$(nproc)"
make check || true
sudo make rst-docs
sudo make install

echo "[*] Installed xkey at:"
sudo find /usr -path "*/varnish/vmods/libvmod_xkey.so" -ls || true

Jakke Lehtonen

Teen B2B-markkinoille sisällöntuottoa sekä UX-testauksia. Samaan liittyy myös koulutukset yrityksille ja webmaailman kanssa muutoin painiville. Serverien sielunelämää on joutunut ohessa opettelmaan. Toinen puoli toiminnasta on koirien ravitsemuksen ja ruokinnan suunnittelua sekä varsinkin omistajien kouluttamista hoitamaan koiriaan oikein ja vielä paremmin. Profiili: Jakke Lehtonen

Keskustele foorumilla Katiskan foorumi

WordPressin kommentit: