
Core Web Vitals & PageSpeed

Die unerbittlichen Metriken – Core Web Vitals verstehen
Wir haben unsere Headless-Architektur in den vergangenen 13 Teilen funktional, sicher und semantisch perfektioniert. Doch aus Sicht von Google und deinen Nutzern zählt am Ende des Tages nur eines: Wie schnell und reibungslos baut sich die Seite im Browser auf?
Die Core Web Vitals (CWV) sind eine Gruppe von drei spezifischen Seiten-Performance-Metriken, die Google als bestätigten Ranking-Faktor nutzt, um die reale Nutzererfahrung (User Experience) auf deiner Website zu bewerten. Sie messen, wie schnell der Hauptinhalt lädt, wie reaktionsschnell die Seite auf Eingaben reagiert und wie visuell stabil das Layout während des Ladevorgangs bleibt.
Wenn du diese drei Metriken ignorierst, wird selbst der beste Content im organischen Ranking abgestraft. Lass uns die Zielwerte definieren, bevor wir sie im Code optimieren:
Largest Contentful Paint (LCP): Misst die Ladezeit des größten sichtbaren Inhaltselements im Viewport (oft ein Hero-Bild oder ein großer Textblock). Der Zielwert für einen "guten" LCP liegt bei 2,5 Sekunden oder weniger.
Interaction to Next Paint (INP): Diese Metrik hat im März 2024 den alten FID (First Input Delay) abgelöst. INP misst die Latenz der gesamten Nutzerinteraktionen über den gesamten Lebenszyklus der Seite und erfasst den schlechtesten (bzw. den 98. Perzentil) Wert. Der Zielwert liegt bei 200 Millisekunden oder weniger.
Cumulative Layout Shift (CLS): Quantifiziert, wie stark sich sichtbare Inhalte während des Ladens unerwartet verschieben. Ein hervorragender CLS-Score liegt bei 0,1 oder darunter.
Ein weiterer wichtiger, wenn auch oft übersehener Diagnose-Wert ist die Time to First Byte (TTFB). Die TTFB ist zwar kein offizieller Core Web Vital, beeinflusst den LCP jedoch maßgeblich: Eine langsame TTFB macht es nahezu unmöglich, einen guten LCP-Score zu erreichen. Durch unsere ISR-Caching-Strategie aus Teil 11 haben wir dieses Problem glücklicherweise bereits serverseitig gelöst.
Praxis & Code: Den LCP proaktiv optimieren
Ein häufiger Fehler bei Headless-Websites ist, dass das Hero-Bild (das oft das LCP-Element ist) erst sehr spät vom Browser entdeckt wird. Um das zu verhindern, müssen wir dem Browser frühzeitig mitteilen, dass dieses Bild höchste Priorität hat.
Wir erreichen das, indem wir einen <link rel="preload">-Tag in den <head> injizieren und das Bild-Tag mit fetchpriority="high" markieren. In Next.js übernimmt die next/image-Komponente mit dem Attribut priority genau diese Aufgabe für uns.
1import Image from 'next/image';
2
3interface HeroProps {
4 imageUrl: string;
5 headline: string;
6}
7
8export default function HeroSection({ imageUrl, headline }: HeroProps) {
9 return (
10 <section className="relative w-full h-[60vh]">
11 {/*
12 Das priority-Attribut ist unser LCP-Retter!
13 Es sagt Next.js, dass es einen Preload-Link in den <head> setzen
14 und fetchpriority="high" anwenden soll.
15 */}
16 <Image
17 src={imageUrl}
18 alt="Hero Hintergrundbild"
19 fill
20 className="object-cover"
21 priority
22 sizes="(max-width: 768px) 100vw, 100vw"
23 />
24 <div className="absolute inset-0 bg-black/50 flex items-center justify-center">
25 <h1 className="text-white text-4xl md:text-6xl font-bold">
26 {headline}
27 </h1>
28 </div>
29 </section>
30 );
31}Durch das Setzen von priority auf dem wichtigsten Bild im Viewport verhindern wir, dass der Browser das Bild "lazy" (also verzögert) lädt, was den LCP andernfalls ruinieren würde.

