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
Keskustele foorumilla Katiskan foorumi