Niets leert je zoveel over een systeem als het zien falen. Een paar favorieten:
De keer dat ik alles zelf platlegde. Om te voorkomen dat één trage pagina alle andere ophield, verplaatste ik het renderen van pagina's naar een pool van worker-threads. Om daarna te controleren of site-verhuizingen zonder haperingen verliepen, stuurde ik een stortvloed aan testverkeer op de live sites af. Ze bevroren negen minuten lang en bleven bevroren nadat het verkeer was gestopt. Elke pagina hield één databaseverbinding vast terwijl ze om een tweede vroeg, en met tientallen threads en een pool van vijftien verbindingen wachtte uiteindelijk elke thread op een andere. Ondertussen meldde de gezondheidscheck, die de database nooit aanraakte, opgewekt dat alles prima was.
De oplossing: databasepools die niet in een deadlock kunnen raken, een limiter die een overbelasting omzet in een snel “probeer het opnieuw” in plaats van vastlopen (met een eerlijk deel voor elke site, zodat één drukke site de rest niet kan uithongeren), een gezondheidscheck die een vastgelopen proces opmerkt, een watchdog die het herstart en een vaste regel over waar loadtests plaatsvinden.
De hapering van 45 seconden. De meeste site-verhuizingen verliepen naadloos, maar één soort niet: als de verhuizing de routeringsregels van de site veranderde, beschreven de oude en de nieuwe kopie heel even dezelfde route op twee verschillende manieren. De voordeur kon niet kiezen wie ze moest geloven en bediende ongeveer 45 seconden lang geen van beide. Al het andere aan de verhuizing klopte, en juist daarom duurde het een tijdje voordat het opviel.
Een piepkleine site op 100% CPU. Een kleine webwinkel met een paar honderd bezoekers per dag trok steeds zijn processor helemaal vol. De boosdoeners waren niet de klanten, maar geautomatiseerde scanners die meer dan honderd verzoeken in tien seconden afvuurden, op zoek naar bestanden als /.env of /wp-login.php die een FolioPress-site nooit heeft. Elk verzoek kreeg een prachtige, volledig vormgegeven “pagina niet gevonden”: zo'n 70 ms werk, honderd keer achter elkaar.
De oplossing: die verzoeken krijgen nu een “Not found” van negen bytes voordat er echt werk wordt gedaan, en Cloudflare houdt de meeste al tegen voordat ze aankomen.
“Server niet gevonden” voor een site die gewoon draaide. Het webadres van een gloednieuwe site wordt tijdens de installatie aangemaakt. Als iets de naam een moment te vroeg opzocht, onthielden internetproviders tot dertig minuten lang “deze naam bestaat niet”, ook al werkte de site prima. De oplossing was een wildcardadres, zodat elke naam onder foliopress.io altijd bestaat; namen zonder site krijgen een vriendelijke pagina met “hier staat geen site”.
Buren. Veel sites naast elkaar hosten roept vragen op die een losse website nooit hoeft te beantwoorden: wat de code van de ene site met een andere kan doen, en wat een site kan claimen dat niet van haar is. Een beveiligingsreview vóór de opening van de aanmeldingen bracht een paar van zulke problemen aan het licht. Ze zijn allemaal opgelost: strengere cookies, bewijs van eigendom voor eigen domeinen en elke site in een eigen, aparte map gemount, zodat geen enkele site bij de bestanden van een andere kan.