Der Cookie-Consent-Flaschenhals (CLS & INP)
Wir haben den LCP (Largest Contentful Paint) durch Priorisierung unseres Hero-Bildes gesichert. Doch in der Realität wird dieser perfekte Start oft durch ein notwendiges Übel zerstört: Das Cookie-Consent-Banner.
Wenn Entwickler externe Consent-Management-Plugins (CMPs) blind integrieren, leiden oft gleich zwei Metriken massiv darunter: Der Cumulative Layout Shift (CLS) und die Interaction to Next Paint (INP).
CLS-Falle: Wenn das Banner den Content verdrängt
Cookie-Banner, die plötzlich nach dem Start des Seitenrenderings auftauchen und den Inhalt nach unten drücken, verursachen unerwünschte Layout-Verschiebungen (CLS). Dies schadet nicht nur deinem Core Web Vitals Score, sondern irritiert auch die Nutzer enorm.
Um Layout-Shifts zu vermeiden, sollten Cookie-Banner über dem Seiteninhalt liegen (als Overlay) und nicht direkt in den Textfluss eingefügt werden. Eine häufige und saubere Lösung ist die Nutzung von CSS-Eigenschaften wie position: fixed oder sticky am unteren Bildschirmrand. Alternativ kann das Banner serverseitig gerendert werden, sodass es beim ersten Paint bereits ohne Verschiebung erscheint.
INP-Falle: Der Main-Thread-Kollaps nach dem Klick
Während der CLS das visuelle Problem darstellt, betrifft die INP-Metrik die Reaktionsfähigkeit. Schlechte INP-Werte werden oft nicht direkt durch das Consent-Management-Plugin (CMP) verursacht, sondern durch die Skripte, die nach der Zustimmung geladen werden.
Wenn der Nutzer auf "Akzeptieren" klickt und das Frontend sofort alle schweren Tracking-Skripte (Google Analytics, Meta Pixel, etc.) gleichzeitig abfeuert, kollabiert der JavaScript-Hauptthread (Main Thread). Der Browser friert für einen kurzen Moment ein.
Um zu verhindern, dass die Zustimmung zu Cookies den Hauptthread blockiert und den INP-Wert verschlechtert, wird die Initialisierung nachgelagerter Skripte zeitlich entkoppelt. Dies geschieht durch das Aufteilen schwerer Aufgaben in kleinere Tasks (Yielding) mittels setTimeout oder requestIdleCallback.
Praxis & Code: Ein performantes Consent-Overlay in Next.js
Hier ist ein praxisnahes Beispiel für eine React-Client-Komponente, die beide Probleme architektonisch sauber löst:
1'use client';
2
3import { useState, useEffect } from 'react';
4
5export default function PerformanceCookieBanner() {
6 const [isVisible, setIsVisible] = useState(false);
7
8 useEffect(() => {
9 // Prüfen, ob der Nutzer bereits zugestimmt hat.
10 // Falls nicht, blenden wir das Banner ein.
11 const hasConsented = localStorage.getItem('user_consent');
12 if (!hasConsented) {
13 setIsVisible(true);
14 }
15 }, []);
16
17 const loadHeavyTrackingScripts = () => {
18 // Hier werden Analytics, Tag Manager etc. geladen
19 console.log('Schwere Tracking-Skripte werden jetzt asynchron geladen...');
20 };
21
22 const handleAccept = () => {
23 // 1. Banner sofort ausblenden für sofortiges visuelles Feedback
24 setIsVisible(false);
25 localStorage.setItem('user_consent', 'true');
26
27 // 2. Yielding to Main Thread (INP-Schutz)
28 // Wir entkoppeln das Laden der schweren Skripte vom Klick-Event,
29 // damit der Main Thread nicht blockiert wird.
30 if (typeof window !== 'undefined' && 'requestIdleCallback' in window) {
31 // Wenn der Browser im Leerlauf ist, lade die Skripte
32 window.requestIdleCallback(() => {
33 loadHeavyTrackingScripts();
34 });
35 } else {
36 // Fallback für ältere Browser
37 setTimeout(() => {
38 loadHeavyTrackingScripts();
39 }, 50);
40 }
41 };
42
43 if (!isVisible) return null;
44
45 return (
46 // CLS-Schutz: fixed position verhindert, dass das Banner den Content nach unten drückt
47 <div className="fixed bottom-0 left-0 right-0 z-50 bg-gray-900 text-white p-4 shadow-2xl">
48 <div className="max-w-7xl mx-auto flex flex-col sm:flex-row items-center justify-between">
49 <p className="text-sm md:text-base">
50 Wir nutzen Cookies, um deine Erfahrung zu verbessern. Ohne Ruckeln.
51 </p>
52 <button
53 onClick={handleAccept}
54 className="mt-4 sm:mt-0 px-6 py-2 bg-blue-600 hover:bg-blue-500 rounded font-bold transition-colors"
55 >
56 Alle Akzeptieren
57 </button>
58 </div>
59 </div>
60 );
61}Mit diesem Code-Muster hast du den größten potenziellen Engpass für deine Interaktionsmetriken (INP) elegant umgangen, während das Overlay-Layout (fixed) einen perfekten CLS-Wert garantiert.

