NGINX-mikrocaching reducerer indlæsningstiden for WordPress fra hele sekunder til millisekunder ved, at webserveren cachelagrer færdige HTML-svar i nogle få sekunder og dermed aflaster PHP-FPM og databasen. Jeg viser, hvordan dette korte cache-vindue betaler sig i praksis, hvilke regler der sikrer WordPress’ sikkerhed, og hvordan man kan opnå mærkbart hurtigere svar under trafikspidser.
Centrale punkter
På forhånd Jeg vil her sammenfatte de vigtigste aspekter, så du kan læse de følgende afsnit med et bestemt formål for øje.
- Millisekunder I stedet for sekunder: korte TTL-tider på 1–10 s leverer gentagne sider ekstremt hurtigt.
- Aflastning For backend: færre anmodninger til PHP-FPM og databasen, markant lavere serverbelastning.
- Regler beskytte: Cookies, loginoplysninger og indkøbskurve forbliver uden for cachen.
- Skalering I hverdagen: Trafikspidser forløber problemfrit, og antallet af timeouts og 502-fejl falder mærkbart.
- Byggeklods I opsætningen: Sammen med OPcache, Gzip/Brotli og grundig databaseoptimering skaber det fart.
Hvordan microcaching fungerer teknisk set
NGINX gemmer den HTML-udskrift, som WordPress genererer, i FastCGI-cachen og leverer identiske efterfølgende forespørgsler direkte fra cachen uden at belaste PHP-FPM og databasen igen. Jeg bruger meget korte cache-varigheder til dette, fordi nyt indhold fortsat er vigtigt, mens cache-hitraten stiger voldsomt i travle perioder. Effekten ses med det samme: identiske anmodninger ender som cache-hits og sendes gennem forbindelsen på millisekunder. I praksis kan WordPress-installationer gøres mange gange hurtigere; et ofte citeret eksempel taler om en op til 400 gange hurtigere hastighed, hvis nogle få direktiver er indstillet korrekt (kilde: NGINX (Blog). Det afgørende er, at jeg udelukkende registrerer svar, der kan caches, og bevidst udelader følsomme sider.
Hvorfor WordPress drager særlig fordel af det
WordPress genererer mange identiske svar efter hinanden, f.eks. for startsider, indlæg og kategorisider, især kort efter en offentliggørelse. Det er netop her, at microcaching kommer ind i billedet: identiske hits vises uden PHP-belastning og aflaster databasen betydeligt. Resultatet er kortere »Time-to-First-Byte«-værdier og færre CPU-spidsbelastninger, hvilket forbedrer brugeroplevelsen markant. Derudover satser jeg på OPcache, effektiv mediekomprimering og effektiv tema-rendering, da disse tiltag tilsammen giver en stor forskel. Hvis du ønsker at dykke dybere ned i emnet, finder du en god introduktion under NGINX-cache til WordPress, der tydeligt viser den praktiske nytte.
Konfiguration: Tænk trin for trin
Start er en cache-zone med sti, nøgle og størrelse; den gemmer svar fra FastCGI-flowet. I serverblokken angiver jeg, at kun GET- og HEAD-anmodninger caches, mens POST-anmodninger udelades. Cookies som wordpress_logged_in eller woocommerce_items_in_cart angiver jeg som udelukkelseskriterium, så indloggede brugere altid får opdateret, personaliseret indhold. For at sikre gennemsigtighed sender jeg en X-Cache-header med HIT, MISS eller BYPASS, så jeg straks kan se status i browseren eller i logfilerne. Derudover begrænser jeg objektstørrelsen for at spare hukommelse og tillader betingede anmodninger, så HTTP-headere supplerer hinanden korrekt.
Cache-regler: Hvad der helt sikkert er udelukket
Logins, Jeg cachelagrer aldrig admin-området, kassen, indkøbskurven og profilsiderne, da de indeholder sessionsdata eller personlige oplysninger. Desuden udelukker jeg noncer, forhåndsvisninger og søgesider, da disse ofte genererer individuelle svar. Forespørgselsparametre som add-to-cart eller preview kører direkte gennem PHP, så der ikke opstår fejlbehæftede kopier. Nogle plugins sætter deres egne cookies; jeg tjekker disse navne på forhånd og definerer dem som en bypass-regel. På den måde forbliver siden funktionsdygtig, men leverer anonyme standardsider lynhurtigt.
TTL, friskhed og „vinduet“
Kort TTL-værdier på 1–10 sekunder udgør kernen i microcaching, fordi de på en smart måde kombinerer aktualitet og tempo. Jeg vælger intervallet ud fra indholdstypen: Indlæg, der er genstand for livlig diskussion, kræver kortere tidsintervaller end statiske landingssider. Hvis man ønsker at planlægge mere præcist, kan man definere et lille „vindue“, der giver mulighed for kortvarig revalidering og udjævner belastningsspidser. En udførlig gennemgang af det ideelle vindue findes i dette indlæg om Vindue til cache-optimering, som jeg bruger som inspiration. Den følgende tabel viser almindelige profiler og deres virkning.
| TTL | Brug | Fordel | Hint |
|---|---|---|---|
| 1–2 sekunder | Seneste nyheder, virale indlæg | Meget opdateret indhold, høj hit-rate i spidsbelastningsperioder | Backend kræver stadig hyppige genopbygninger |
| 3–5 sekunder | Forside, Kategorier | En god balance mellem tempo og friskhed | Ideel til meget besøgte WP-sider |
| 6–10 sekunder | Produkt- og evergreen-sider | Meget lav belastning på backend-systemet | Opdateringer tager kun få sekunder |
| 15–30 sek. | Indhold, der sjældent ændres | Maksimal aflastning | Brug kun, hvis friskheden er i orden |
Overvågning og analyse af overskrifter
Overskrift fortæller sandheden: Med X-Cache, Age og Cache-Control kan jeg identificere hits, udløbsdatoer og omgåelser. I browserens udviklerværktøj kan jeg straks se, om siden blev hentet som et HIT, og hvor gammel posten er. På serversiden logger jeg status i access_log for at identificere hotspots og målrettet justere reglerne. Derudover lægger jeg mærke til Cache-Control-header, så browser-cacher og proxyservere fungerer optimalt. Ved regelmæssig måling kan man afdække spild, undgå fejl og sikre, at platformen forbliver pålideligt hurtig.
Skalering ved spidsbelastninger
Trafik fordeler sig sjældent jævnt; spidsbelastninger opstår ofte inden for sekunder. Microcaching opfanger disse bølger, fordi identiske sidevisninger straks hentes fra cachen og dermed omgår de ressourcekrævende backend-stier. Det mindsker fejlprocenten, TTFB reduceres markant, og siden forbliver tilgængelig for læserne. Selv små VPS-instanser kan på denne måde håndtere spidsbelastninger fra nyhedsbreve eller sociale medier uden at gå ned. For redaktioner, webshops med produktlanceringer eller kampagner er dette en afgørende fordel.
Samspil med plugins og CDN
Plugin-Cacher fungerer ofte på PHP-niveau; mikro-cachen ligger foran og er afgørende for den største effekt. Jeg indstiller derfor plugin-cache-varighederne til at være kortere end NGINX-TTL eller udelader dem helt for standardsider, så ingen dobbelte lag unødigt sluger energi. Et CDN kan levere billeder, CSS og JS, mens mikrocachen fremskynder HTML; denne kombination dækker begge niveauer. Browser-caching via ETag, Last-Modified og Gzip/Brotli fuldender billedet og reducerer båndbreddeforbruget. Vigtigt: Purge-hooks forbinder publikationer eller produktændringer med en målrettet cache-invalidering.
Ekstreme tilfælde og sikkerhed
Personoplysninger Jeg udelukker strengt bestemte indholdstyper, såsom kontosider, ordreoversigter eller indhold, der er knyttet til en bestemt session. For WooCommerce skelner jeg klart mellem produktive kategorisider (kan caches) og indkøbskurv/kasse/konto (omgås). Forhåndsvisninger, nonce-beskyttede handlinger og admin-stier udelades ligeledes. Jeg tester målrettet med indloggede og anonyme brugere samt enheder med og uden cookies. På den måde forbliver siden korrekt, hurtig og i overensstemmelse med lovgivningen.
Hosting i praksis og omkostninger
Serveromkostninger stiger hurtigt, når hver forespørgsel involverer PHP og databasen; mikrocaching sparer her penge. Mange sider klarer sig forbløffende godt med 1–4 CPU-kerner og 2–8 GB RAM, når mikrocachen fungerer optimalt. I stedet for at hæve abonnementet med 20–50 € om måneden reducerer jeg antallet af backend-forespørgsler og holder svartiderne korte. Når det gælder sammenligninger og anbefalinger, regnes webhoster.de ofte som testvinder inden for WordPress-ydeevne, især hvor svartid og belastningsadfærd tæller. Hvis man vil øge ydeevnen, skal man satse på hurtigere NVMe-lagerplads, aktuelle OpenSSL/Brotli-versioner og konsekvente sikkerhedskopier.
Opsætning i praksis: Minimalkonfiguration med beskyttelsesregler
Beton Direktiver hjælper med at komme hurtigt i gang. Det følgende eksempel skitserer en praktisk grundkonfiguration med cache-lock, cookie-undtagelser, BYPASS og korte TTL-værdier kun for HTML.
# Global cache-zone (juster størrelse og inaktivitetstid)
fastcgi_cache_path /var/cache/nginx/fastcgi levels=1:2 keys_zone=MICRO:32m
max_size=2g inactive=60s use_temp_path=off;
# Kun GET/HEAD kan caches
map $request_method $cacheable_method {
default 0;
GET 1;
HEAD 1;
}
# Cookies/parametre, der omgår cachen
map $http_cookie $skip_cache {
default 0;
~*(wordpress_logged_in|wordpress_sec) 1;
~*(wp-postpass|comment_author) 1;
~*(woocommerce_items_in_cart|woocommerce_cart_hash|wp_woocommerce_session_) 1;
}
# Valgfri bypass-headere (f.eks. til purge-hooks)
map $http_x_microcache_bypass $header_bypass {
default 0;
1 1;
}
# Enkel omgåelse af sporingsparametre (forhindrer fragmentering)
map $args $has_tracking {
default 0;
~*(^|&)(utm_[^&]+|fbclid|gclid|mc_cid|mc_eid)= 1;
}
# Sammenlægning af betingelserne
map "$cacheable_method$skip_cache$header_bypass$has_tracking" $bypass {
default 1; # Standard: bypass
1000 0; # GET/HEAD, ingen cookies, ingen header, ingen trackere: cache
}
server {
listen 80;
server_name example.com;
root /var/www/html;
# Cache-Lock beskytter mod stampeder
fastcgi_cache_lock on;
fastcgi_cache_lock_age 5s;
fastcgi_cache_lock_timeout 10s;
# PHP-Location
location ~ \.php$ {
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass unix:/run/php/php-fpm.sock;
# Cache kun HTML kortvarigt
set $is_html 0;
if ($sent_http_content_type ~* "text/html") { set $is_html 1; }
fastcgi_cache MICRO;
fastcgi_cache_key "$scheme$request_method$host$uri$is_args$args";
fastcgi_no_cache $bypass;
fastcgi_cache_bypass $bypass;
# TTL-profil
fastcgi_cache_valid 200 3s;
fastcgi_cache_valid 301 302 10s;
fastcgi_cache_valid any 0s;
# Servering af forældede data ved fejl
fastcgi_cache_use_stale error timeout updating http_500 http_503;
# Gennemsigtige svar
add_header X-Cache $upstream_cache_status always;
# Store svar skal ikke bufferes
fastcgi_buffers 16 16k;
fastcgi_buffer_size 32k;
}
# WordPress-standard
location / {
try_files $uri $uri/ /index.php?$args;
}
# Aldrig cache
location = /wp-login.php { access_log off; }
location ~* ^/(wp-admin|cart|checkout|my-account|account) { add_header X-Cache BYPASS always; }
}
Bemærk: Sporingsparametrene behandles her via en bypass. Hvis man ønsker at fjerne dem, kan man bruge serverbaserede kanoniske omdirigeringer eller avanceret normalisering; til mikrocaching er den enkle omgåelse som regel tilstrækkelig og forhindrer fragmentering af nøgler.
Nøglestrategi og normalisering
En ren cache-nøgle forhindrer dubletter. Jeg tager udgangspunkt i sti- og forespørgselsstatus, der rent faktisk ændrer indholdet. Eksempler:
- Sørg for, at trailing slashes er ensartede (WordPress styrer dette via permalinks/try_files).
- Tillad kun relevante parametre (f.eks. s= til søgning, paged= til paginering); alt andet omgår cachen.
- Enhedsklasser og sprog skal kun medtages i nøglen, hvis HTML-koden rent faktisk varierer (f.eks. ved serverbaseret A/B-test eller flersprogede temaer uden URL-præfiks).
Jo færre varianter der genereres af den samme side, jo højere er hitraten. For internationaliserede websteder med sprogpræfikser (/de/, /en/) er stien tilstrækkelig; ved cookie-baseret sproginddeling skal cookien fungere som en omgåelse.
Beskyttelse mod stampede og stale-strategier
fastcgi_cache_lock forhindrer, at der ved udløb af TTL’en startes snesevis af samtidige PHP-kald. NGINX lader præcis én anmodning „rekalibrere“ og betjener parallelle adgangsforespørgsler med det senest gyldige objekt (opdatering). Derudover gælder, at fastcgi_cache_use_stale Siden er stadig tilgængelig, selv ved fejl (timeout, 500/503). I praksis medfører dette et drastisk fald i antallet af 502/504-fejl under spidsbelastninger.
Rensning og opdatering af indhold i praksis
Mikrocaching fungerer ved hjælp af korte TTL’er, så klassisk rydning sjældent er nødvendig. For redaktioner eller webshops, der forventer „øjeblikkelig“ synlighed, har tre metoder vist sig at fungere godt:
- Soft-Purge via bypass-header: En WordPress-hook (f.eks. ved offentliggørelse/opdatering) henter via HTTP en URL med X-Microcache-Bypass: 1. Disse anmodninger omgår cachen og „opvarmer“ den nye HTML uden forsinkelse.
- Målrettet skipping pr. URL: For særligt kritiske sider (forsiden, bestemte kategorier) kan der midlertidigt indstilles en BYPASS via en NGINX-map (flag i en fil/variabel), som ophæves igen efter få sekunder.
- Fildrevet sletning: Det er muligt, men fejlbehæftet, fordi nøglerne gemmes som hashkoder. Jeg bruger det kun, hvis det er absolut nødvendigt, og med en klar sti-strategi.
Det vigtige er: Mikro-TTL’er på 3–10 s sikrer praktisk talt altid, at dataene er opdaterede, uden behov for en omfattende purge-infrastruktur.
Logning, målinger og belastningstests
Måling gør effekterne synlige. Et udvidet logformat dokumenterer status og tidspunkter:
log_format micro '$remote_addr - $host "$request" $status '
'rt=$request_time urt=$upstream_response_time '
'u_cache=$upstream_cache_status bytes=$body_bytes_sent';
access_log /var/log/nginx/access.micro.log micro;
Efter hver implementering tjekker jeg fordelingen af HIT/MISS/BYPASS, den gennemsnitlige request_time og forskellene mellem varme og kolde opkald. I belastningstests (f.eks. med korte stigninger og spidsbelastninger) kan man se, at TTFB forbliver stabilt lavt under belastning, og at variansen falder. Hvis man ser afvigelser, justerer man TTL, bypass-regler eller reducerer unødvendige varianter i nøglen.
WooCommerce: praktiske undtagelser
Butikker drager stor fordel af Microcache til kategorisider, produktlister, produktdetaljesider (uden personaliserede blokke) og redaktionelt indhold. Indkøbskurv, kasse, konto og sammenligningslister er absolut forbudt område. Typiske cookie-regler:
- Bypass i: woocommerce_items_in_cart, woocommerce_cart_hash, wp_woocommerce_session_*
- Bypass i: logged_in, wordpress_sec, wp-postpass_* (adgangskode-indlæg)
- Bypass ved: »add-to-cart«-parametre og nonce-beskyttede handlinger
På produktsider tester jeg desuden, om dynamiske lager-/pris-widgets opdateres via AJAX. Hvis det er tilfældet, forbliver HTML-koden cachebar, mens dataene hentes frisk via API’en – en klar adskillelse med maksimal hastighed.
Ressourcer og hukommelseslayout
Cache-zone og lagringspladsen har direkte indflydelse på stabiliteten. Her er et par tommelfingerregler:
- keys_zone: 16–64 MB er nok til titusindvis af nøgler; det er bedst at regne med lidt ekstra plads.
- max_size: Begræns cache-størrelsen tydeligt; ved NVMe er 1–4 GB ofte tilstrækkeligt til mikrocacher.
- inaktiv: Hold sjældent anvendte genstande i 30–120 sekunder; for mikrocacher er 60 sekunder tilstrækkeligt.
- tmpfs: For meget små websteder med ekstreme krav til latenstid kan tmpfs (RAM) være en god løsning; vær dog opmærksom på, at RAM er en begrænset ressource og flygtig.
På PHP-FPM-siden sørger jeg takket være cachen for lavere værdier for `pm.max_children` og mindsker dermed belastningen på hukommelsen – ofte en af de hurtigste måder at „reducere omkostningerne“ på overbelastede servere.
Typiske faldgruber og fejlfinding
Hyppig Fejlkilder kan opdages tidligt ved hjælp af et par kontroller:
- Forkerte cookies i cachen: Når sider med »Set-Cookie«-headere caches, får anonyme besøgende resterne af en session. Løsning: fastcgi_no_cache/fastcgi_cache_bypass ved $upstream_http_set_cookie eller specifikke cookies.
- Nonce- og preview-problemer: preview=true, customize_changeset_uuid, _wpnonce – skal absolut omgås.
- Omdirigeringssløjfer: 301/302: kun kortvarig caching eller målrettet udelukkelse; tjek canonical-tags og reglerne for trailing slash.
- Søgesider (/?s=…): Som regel individuelt; jeg indstiller som standard til BYPASS.
- xmlrpc.php, wp-cron.php: Undlad at gemme dem i cachen, og begræns dem om nødvendigt; de medfører ofte unødvendig belastning.
- Blandet indhold Ved skift mellem HTTP og HTTPS: Nøglen indeholder $scheme; sørg for, at webstedet konsekvent kører via HTTPS.
- Manglende Vary-headere For ressourcer: Irrelevant for HTML, men nyttigt for statiske filer; dog gælder følgende: HTML hentes fra FastCGI-cachen, mens ressourcer ideelt set hentes fra CDN’en.
Finjustering til virkelige redaktionsarbejdsgange
Redaktionelle kontorer Arbejder i bølger: udkast, forhåndsvisninger, udgivelser. Microcaching må aldrig forstyrre dette. Jeg gør følgende:
- Kortere TTL for startsiden og kategoriarkiverne (3–5 sek.), længere for statiske landingssider (8–10 sek.).
- Opvarmning vigtige ruter (Forside, Topkategorier, de 3–5 seneste artikler) umiddelbart efter offentliggørelseshændelser via bypass-header, så læserne straks modtager den nye HTML.
- Stale-if-error bevidst aktiv for at forblive tilgængelig, selv ved kortvarige problemer med databasen.
På den måde smelter brugervenlighed og ydeevne problemfrit sammen – uden at forfatterne behøver at klikke på „Tøm cache“.
Tjekliste: Fra nul til målbar acceleration
Først Jeg opretter fastcgi_cache_path og en zone, hvorefter jeg aktiverer fastcgi_cache i den relevante serverblok. Derefter definerer jeg cache-nøgler, TTL og headers, sætter X-Cache og sørger for klare undtagelser med fastcgi_no_cache/skip. Herefter tjekker jeg GET/HEAD, BYPASS-cookies og query-parametre for at beskytte personaliserede svar. Under drift overvåger jeg HIT/MISS/AGE, justerer TTL og nøglestrategien og tester effekten i belastningstests. Til sidst knytter jeg publikationer til purge-begivenheder, så ændringer hurtigt bliver synlige.
At tage væk
Mikrocaching Det fremskynder WordPress markant, fordi identiske sidevisninger forbliver i NGINX-cachen i nogle sekunder og leveres igen uden brug af PHP-FPM. Metoden aflaster databasen, reducerer fejlprocenten i spidsbelastningsperioder og holder samtidig indholdet opdateret. Regler for cookies, logins og indkøbskurve bevarer funktionerne, mens standardsider får det maksimale udbytte. I kombination med OPcache, komprimerede ressourcer og en fornuftig databasekonfiguration opnås en mærkbar hastighedsforbedring. Hvis man vælger cache-vinduet klogt, kan man måle effekten i millisekunder i stedet for sekunder og øge brugertilfredsheden markant.


