{"id":12672,"date":"2025-09-21T08:38:11","date_gmt":"2025-09-21T06:38:11","guid":{"rendered":"https:\/\/webhosting.de\/serverseitiges-caching-nginx-apache-guide-leistung-turbo\/"},"modified":"2025-09-21T08:38:11","modified_gmt":"2025-09-21T06:38:11","slug":"caching-pa-serversiden-nginx-apache-guide-performance-turbo","status":"publish","type":"post","link":"https:\/\/webhosting.de\/da\/serverseitiges-caching-nginx-apache-guide-leistung-turbo\/","title":{"rendered":"Ops\u00e6t caching p\u00e5 serversiden med Nginx eller Apache - effektiv ydeevne for hjemmesider"},"content":{"rendered":"<p>Jeg ops\u00e6tter caching p\u00e5 serversiden enten med <strong>Nginx<\/strong> eller <strong>Apache<\/strong> s\u00e6tte klare cache-regler og overv\u00e5ge effekten p\u00e5 svartiderne. P\u00e5 den m\u00e5de reducerer jeg serverbelastningen m\u00e6rkbart, leverer flere foresp\u00f8rgsler pr. sekund og holder dynamiske websites p\u00e5lideligt hurtige under h\u00f8j belastning.<\/p>\n\n<h2>Centrale punkter<\/h2>\n\n<p>F\u00f8r jeg s\u00e6tter indstillingerne, organiserer jeg klart m\u00e5lene: Hvilket indhold kan indg\u00e5 i <strong>Cache<\/strong>hvor l\u00e6nge og p\u00e5 hvilket niveau. For dynamiske sider planl\u00e6gger jeg undtagelser for <strong>Sessioner<\/strong> og personaliserede data. Jeg v\u00e6lger den rette arkitektur og tjekker, om en reverse proxy giver mening. Derefter strukturerer jeg konfigurationen i rene <strong>vHosts<\/strong> og tjekker systematisk overskrifter. Endelig forankrer jeg overv\u00e5gningen, s\u00e5 jeg p\u00e5lideligt kan vurdere effekten af hver \u00e6ndring.<\/p>\n<ul>\n  <li><strong>Arkitektur<\/strong> afklare<\/li>\n  <li><strong>Cache-type<\/strong> Definere<\/li>\n  <li><strong>Overskrift<\/strong> styre<\/li>\n  <li><strong>Invalidering<\/strong> Planl\u00e6g<\/li>\n  <li><strong>Overv\u00e5gning<\/strong> etablere<\/li>\n<\/ul>\n\n\n<figure class=\"wp-block-image size-full is-resized\">\n  <img fetchpriority=\"high\" decoding=\"async\" src=\"https:\/\/webhosting.de\/wp-content\/uploads\/2025\/09\/nginx-caching-server-4872.png\" alt=\"\" width=\"1536\" height=\"1024\" \/>\n<\/figure>\n\n\n<h2>Grundl\u00e6ggende: Hvad betyder caching p\u00e5 serversiden?<\/h2>\n\n<p>Caching p\u00e5 serversiden gemmer svar p\u00e5 <strong>Foresp\u00f8rgsler<\/strong> p\u00e5 webserveren, s\u00e5 jeg kan levere ofte efterspurgt indhold uden genberegning. Tiden til den f\u00f8rste byte er m\u00e6rkbart reduceret, fordi applikationen, databasen og filsystemet har mindre arbejde at g\u00f8re. Jeg skelner mellem cache p\u00e5 proxy-niveau, FastCGI-cache og filcache til statiske filer. <strong>Aktiver<\/strong>. Det er vigtigt at have en streng plan for, hvilket indhold der betragtes som offentligt, og hvilket der forbliver personligt. For hver regel definerer jeg en levetid (TTL) og klare betingelser for at t\u00f8mme cachen.<\/p>\n\n<h2>Nginx og Apache - arkitektur og cache-koncepter<\/h2>\n\n<p>Nginx fungerer <strong>begivenhedsdrevet<\/strong> og er derfor meget velegnet til h\u00f8j parallelisme og hurtig caching. Apache bruger processer og tr\u00e5de, men tilbyder et meget fleksibelt modullandskab, som jeg fint kan kontrollere. Til statisk indhold imponerer Nginx med en meget lav CPU-belastning, mens Apache scorer med funktionsdybde til dynamiske applikationer. Hvis jeg bruger en reverse proxy, f\u00e5r n\u00e6sten alle apps gavn af kortere svartider. Jeg giver et overblik over performance-siden af Nginx som reverse proxy her: <a href=\"https:\/\/webhosting.de\/da\/nginx-webserver-reverse-proxy-performance-skalerbarhed\/\">Nginx som omvendt proxy<\/a>.<\/p>\n\n<p>F\u00f8lgende tabel opsummerer de vigtigste forskelle og hj\u00e6lper mig med at finde den rigtige <strong>Strategi<\/strong> at v\u00e6lge. Det giver mig mulighed for bedre at kategorisere krav, v\u00e6rkt\u00f8jer og fremtidige driftsplaner. Jeg tager h\u00f8jde for vedligeholdelse, appens kompleksitet og typiske spidsbelastninger. Jo enklere indholdet er, jo st\u00f8rre er potentialet for aggressivitet. <strong>Caching<\/strong>. Til meget dynamisk indhold plejer jeg at bruge specifikke undtagelser og kortere TTL'er.<\/p>\n\n<table>\n  <thead>\n    <tr>\n      <th>Kriterium<\/th>\n      <th>Apache<\/th>\n      <th>Nginx<\/th>\n    <\/tr>\n  <\/thead>\n  <tbody>\n    <tr>\n      <td>Software-arkitektur<\/td>\n      <td>Proces- og tr\u00e5dbaseret<\/td>\n      <td>Begivenhedsstyret (asynkron)<\/td>\n    <\/tr>\n    <tr>\n      <td>Statisk indhold<\/td>\n      <td>God<\/td>\n      <td>Meget hurtig<\/td>\n    <\/tr>\n    <tr>\n      <td>Dynamisk indhold<\/td>\n      <td>Meget fleksibel (moduler)<\/td>\n      <td>Om PHP-FPM\/Upstreams<\/td>\n    <\/tr>\n    <tr>\n      <td>Cache-funktioner<\/td>\n      <td>mod_cache, mod_file_cache<\/td>\n      <td>FastCGI-cache, proxy-cache<\/td>\n    <\/tr>\n    <tr>\n      <td>Konfiguration<\/td>\n      <td>Centraliseret og via .htaccess<\/td>\n      <td>Centralt i nginx.conf<\/td>\n    <\/tr>\n  <\/tbody>\n<\/table>\n\n\n<figure class=\"wp-block-image size-full is-resized\">\n  <img decoding=\"async\" src=\"https:\/\/webhosting.de\/wp-content\/uploads\/2025\/09\/servercachingmeeting2038.png\" alt=\"\" width=\"1536\" height=\"1024\" \/>\n<\/figure>\n\n\n<h2>Konfigurer Nginx: FastCGI-cache trin for trin<\/h2>\n\n<p>Jeg definerer f\u00f8rst en <strong>Cache-sti<\/strong> og en navngiven zone, s\u00e5 Nginx kan gemme indhold p\u00e5 en struktureret m\u00e5de. Derefter tilslutter jeg PHP-upstreams (f.eks. PHP-FPM) og aktiverer fastcgi_cache p\u00e5 de relevante steder. For dynamiske apps indstiller jeg <strong>Cache-bypass<\/strong> til cookies som PHPSESSID eller til indloggede brugere, s\u00e5 personaliserede sider forbliver friske. Jeg bruger fastcgi_cache_valid til at tildele TTL'er til statuskoder og sikre kontrolleret \u00e6ldning af indhold. Med X-FastCGI-Cache-headeren kan jeg se, om en anmodning var en HIT, MISS eller BYPASS, og jeg kan finjustere mine regler i overensstemmelse hermed.<\/p>\n\n<h2>Konfigurer Apache: Brug mod_cache sikkert<\/h2>\n\n<p>Under Apache aktiverer jeg mod_cache og mod_cache_disk eller den delte hukommelsesbackend, afh\u00e6ngigt af <strong>M\u00e5l<\/strong>. I vHost-konfigurationen sl\u00e5r jeg specifikt CacheEnable til, definerer Expires-v\u00e6rdier og ignorerer headere som Set-Cookie, hvis indholdet skal forblive offentligt. For finere kontrol bruger jeg fil- og sti-scopes, s\u00e5 kun passende <strong>Ressourcer<\/strong> komme ind i cachen. Hvor appen tillader det, indstiller jeg cachekontrollen korrekt og skaber dermed et klart samspil mellem appen og serveren. For regler p\u00e5 katalogniveau hj\u00e6lper denne kompakte regel mig <a href=\"https:\/\/webhosting.de\/da\/htaccess-guide-webserver-konfiguration\/\">.htaccess-guide<\/a>.<\/p>\n\n<h2>Cacheregler og edge cases: cookies, sessioner, foresp\u00f8rgselsstrenge<\/h2>\n\n<p>Jeg blokerer personligt <strong>Svar p\u00e5 sp\u00f8rgsm\u00e5l<\/strong> konsekvent fra caching, f.eks. ved hj\u00e6lp af sessionscookies. For foresp\u00f8rgselsstrenge skelner jeg mellem rigtige varianter (f.eks. paginering) og sporingsparametre, som jeg fjerner eller ignorerer. For API'er eller s\u00f8geresultater tildeler jeg korte TTL'er eller s\u00e6tter dem helt til NO-CACHE for at undg\u00e5 falske positiver. <strong>Hits<\/strong> for at undg\u00e5. Jeg cacher ikke fil-downloads og formular-POSTs, mens jeg aggressivt kan cache thumbnails og assets. For landingssider med en hurtig kampagne planl\u00e6gger jeg korte, men effektive TTL'er plus hurtig ugyldigg\u00f8relse, n\u00e5r der foretages \u00e6ndringer.<\/p>\n\n\n<figure class=\"wp-block-image size-full is-resized\">\n  <img decoding=\"async\" src=\"https:\/\/webhosting.de\/wp-content\/uploads\/2025\/09\/server-caching-nginx-apache-8472.png\" alt=\"\" width=\"1536\" height=\"1024\" \/>\n<\/figure>\n\n\n<h2>Overv\u00e5gning og fejlfinding: Forst\u00e5else af cache-hitrater<\/h2>\n\n<p>Jeg observerer X-Cache eller X-FastCGI-Cache i <strong>Overskrifter til svar<\/strong> og m\u00e5le hitraten over tid. Logfiler og statusmoduler viser mig udnyttelse, ventetider og fejlsituationer. Med korte testk\u00f8rsler efter \u00e6ndringer kontrollerer jeg, om misses bliver til hits, og om der ikke er modtaget f\u00f8lsomme svar i <strong>Cache<\/strong> land. Load tests afsl\u00f8rer hot paths og hj\u00e6lper med at forfine specifikke regler. Det giver mig mulighed for at genkende flaskehalse tidligt og holde milj\u00f8et responsivt under reelle belastningsspidser.<\/p>\n\n<h2>Design af cachen\u00f8gler og varierende strategier<\/h2>\n\n<p>En ren cachen\u00f8gle afg\u00f8r, om forskellige varianter er rent adskilt eller utilsigtet blandet. Jeg definerer bevidst n\u00f8glen og tager hensyn til skemaet, v\u00e6rten, stien og relevante parametre. Jeg udelukker sporingsparametre og inkluderer reelle varianter (f.eks. paginering, sortering, sprog). P\u00e5 Nginx-niveau opn\u00e5r jeg dette via variabler og maps, i Apache via specifikke regler og overholdelse af <strong>Varierer<\/strong>-Overskrift.<\/p>\n<ul>\n  <li><strong>V\u00e6rts- og protokoladskillelse:<\/strong> Inkluder http\/https og dom\u00e6ner eksplicit i n\u00f8glen, hvis begge varianter findes.<\/li>\n  <li><strong>Normaliser foresp\u00f8rgselsstrenge:<\/strong> Standardiser sekvensen, kass\u00e9r irrelevante parametre, hvidlist relevante.<\/li>\n  <li><strong>Enhed og sprogvarianter:<\/strong> Cache kun, hvis det er rent adskilt (f.eks. af underdom\u00e6ne, sti eller eksplicit cookie); ellers er der risiko for en n\u00f8gleeksplosion.<\/li>\n  <li><strong>Indstil Vary-header korrekt:<\/strong> Accept-Encoding for Gzip\/Brotli, valgfri Accept-Language, aldrig Vary: *<\/li>\n  <li><strong>Overvej cookies sparsomt:<\/strong> Medtag kun de cookies i beslutningen, som virkelig p\u00e5virker visningen (f.eks. login-status).<\/li>\n<\/ul>\n<p>Det forhindrer cacheforgiftning og holder antallet af objektvarianter under kontrol. F\u00e6rre varianter betyder h\u00f8jere hitrate og lavere lageromkostninger.<\/p>\n\n<h2>Friskhed, revalidering og for\u00e6ldede strategier<\/h2>\n\n<p>Jeg kombinerer <strong>TTL<\/strong> med revalidering for at holde indholdet friskt og stabilt p\u00e5 samme tid. For delte cacher er s-maxage og cachekontrol afg\u00f8rende. Derudover bruger jeg stale-strategier for fortsat at kunne levere hurtige svar p\u00e5 upstream-problemer.<\/p>\n<ul>\n  <li><strong>s-maxage vs. max-age:<\/strong> s-maxage styrer delte cacher (proxy, CDN), max-age browseren. Til HTML s\u00e6tter jeg ofte s-maxage til et par minutter, max-age til kort eller nul.<\/li>\n  <li><strong>stale-while-revalidate:<\/strong> Brugerne modtager gamle svar, mens opdateringerne udf\u00f8res i baggrunden. Det udj\u00e6vner spidsbelastninger betydeligt.<\/li>\n  <li><strong>stale-if-error:<\/strong> I tilf\u00e6lde af 5xx-fejl forts\u00e6tter jeg med at servere fra cachen for at skjule fejl.<\/li>\n  <li><strong>use_stale\/Baggrundsopdatering:<\/strong> I Nginx bruger jeg use_stale og baggrundsopdateringer; i Apache bruger jeg indstillinger som CacheStaleOnError.<\/li>\n  <li><strong>ETag\/Last-Modified:<\/strong> Revalidering sparer b\u00e5ndbredde, hvis klienten sender If-None-Match\/If-Modified-Since, og serveren returnerer 304.<\/li>\n<\/ul>\n<p>Med denne kombination opn\u00e5r jeg korte svartider og robuste tjenester, selv ved udrulninger eller kortvarige upstream-forsinkelser.<\/p>\n\n<h2>Microcaching og opfangning af spidsbelastninger<\/h2>\n\n<p>Til meget dynamiske sider, der foresp\u00f8rges ofte, men med lignende resultater, bruger jeg <strong>Mikrocaching<\/strong> p\u00e5. Jeg cacher HTML-resultater i 1-10 sekunder og forhindrer dermed 1.000 lignende foresp\u00f8rgsler i at komme ind i applikationen p\u00e5 samme tid.<\/p>\n<ul>\n  <li><strong>Kort, men effektivt:<\/strong> En TTL p\u00e5 3-5 sekunder reducerer spidsbelastninger enormt, uden at brugerne bem\u00e6rker for\u00e6ldet indhold.<\/li>\n  <li><strong>Granuleret:<\/strong> Aktiveres kun p\u00e5 hotspots (startside, kategorisider, s\u00f8geforslag), ikke globalt.<\/li>\n  <li><strong>Bypass til personalisering:<\/strong> Sessions-, indk\u00f8bskurvs- eller login-cookies udelukker mikrocaching.<\/li>\n<\/ul>\n<p>Microcaching er et godt middel til at reducere omkostningerne og \u00f8ge stabiliteten under burst-trafik.<\/p>\n\n<h2>Undg\u00e5 cache-storml\u00f8b: L\u00e5sning og begr\u00e6nsninger<\/h2>\n\n<p>Med en <strong>Tordnende komfur<\/strong> mange samtidige anmodninger k\u00f8rer p\u00e5 et udl\u00f8bet objekt. Det forhindrer jeg ved at blokere foresp\u00f8rgsler, mens der oprettes en ny kopi.<\/p>\n<ul>\n  <li><strong>Nginx:<\/strong> Aktiver cache_lock for proxy- og FastCGI-cacher, og v\u00e6lg timeouts med omtanke.<\/li>\n  <li><strong>Apache:<\/strong> Brug CacheLock, s\u00e5 ikke alle arbejdere rammer applikationen p\u00e5 samme tid.<\/li>\n  <li><strong>Begr\u00e6ns ressourcer:<\/strong> Dimension\u00e9r samtidige upstream-forbindelser, medarbejdere og k\u00f8-dybder p\u00e5 passende vis.<\/li>\n<\/ul>\n<p>Derudover hj\u00e6lper en lidt l\u00e6ngere s-maxage plus revalidering med at sikre, at objekter sj\u00e6ldent falder ud af cachen synkront.<\/p>\n\n<h2>Beslutning: Hvorn\u00e5r Nginx, hvorn\u00e5r Apache, hvorn\u00e5r Varnish?<\/h2>\n\n<p>Til statisk indhold og PHP-applikationer med klare cacheregler bruger jeg normalt <strong>Nginx<\/strong> med FastCGI-cache. Til komplekse app-ops\u00e6tninger med mange moduler, rewrite-k\u00e6der og blandet brug af forskellige scripting-sprog bruger jeg ofte <strong>Apache<\/strong>. Hvis jeg har brug for yderligere edge caching eller udvidede politikker, placerer jeg en reverse proxy foran den. Denne guide giver et godt udgangspunkt for at s\u00e6tte det op: <a href=\"https:\/\/webhosting.de\/da\/opsaetning-af-reverse-proxy-apache-nginx-techboost\/\">Ops\u00e6t omvendt proxy<\/a>. Det er vigtigt at prioritere korrekt: f\u00f8rst korrekte app-headere, s\u00e5 caching p\u00e5 serversiden og til sidst valgfrie proxy-lag.<\/p>\n\n\n<figure class=\"wp-block-image size-full is-resized\">\n  <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/webhosting.de\/wp-content\/uploads\/2025\/09\/caching-nginx-apache-night-9472.png\" alt=\"\" width=\"1536\" height=\"1024\" \/>\n<\/figure>\n\n\n<h2>Sikkerhed og compliance: Hvad er tilladt i cachen?<\/h2>\n\n<p>F\u00f8lsom <strong>Data<\/strong> forbliver altid udenfor: profiler, indk\u00f8bskurve, ordreoversigter, billetter, patientoplysninger, administratoromr\u00e5der. Jeg s\u00e6tter clear cache control headers, s\u00e5 proxyer og browsere ikke gemmer noget fortroligt indhold. Til cookies bruger jeg SameSite, HttpOnly og Secure, og jeg adskiller konsekvent personaliserede stier. Jeg logger ogs\u00e5 us\u00e6dvanlige adgange for hurtigt at kunne genkende fejlkonfigurationer. Det holder ydeevnen h\u00f8j uden at s\u00e6tte fortroligheden over styr.<\/p>\n\n<h2>Header-politikker i praksis<\/h2>\n\n<p>Jeg definerer et konsistent header-s\u00e6t, s\u00e5 alle niveauer handler p\u00e5 samme m\u00e5de og ikke sender modstridende instruktioner.<\/p>\n<ul>\n  <li><strong>HTML (offentlig, men kortvarig):<\/strong> Cache-Control: public, s-maxage a few minutes, max-age rather 0-60s, must-revalidate if necessary; ETag\/Last-Modified active.<\/li>\n  <li><strong>Aktiver (langtidsholdbare):<\/strong> Cache-Control: public, max-age 1 year, immutable; version af filnavne (fingeraftryk), s\u00e5 jeg kan distribuere uden Purge.<\/li>\n  <li><strong>Personlige sider:<\/strong> Cache-Control: no-store, private; Set-Cookie kun hvor det er n\u00f8dvendigt. Del aldrig Authorisation header.<\/li>\n  <li><strong>Omdirigeringer og 404:<\/strong> 301 kan leve i lang tid, 302\/307 kun i kort tid; 404 cache i kort tid, s\u00e5 fejl ikke rettes.<\/li>\n  <li><strong>Kompression:<\/strong> Aktiv\u00e9r Gzip\/Brotli, og indstil Vary: Accept-Encoding, s\u00e5 varianter adskilles korrekt.<\/li>\n<\/ul>\n<p>Det g\u00f8r opf\u00f8rslen gennemsigtig - b\u00e5de for browsere, proxyer og servercachen.<\/p>\n\n<h2>Interaktion med CDN og browsercache<\/h2>\n\n<p>Jeg kombinerer server-side <strong>Caching<\/strong> med et CDN, der leverer statiske aktiver med en lang TTL. For HTML indstiller jeg kortere TTL'er p\u00e5 serveren og specificerer differentierede regler i CDN'et. I browseren kontrollerer jeg Expires, ETags og Cache-Control, s\u00e5 tilbagevendende brugere ikke beh\u00f8ver at genindl\u00e6se ret meget. Versionerede filnavne (asset fingerprints) giver mulighed for lange driftstider uden forkerte <strong>Indhold<\/strong>. Jeg udruller \u00e6ndringer via cache-rensninger eller nye asset-versioner.<\/p>\n\n\n<figure class=\"wp-block-image size-full is-resized\">\n  <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/webhosting.de\/wp-content\/uploads\/2025\/09\/servercaching_nginx_apache_3847.png\" alt=\"\" width=\"1536\" height=\"1024\" \/>\n<\/figure>\n\n\n<h2>Kapacitetsplanl\u00e6gning og storage-tuning<\/h2>\n\n<p>En cache fungerer kun godt, hvis st\u00f8rrelsen, hukommelseslayoutet og swapping-reglerne er rigtige. Jeg vurderer den n\u00f8dvendige kapacitet ud fra antallet af unikke objekter pr. TTL og deres gennemsnitlige st\u00f8rrelse og planl\u00e6gger en buffer til spidsbelastninger. I Nginx bestemmer jeg keys_zone (indeks i RAM), inactive (proces uden hits) og max_size (p\u00e5 disk). I Apache tjekker jeg cachestien, den maksimale st\u00f8rrelse og bruger v\u00e6rkt\u00f8jer til reng\u00f8ring.<\/p>\n<ul>\n  <li><strong>Dedikeret hukommelse:<\/strong> Separat volumen\/partition til cache for at reducere IO-konkurrence.<\/li>\n  <li><strong>Parametre for filsystemet:<\/strong> Indstillinger som noatime reducerer IO-overhead; store inodes\/blokke kan indeholde mange sm\u00e5 filer mere effektivt.<\/li>\n  <li><strong>Udsmidning:<\/strong> Accepter LRU-strategier, og v\u00e6lg TTL'er, s\u00e5 varme objekter forbliver.<\/li>\n  <li><strong>Forvarmning:<\/strong> Ping vigtige stier efter implementeringer, s\u00e5 brugerne f\u00e5r gavn af dem med det samme.<\/li>\n  <li><strong>htcacheclean\/Manager:<\/strong> Rens regelm\u00e6ssigt under Apache; blok\u00e9r ikke cache manager-processerne under Nginx.<\/li>\n<\/ul>\n<p>Hukommelsen og konfigurationen vokser i takt med, at sitet vokser - s\u00e5 hitraten forbliver stabil.<\/p>\n\n<h2>Betjening, annullering og vedligeholdelse<\/h2>\n\n<p>Jeg planl\u00e6gger klart <strong>Processer<\/strong> til cache-validering efter udrulninger, indholdsopdateringer og strukturelle \u00e6ndringer. Automatiske hooks rydder specifikt ber\u00f8rte stier i stedet for at slette hele cachen. Sundhedstjek og alarmer rapporterer us\u00e6dvanlige miss rates eller fejlkoder, s\u00e5 jeg kan reagere med det samme. Jeg dokumenterer regler, ansvarsomr\u00e5der og typiske undtagelser for at sikre ensartede resultater. Det g\u00f8r systemet forudsigeligt, hurtigt og nemt for teams at vedligeholde.<\/p>\n\n\n<figure class=\"wp-block-image size-full is-resized\">\n  <img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/webhosting.de\/wp-content\/uploads\/2025\/09\/server-caching-setup-7492.png\" alt=\"\" width=\"1536\" height=\"1024\" \/>\n<\/figure>\n\n\n<h2>Invalideringsmetoder og rensem\u00f8nstre<\/h2>\n\n<p>Rensningsmulighederne varierer afh\u00e6ngigt af stakken. Jeg foretr\u00e6kker strategier, der ikke kr\u00e6ver fuld sletning, og som minimerer risikoen.<\/p>\n<ul>\n  <li><strong>Tidsbaseret ugyldigg\u00f8relse:<\/strong> Kort s-maxage\/TTL for HTML plus revalidering; aktiver forbliver lange, fordi de er versionerede.<\/li>\n  <li><strong>Versionering af n\u00f8gler:<\/strong> Integrer et versionstoken (f.eks. build-ID) i cachen\u00f8glen; versionen \u00e6ndres under implementeringen, og gamle objekter udl\u00f8ber uden rensning.<\/li>\n  <li><strong>M\u00e5lrettede udrensninger:<\/strong> Hvor det er muligt, skal du slette selektivt via API\/PURGE; ellers skal du fjerne cache-filer selektivt og varme op.<\/li>\n  <li><strong>Tagging p\u00e5 app-niveau:<\/strong> Tildel sider til grupper\/tags, og ugyldigg\u00f8r specifikt gruppen, n\u00e5r du opdaterer indhold.<\/li>\n  <li><strong>Forbud mod tilgang ved kanten:<\/strong> M\u00f8nsterbaseret blokering, hvis en dedikeret reverse proxy er tilsluttet upstream.<\/li>\n<\/ul>\n<p>Jeg automatiserer trinene i CI\/CD-processen og f\u00f8rer logfiler for at spore, hvorn\u00e5r og hvorfor indholdet blev ugyldiggjort.<\/p>\n\n<h2>Test og kvalitetssikring<\/h2>\n\n<p>F\u00f8r reglerne g\u00e5r i luften, s\u00f8rger jeg for, at funktion og sikkerhed er i orden. Jeg arbejder med et staging-milj\u00f8 og udf\u00f8rer klart definerede tests.<\/p>\n<ul>\n  <li><strong>Kontrol af overskrift:<\/strong> Er Cache-Control, Vary, ETag\/Last-Modified korrekte for hver ressourcetype?<\/li>\n  <li><strong>Hit\/miss-analyse:<\/strong> \u00d8ger \u00e6ndringerne hitraten? Havner f\u00f8lsomme sider i cachen ved en fejltagelse?<\/li>\n  <li><strong>Belastnings- og fejltilf\u00e6lde:<\/strong> Opf\u00f8rsel under spidsbelastning, upstream timeout og 5xx - tr\u00e6der stale-if-error i kraft?<\/li>\n  <li><strong>Enhed\/sprog-varianter:<\/strong> Er varianter adskilt korrekt og returneret korrekt?<\/li>\n  <li><strong>SEO-relevante stier:<\/strong> 301\/302-h\u00e5ndtering, canonicals, paginering og s\u00f8gesider, der ikke caches forkert.<\/li>\n<\/ul>\n<p>Jeg bruger syntetiske kontroller og reelle brugerm\u00e5linger for at sikre, at optimeringer ikke f\u00f8rer til regressioner.<\/p>\n\n<h2>Kort opsummeret<\/h2>\n\n<p>Jeg bruger server-side <strong>Caching<\/strong>til at s\u00e6nke svartider, reducere serverbelastning og h\u00e5ndtere spidsbelastninger med lethed. Nginx imponerer med sin hurtige FastCGI og proxy-cache, Apache med variabel modullogik og fin kontrol. Pr\u00e6cise regler for TTL, bypass og purge, som beskytter personaliseret indhold, er afg\u00f8rende. Overv\u00e5gning med mening <strong>Overskrifter<\/strong> viser mig, om reglerne fungerer, og hvor jeg skal foretage justeringer. Med en ren konfiguration, klare undtagelser og planlagt ugyldigg\u00f8relse forbliver hvert websted hurtigt, p\u00e5lideligt og skalerbart.<\/p>","protected":false},"excerpt":{"rendered":"<p>L\u00e6r alt, hvad du har brug for at vide om caching p\u00e5 serversiden med Nginx og Apache, inklusive trinvise instruktioner og professionelle tips til bedre website-ydelse.<\/p>","protected":false},"author":1,"featured_media":12665,"comment_status":"","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_crdt_document":"","inline_featured_image":false,"footnotes":""},"categories":[676],"tags":[],"class_list":["post-12672","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-server_vm"],"acf":[],"_wp_attached_file":null,"_wp_attachment_metadata":null,"litespeed-optimize-size":null,"litespeed-optimize-set":null,"_elementor_source_image_hash":null,"_wp_attachment_image_alt":null,"stockpack_author_name":null,"stockpack_author_url":null,"stockpack_provider":null,"stockpack_image_url":null,"stockpack_license":null,"stockpack_license_url":null,"stockpack_modification":null,"color":null,"original_id":null,"original_url":null,"original_link":null,"unsplash_location":null,"unsplash_sponsor":null,"unsplash_exif":null,"unsplash_attachment_metadata":null,"_elementor_is_screenshot":null,"surfer_file_name":null,"surfer_file_original_url":null,"envato_tk_source_kit":null,"envato_tk_source_index":null,"envato_tk_manifest":null,"envato_tk_folder_name":null,"envato_tk_builder":null,"envato_elements_download_event":null,"_menu_item_type":null,"_menu_item_menu_item_parent":null,"_menu_item_object_id":null,"_menu_item_object":null,"_menu_item_target":null,"_menu_item_classes":null,"_menu_item_xfn":null,"_menu_item_url":null,"_trp_menu_languages":null,"rank_math_primary_category":null,"rank_math_title":null,"inline_featured_image":null,"_yoast_wpseo_primary_category":null,"rank_math_schema_blogposting":null,"rank_math_schema_videoobject":null,"_oembed_049c719bc4a9f89deaead66a7da9fddc":null,"_oembed_time_049c719bc4a9f89deaead66a7da9fddc":null,"_yoast_wpseo_focuskw":null,"_yoast_wpseo_linkdex":null,"_oembed_27e3473bf8bec795fbeb3a9d38489348":null,"_oembed_c3b0f6959478faf92a1f343d8f96b19e":null,"_trp_translated_slug_en_us":null,"_wp_desired_post_slug":null,"_yoast_wpseo_title":null,"tldname":null,"tldpreis":null,"tldrubrik":null,"tldpolicylink":null,"tldsize":null,"tldregistrierungsdauer":null,"tldtransfer":null,"tldwhoisprivacy":null,"tldregistrarchange":null,"tldregistrantchange":null,"tldwhoisupdate":null,"tldnameserverupdate":null,"tlddeletesofort":null,"tlddeleteexpire":null,"tldumlaute":null,"tldrestore":null,"tldsubcategory":null,"tldbildname":null,"tldbildurl":null,"tldclean":null,"tldcategory":null,"tldpolicy":null,"tldbesonderheiten":null,"tld_bedeutung":null,"_oembed_d167040d816d8f94c072940c8009f5f8":null,"_oembed_b0a0fa59ef14f8870da2c63f2027d064":null,"_oembed_4792fa4dfb2a8f09ab950a73b7f313ba":null,"_oembed_33ceb1fe54a8ab775d9410abf699878d":null,"_oembed_fd7014d14d919b45ec004937c0db9335":null,"_oembed_21a029d076783ec3e8042698c351bd7e":null,"_oembed_be5ea8a0c7b18e658f08cc571a909452":null,"_oembed_a9ca7a298b19f9b48ec5914e010294d2":null,"_oembed_f8db6b27d08a2bb1f920e7647808899a":null,"_oembed_168ebde5096e77d8a89326519af9e022":null,"_oembed_cdb76f1b345b42743edfe25481b6f98f":null,"_oembed_87b0613611ae54e86e8864265404b0a1":null,"_oembed_27aa0e5cf3f1bb4bc416a4641a5ac273":null,"_oembed_time_27aa0e5cf3f1bb4bc416a4641a5ac273":null,"_tldname":null,"_tldclean":null,"_tldpreis":null,"_tldcategory":null,"_tldsubcategory":null,"_tldpolicy":null,"_tldpolicylink":null,"_tldsize":null,"_tldregistrierungsdauer":null,"_tldtransfer":null,"_tldwhoisprivacy":null,"_tldregistrarchange":null,"_tldregistrantchange":null,"_tldwhoisupdate":null,"_tldnameserverupdate":null,"_tlddeletesofort":null,"_tlddeleteexpire":null,"_tldumlaute":null,"_tldrestore":null,"_tldbildname":null,"_tldbildurl":null,"_tld_bedeutung":null,"_tldbesonderheiten":null,"_oembed_ad96e4112edb9f8ffa35731d4098bc6b":null,"_oembed_8357e2b8a2575c74ed5978f262a10126":null,"_oembed_3d5fea5103dd0d22ec5d6a33eff7f863":null,"_eael_widget_elements":null,"_oembed_0d8a206f09633e3d62b95a15a4dd0487":null,"_oembed_time_0d8a206f09633e3d62b95a15a4dd0487":null,"_aioseo_description":null,"_eb_attr":null,"_eb_data_table":null,"_oembed_819a879e7da16dd629cfd15a97334c8a":null,"_oembed_time_819a879e7da16dd629cfd15a97334c8a":null,"_acf_changed":null,"_wpcode_auto_insert":null,"_edit_last":null,"_edit_lock":null,"_oembed_e7b913c6c84084ed9702cb4feb012ddd":null,"_oembed_bfde9e10f59a17b85fc8917fa7edf782":null,"_oembed_time_bfde9e10f59a17b85fc8917fa7edf782":null,"_oembed_03514b67990db061d7c4672de26dc514":null,"_oembed_time_03514b67990db061d7c4672de26dc514":null,"rank_math_news_sitemap_robots":null,"rank_math_robots":null,"_eael_post_view_count":"2899","_trp_automatically_translated_slug_ru_ru":null,"_trp_automatically_translated_slug_et":null,"_trp_automatically_translated_slug_lv":null,"_trp_automatically_translated_slug_fr_fr":null,"_trp_automatically_translated_slug_en_us":null,"_wp_old_slug":null,"_trp_automatically_translated_slug_da_dk":null,"_trp_automatically_translated_slug_pl_pl":null,"_trp_automatically_translated_slug_es_es":null,"_trp_automatically_translated_slug_hu_hu":null,"_trp_automatically_translated_slug_fi":null,"_trp_automatically_translated_slug_ja":null,"_trp_automatically_translated_slug_lt_lt":null,"_elementor_edit_mode":null,"_elementor_template_type":null,"_elementor_version":null,"_elementor_pro_version":null,"_wp_page_template":null,"_elementor_page_settings":null,"_elementor_data":null,"_elementor_css":null,"_elementor_conditions":null,"_happyaddons_elements_cache":null,"_oembed_75446120c39305f0da0ccd147f6de9cb":null,"_oembed_time_75446120c39305f0da0ccd147f6de9cb":null,"_oembed_3efb2c3e76a18143e7207993a2a6939a":null,"_oembed_time_3efb2c3e76a18143e7207993a2a6939a":null,"_oembed_59808117857ddf57e478a31d79f76e4d":null,"_oembed_time_59808117857ddf57e478a31d79f76e4d":null,"_oembed_965c5b49aa8d22ce37dfb3bde0268600":null,"_oembed_time_965c5b49aa8d22ce37dfb3bde0268600":null,"_oembed_81002f7ee3604f645db4ebcfd1912acf":null,"_oembed_time_81002f7ee3604f645db4ebcfd1912acf":null,"_elementor_screenshot":null,"_oembed_7ea3429961cf98fa85da9747683af827":null,"_oembed_time_7ea3429961cf98fa85da9747683af827":null,"_elementor_controls_usage":null,"_elementor_page_assets":[],"_elementor_screenshot_failed":null,"theplus_transient_widgets":null,"_eael_custom_js":null,"_wp_old_date":null,"_trp_automatically_translated_slug_it_it":null,"_trp_automatically_translated_slug_pt_pt":null,"_trp_automatically_translated_slug_zh_cn":null,"_trp_automatically_translated_slug_nl_nl":null,"_trp_automatically_translated_slug_pt_br":null,"_trp_automatically_translated_slug_sv_se":null,"rank_math_analytic_object_id":null,"rank_math_internal_links_processed":null,"_trp_automatically_translated_slug_ro_ro":null,"_trp_automatically_translated_slug_sk_sk":null,"_trp_automatically_translated_slug_bg_bg":null,"_trp_automatically_translated_slug_sl_si":null,"litespeed_vpi_list":null,"litespeed_vpi_list_mobile":null,"rank_math_seo_score":null,"rank_math_contentai_score":null,"ilj_limitincominglinks":null,"ilj_maxincominglinks":null,"ilj_limitoutgoinglinks":null,"ilj_maxoutgoinglinks":null,"ilj_limitlinksperparagraph":null,"ilj_linksperparagraph":null,"ilj_blacklistdefinition":null,"ilj_linkdefinition":null,"_eb_reusable_block_ids":null,"rank_math_focus_keyword":"serverseitiges caching","rank_math_og_content_image":null,"_yoast_wpseo_metadesc":null,"_yoast_wpseo_content_score":null,"_yoast_wpseo_focuskeywords":null,"_yoast_wpseo_keywordsynonyms":null,"_yoast_wpseo_estimated-reading-time-minutes":null,"rank_math_description":null,"surfer_last_post_update":null,"surfer_last_post_update_direction":null,"surfer_keywords":null,"surfer_location":null,"surfer_draft_id":null,"surfer_permalink_hash":null,"surfer_scrape_ready":null,"_thumbnail_id":"12665","footnotes":null,"_links":{"self":[{"href":"https:\/\/webhosting.de\/da\/wp-json\/wp\/v2\/posts\/12672","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/webhosting.de\/da\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/webhosting.de\/da\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/webhosting.de\/da\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/webhosting.de\/da\/wp-json\/wp\/v2\/comments?post=12672"}],"version-history":[{"count":0,"href":"https:\/\/webhosting.de\/da\/wp-json\/wp\/v2\/posts\/12672\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/webhosting.de\/da\/wp-json\/wp\/v2\/media\/12665"}],"wp:attachment":[{"href":"https:\/\/webhosting.de\/da\/wp-json\/wp\/v2\/media?parent=12672"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/webhosting.de\/da\/wp-json\/wp\/v2\/categories?post=12672"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/webhosting.de\/da\/wp-json\/wp\/v2\/tags?post=12672"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}