Tailwind Purging & CSS-Tuning für maximale Effizienz
Tailwind CSS ist der absolute Industriestandard für modernes Frontend-Design, auch in unseren Headless-Projekten. Während der Entwicklung ist die CSS-Datei von Tailwind jedoch riesig, da sie jede erdenkliche Utility-Klasse bereithält. Würden wir diese Datei ungefiltert an den Browser des Nutzers ausliefern, hätten wir eine massive, das Rendering blockierende Ressource (Render-Blocking Resource). Dein Largest Contentful Paint (LCP) würde drastisch einbrechen.
Die Lösung für dieses Problem ist das sogenannte "Purging" (in neueren Tailwind-Versionen nativ in die JIT-Engine integriert). Der Compiler scannt alle konfigurierten Dateien (HTML, JS, JSX, TS, TSX, Vue, etc.) nach verwendeten Klassennamen und entfernt konsequent alles, was nicht gebraucht wird. Am Ende bleibt eine winzige CSS-Datei übrig, die sich oft im Bereich von wenigen Kilobyte bewegt und den kritischen Rendering-Pfad nicht blockiert.
Doch dieses System hat eine empfindliche Schwachstelle, über die Frontend-Entwickler bei der Anbindung von Headless CMS wie Contao immer wieder stolpern.
Die Falle: Dynamische Klassennamen und String-Konkatenation
Wenn du in React oder Next.js Klassen dynamisch basierend auf Variablen (z. B. Farb-Codes aus Contao) zusammenbaust, kann Tailwinds Purge-Engine diese zur Build-Zeit nicht erkennen.
Der Compiler führt deinen JavaScript-Code nicht aus; er durchsucht die Dateien lediglich mittels regulärer Ausdrücke (Regex) nach zusammenhängenden Strings. Wenn du Strings per Konkatenation zusammensetzt (z. B. bg-${color}-500), verschwinden diese Klassen nach dem Build aus der Produktion, da sie nicht als vollständiger Klassenname im Code standen. In der Entwicklungsumgebung funktioniert alles fehlerfrei, aber auf dem Live-Server zerschießt es das Layout.
Praxis & Code: Der sichere Umgang mit dynamischen Klassen
Schauen wir uns an, wie wir dieses Problem in einem UI-Element lösen – beispielsweise für ein Status-Badge in deinem Portfolio oder für Immobilien-Kategorien auf ferienwohnungbilder.de.
Der falsche Weg (Klassen verschwinden in Produktion):
1// ❌ FALSCH: Tailwind kann diese Klasse beim Build-Prozess nicht finden!
2export default function StatusBadgeBad({ status }: { status: 'success' | 'error' }) {
3 const color = status === 'success' ? 'green' : 'red';
4
5 return (
6 <span className={`bg-${color}-100 text-${color}-800 px-3 py-1 rounded`}>
7 {status}
8 </span>
9 );
10}Der richtige Weg (Vollständige Klassennamen verwenden):
1// ✅ RICHTIG: Wir verwenden vollständige, durchsuchbare Strings!
2export default function StatusBadgeGood({ status }: { status: 'success' | 'error' }) {
3 // Wir mappen den Status auf die vollständigen, ungetrennten Tailwind-Klassen
4 const colorClasses = {
5 success: 'bg-green-100 text-green-800',
6 error: 'bg-red-100 text-red-800'
7 };
8
9 return (
10 <span className={`${colorClasses[status]} px-3 py-1 rounded-full font-semibold`}>
11 {status === 'success' ? 'Erfolgreich' : 'Fehlgeschlagen'}
12 </span>
13 );
14}Solange ein Klassenname in seiner Gesamtheit in deinem Template erscheint, wird Tailwind ihn vor dem Löschen bewahren.
Die Safelist für CMS-gesteuerte Designs nutzen
Manchmal erhältst du Klassen aber direkt als String aus dem Contao CMS (z. B. wenn der Redakteur die Hintergrundfarbe eines Hero-Banners auswählt). In diesem Fall stehen die Klassen nirgendwo in deinem Next.js-Code.
Für dynamische Inhalte, wie Produktkataloge oder CMS-gesteuerte Farben, erweist sich eine erweiterte Konfiguration als unverzichtbar. Du musst diese Klassen in der tailwind.config.ts über die safelist (eine Art Whitelist) explizit vor dem Purging schützen.
1// tailwind.config.ts
2import type { Config } from 'tailwindcss';
3
4const config: Config = {
5 content: [
6 './src/pages/**/*.{js,ts,jsx,tsx,mdx}',
7 './src/components/**/*.{js,ts,jsx,tsx,mdx}',
8 './src/app/**/*.{js,ts,jsx,tsx,mdx}',
9 ],
10 // Die Safelist schützt Klassen davor, im Produktions-Build entfernt zu werden
11 safelist: [
12 // Bewahrt dynamische Hintergrundfarben, die aus dem Contao CMS kommen
13 {
14 pattern: /^bg-(red|green|blue|yellow)-(100|500|800)$/,
15 },
16 // Bewahrt spezifische Hover-Effekte für Immobilien-Karten
17 'scale-100', 'scale-105',
18 'opacity-0', 'opacity-100',
19 ],
20 theme: {
21 extend: {},
22 },
23 plugins: [],
24};
25
26export default config;Ein kleiner Bonus für die Entwickler-Erfahrung (DX): Lange Klassen-Strings können schwer lesbar werden. Um die Wartbarkeit im Team zu verbessern, solltest du das offizielle Prettier-Plugin für Tailwind installieren. Es sortiert deine Tailwind-Klassen vollautomatisch in einer konsistenten Reihenfolge (Layout zuerst, dann Abstände, Typografie, Farben und interaktive Zustände). Das hält deinen Code sauber und verhindert doppelte Zuweisungen.

Systematische Härtung mit dem Performance-Tool
Wir haben den LCP priorisiert, das Cookie-Banner CLS-neutral und ohne Main-Thread-Blockade integriert sowie unsere CSS-Bundle-Größe durch Tailwind Purging minimiert. Doch Performance-Optimierung ist kein Blindflug. Bevor wir eine Headless-Plattform wie ferienwohnungbilder.de auf die Nutzer loslassen, müssen wir unsere theoretischen Verbesserungen unter echten Bedingungen testen und systematisch härten.
Dabei müssen wir zwischen Labordaten (Lab Data) und Felddaten (Field Data) unterscheiden. Felddaten aus dem Chrome User Experience Report (CrUX) spiegeln die tatsächlichen Nutzererfahrungen der letzten 28 Tage wider. Da diese Daten verzögert eintreffen, bist du während der Entwicklung auf präzise Labordaten angewiesen, um Engpässe sofort zu identifizieren.
Der 100/100 Audit: Blockaden und Header auf dem Prüfstand
Um diesen Härtungsprozess zu automatisieren, nutzen wir den dedizierten Performance Analyzer auf webinteger.dev/tools/performance. Dieses spezialisierte Werkzeug analysiert Ladezeiten, HTML-Größen und blockierende Ressourcen deiner Live-URL.
Besonders wichtig für die Serverseite: Das Tool prüft deine HTTP-Header auf Sicherheit, die korrekte Komprimierung (Brotli/gzip) und etablierte Caching-Regeln.
Warum sind diese Header so entscheidend? Eine langsame Time to First Byte (TTFB) verzögert den gesamten Seitenaufbau und macht es nahezu unmöglich, einen guten LCP-Score zu erreichen. Server-seitiges Caching und der Einsatz effizienter Komprimierungsalgorithmen wie Brotli sind die stärksten Hebel, um die TTFB massiv zu senken und den LCP zu retten.
Praxis & Code: Caching- und Security-Header in Next.js erzwingen
Um den Performance Analyzer zufriedenzustellen und die TTFB zu minimieren, müssen wir Next.js anweisen, statische Assets (wie unsere purge-optimierte CSS-Datei, Schriftarten oder statische Bilder) mit aggressiven Cache-Headern auszuliefern. Gleichzeitig härten wir die Applikation durch grundlegende Security-Header.
Diese Einstellungen nehmen wir zentral in der next.config.ts vor:
1import type { NextConfig } from 'next';
2
3const nextConfig: NextConfig = {
4 // Aktiviert standardmäßig Gzip/Brotli Komprimierung
5 compress: true,
6
7 async headers() {
8 return [
9 {
10 // 1. Aggressives Caching für unveränderliche statische Assets (CSS, JS, Fonts)
11 // Trifft auf alle Dateien im /_next/static/ Ordner zu
12 source: '/_next/static/(.*)',
13 headers: [
14 {
15 key: 'Cache-Control',
16 // Caching für 1 Jahr (31536000 Sekunden), immutable verhindert unnötige Revalidierungen
17 value: 'public, max-age=31536000, immutable',
18 },
19 ],
20 },
21 {
22 // 2. Caching- und Security-Header für statische Medien (wie Logos, Icons)
23 source: '/images/(.*)',
24 headers: [
25 {
26 key: 'Cache-Control',
27 value: 'public, max-age=86400, stale-while-revalidate=604800',
28 },
29 ],
30 },
31 {
32 // 3. Globale Security-Header für alle Routen
33 source: '/(.*)',
34 headers: [
35 {
36 key: 'X-Content-Type-Options',
37 value: 'nosniff',
38 },
39 {
40 key: 'X-Frame-Options',
41 value: 'DENY',
42 },
43 {
44 key: 'X-XSS-Protection',
45 value: '1; mode=block',
46 },
47 ],
48 },
49 ];
50 },
51};
52
53export default nextConfig;Der finale Check im Browser
Nachdem wir diese Header implementiert und die App neu gebaut haben, prüfen wir das Ergebnis. Neben dem Performance Analyzer von Webinteger hilft hier auch der Blick in die Chrome DevTools.
Im Tab "Network" siehst du nun, dass deine statischen Ressourcen aus dem "Disk Cache" oder "Memory Cache" geladen werden, was die Ladezeit auf 0 Millisekunden reduziert. Im Tab "Performance" kannst du eine Profiling-Aufzeichnung starten (Record). Die Auswertung zeigt dir im "Summary"-Tab exakt, wie viel Zeit der Browser für "Loading" (Netzwerk-Requests und HTML-Parsing), "Scripting" (JavaScript ausführen) und "Rendering" (Layout und CSS) aufwendet.
Findest du hier noch "Long Tasks" (rot markierte Balken, die den Main Thread über 50ms blockieren), weißt du genau, welches JavaScript du – wie beim Cookie-Banner gelernt – asynchron verzögern musst.

Bereit für den Live-Betrieb
Mit dem Abschluss von Teil 14 haben wir die Performance-Metriken aus dem Reich der theoretischen SEO-Mythen in messbare, grüne Labor- und Felddaten überführt. Core Web Vitals sind kein abstraktes Konzept, sondern das direkte Resultat einer disziplinierten Frontend-Architektur.
Wir haben die vier größten Engpässe systematisch eliminiert:
LCP (Largest Contentful Paint): Durch das gezielte Preloading und die Priorisierung des Hero-Bildes mit
next/imagezwingen wir den Browser, das wichtigste Element im Viewport sofort zu laden, um die Zielmarke von maximal 2,5 Sekunden zu unterschreiten.CLS (Cumulative Layout Shift): Das Cookie-Consent-Banner wurde als fixes Overlay konzipiert, das über dem Content schwebt. So verhindern wir den klassischen Fehler, bei dem nachgeladene Banner den Hauptinhalt nach unten drücken und Layout-Shifts von über 0,1 erzeugen.
INP (Interaction to Next Paint): Die größte Gefahr für einen flüssigen Main Thread (Zielwert unter 200 Millisekunden) haben wir entschärft, indem wir schwere Tracking-Skripte nach dem Cookie-Consent nicht synchron, sondern via
requestIdleCallbackasynchron abfeuern.Render-Blocking Resources: Tailwind CSS wurde durch präzises Purging auf das absolute Minimum reduziert. Durch das Vermeiden dynamischer String-Konkatenation garantieren wir, dass keine unerwarteten Layout-Brüche auf dem Live-Server entstehen.
Egal ob es sich um detailreiche Fotostrecken auf ferienwohnungbilder.de oder textlastige Architektur-Guides auf technikermagazin.de handelt – dieses Next.js-Setup lädt am Limit der physikalischen Möglichkeiten.

Contao Headless Masterclass: High-Performance mit Next.js Pillar
Contao Headless Architektur: Das Konzept im Detail verstehen
Projektstruktur & Entwicklungsumgebung für Contao und Next.js
Contao Headless Basis-Setup: Installation & Bildkonfiguration
Contao Headless Datenstruktur & Redakteurs-Erlebnis
Die API From Scratch entwickeln: Symfony Routing in Contao 5
Contao Headless API-Sicherheit & Formularverarbeitung
Next.js Setup & Grundstruktur für dein Headless CMS
Dynamisches Routing & Navigation in Next.js
Module & Formulare im Frontend rendern
Der Draft- & Preview-Modus im Headless CMS
High-Performance & Caching-Strategien
SEO-Masterclass & Schema-Validierung
Semantisches SEO & Content-Struktur
Core Web Vitals & PageSpeed
Häufig gestellte Fragen (FAQ)
Dieses Problem tritt fast immer durch dynamische String-Konkatenation in React auf (z. B. className=bg-${color}-500}). Der Tailwind-Compiler führt dein JavaScript nicht aus, sondern sucht beim Purging nur nach vollständigen Strings. Wenn der komplette Klassenname (z. B. bg-blue-500) nirgendwo im Code steht, wird er aus der finalen CSS-Datei gelöscht. Die Lösung: Verwende immer vollständige Klassennamen oder trage dynamische CMS-Werte in die safelist der tailwind.config.ts ein.
Der INP-Wert (Interaction to Next Paint) misst die gesamte Zeit vom Klick bis zur visuellen Rückmeldung des Browsers. Oft reagiert das Banner selbst schnell, feuert aber direkt beim Klick auf "Akzeptieren" eine Flut an schweren Tracking-Skripten (Google Analytics, Meta Pixel) ab. Diese Skripte blockieren den Main Thread in sogenannten "Long Tasks" (über 50ms). Du musst das Laden dieser Skripte entkoppeln (Yielding), beispielsweise über setTimeout oder requestIdleCallback, damit der Browser zwischenzeitlich rendern kann.
Die TTFB ist zwar keine direkte CWV-Metrik, bildet aber das Fundament für den LCP. Wenn dein Server (oder dein Laravel-Backend) zu lange braucht, um das initiale HTML oder das JSON auszuliefern (z. B. Werte > 800ms), verzögert sich der gesamte restliche Ladevorgang massiv. Genau deshalb setzen wir im Headless-Setup auf serverseitiges Caching (Redis), aggressive Cache-Header (max-age=31536000) für statische Assets und CDN-Infrastrukturen.
Dein nächster Schritt: Phase 5 – Server-Setup & Docker in Produktion
Unsere Architektur steht, das Backend ist sicher, das Next.js-Frontend lädt am Limit der physikalischen Möglichkeiten und das semantische SEO ist fehlerfrei. Doch das beste Headless-System nützt nichts, wenn es nur auf deinem lokalen Rechner (localhost) funktioniert. Ein Projekt ist erst dann abgeschlossen, wenn es sicher, stabil und hochverfügbar im öffentlichen Netz läuft.
Mit dem Start der finalen Phase 5: Deployment & Betrieb verlassen wir unsere lokale Entwicklungsumgebung. Im kommenden Teil 15: Server-Setup & Docker in Produktion legen wir das professionelle Fundament für den Live-Betrieb:
vServer Vorbereitung (Ubuntu LTS): Wir starten mit einem nackten Linux-Server. Du lernst die essenziellen Schritte zur Server-Härtung, der Einrichtung sicherer SSH-Verbindungen und der Konfiguration einer wasserdichten Firewall.
Docker für den Live-Betrieb: Was lokal perfekt funktioniert, braucht in Produktion besondere Aufmerksamkeit. Wir installieren die Docker-Engine für Server-Umgebungen und orchestrieren unsere Container so, dass sie bei Ausfällen automatisch neu starten, Log-Dateien nicht die Festplatte sprengen und Systemressourcen optimal genutzt werden.
MySQL-Tuning: Standard-Konfigurationen von Datenbanken bremsen unter echter Last schnell ein. Wir optimieren die Parameter unserer MySQL/MariaDB-Instanz gezielt für die hohe Lese-Last unserer Headless-API, um Flaschenhälse (Bottlenecks) bei Traffic-Spitzen proaktiv zu verhindern.
Jetzt starten: Teil 15 – Server-Setup & Docker in Produktion

Dietrich Bojko
Senior Webentwickler
Webinteger arbeitet seit vielen Jahren produktiv mit
Linux-basierten Entwicklungsumgebungen unter Windows.
Der Fokus liegt auf
performanten Setups mit WSL 2, Docker, PHP, Node.js und modernen
Build-Tools in realen Projekten –
nicht auf theoretischen Beispielkonfigurationen.
Die Artikel dieser Serie entstehen direkt aus dem täglichen Einsatz in Kunden- und Eigenprojekten und dokumentieren bewusst auch typische Fehler, Engpässe und bewährte Workarounds.


