Website zu langsam? So finden und beheben Sie die 3 größten Geschwindigkeitsprobleme
Die häufigsten Website-Geschwindigkeitsprobleme finden und beheben. Bildoptimierung, Render-Blocking, Caching.
Zusammenfassung (TL;DR)
Die meisten langsamen Websites haben drei Kernprobleme: nicht optimierte Bilder, render-blockierende Ressourcen und fehlende Cache-Header. Bilder lassen sich durch Konvertierung nach WebP und loading="lazy" optimieren. Render-Blocking beheben Sie durch async/defer bei Skripten und das Inlining von kritischem CSS. Caching aktivieren Sie über korrekte Cache-Control-Header. Allein diese drei Maßnahmen können Ihren PageSpeed-Score um 30–60 Punkte verbessern.
Voraussetzungen
- Zugang zu Ihrem Webserver (SSH oder Hosting-Kontrollpanel)
- Google Chrome (für Lighthouse-Audits)
- Kommandozeilenzugang mit installiertem
cwebpoderimagemagick - Berechtigung zum Bearbeiten der
.htaccess(Apache) odernginx.conf(Nginx) - Grundkenntnisse in HTML und der Dateistruktur Ihrer Website
Schritt 1: Aktuelle Geschwindigkeit messen
Google PageSpeed Insights
Öffnen Sie pagespeed.web.dev und geben Sie Ihre URL ein. Der Bericht liefert getrennte Bewertungen für Mobil und Desktop. Konzentrieren Sie sich auf den Abschnitt Empfehlungen — dort finden Sie konkrete Maßnahmen, sortiert nach geschätztem Einsparpotenzial. Unter Diagnose stehen weiterführende technische Details.
Notieren Sie sich folgende Kennzahlen: Largest Contentful Paint (LCP), Cumulative Layout Shift (CLS) und Interaction to Next Paint (INP). Das sind die Core Web Vitals, die direkt Ihr Google-Ranking beeinflussen.
Lighthouse in den Chrome DevTools
Für eine detaillierte lokale Analyse nutzen Sie Lighthouse direkt in Chrome:
- Öffnen Sie Ihre Website in Google Chrome.
- Drücken Sie F12 (oder Cmd+Option+I auf dem Mac), um die DevTools zu öffnen.
- Klicken Sie auf den Reiter Lighthouse (ggf. unter
>>versteckt). - Wählen Sie den Modus Navigation, als Gerät Mobilgerät und aktivieren Sie Leistung.
- Klicken Sie auf Seitenaufbau analysieren.
- Warten Sie 30–60 Sekunden. Der Bericht zeigt einen Score von 0–100.
Lighthouse läuft lokal auf Ihrem Rechner — schließen Sie andere Tabs und Erweiterungen für verlässliche Ergebnisse. Führen Sie den Test mindestens dreimal durch und bilden Sie den Mittelwert.
Problem 1: Nicht optimierte Bilder
Bilder machen auf den meisten Websites 50–70 % der Gesamtdatenmenge aus. Allein die Bildoptimierung kann die Ladezeit halbieren.
Bilder nach WebP konvertieren
WebP liefert bei vergleichbarer Qualität 25–35 % kleinere Dateien als JPEG. Installieren Sie cwebp und konvertieren Sie Ihre Bilder:
# cwebp installieren (macOS)
brew install webp
# cwebp installieren (Ubuntu/Debian)
sudo apt install webp
# Einzelnes Bild konvertieren (Qualität 80 ist ein guter Kompromiss)
cwebp -q 80 bild.jpg -o bild.webp
# Alle JPEGs in einem Verzeichnis konvertieren
for f in *.jpg; do cwebp -q 80 "$f" -o "${f%.jpg}.webp"; done
# Alternative mit ImageMagick
magick eingabe.jpg -quality 80 ausgabe.webp
# Stapelverarbeitung mit ImageMagick
for f in *.png; do magick "$f" -quality 80 "${f%.png}.webp"; done
WebP mit Fallback ausliefern
Mit dem <picture>-Element liefern Sie WebP an unterstützende Browser und bieten älteren Browsern ein Fallback:
<picture>
<source srcset="hero.webp" type="image/webp">
<source srcset="hero.jpg" type="image/jpeg">
<img src="hero.jpg" alt="Hero-Bild" width="1200" height="600">
</picture>
Lazy Loading aktivieren
Bilder unterhalb des sichtbaren Bereichs sollten erst geladen werden, wenn der Nutzer dorthin scrollt. Moderne Browser unterstützen das nativ:
<img src="produkt.webp" alt="Produkt" loading="lazy" width="400" height="300">
Wichtig: Fügen Sie loading="lazy" nicht zum LCP-Bild hinzu (meist das Hero-Bild oder das erste sichtbare Bild). Das würde Ihren wichtigsten Inhalt verzögern.
Responsive Bilder mit srcset
Liefern Sie unterschiedliche Bildgrößen je nach Bildschirmbreite, damit ein 375px breites Smartphone kein 2000px-Bild laden muss:
<img
src="foto-800.webp"
srcset="foto-400.webp 400w, foto-800.webp 800w, foto-1200.webp 1200w"
sizes="(max-width: 600px) 400px, (max-width: 1024px) 800px, 1200px"
alt="Responsives Foto"
loading="lazy"
width="1200" height="800"
>
Die verschiedenen Größen erzeugen Sie mit ImageMagick:
magick original.jpg -resize 400x -quality 80 foto-400.webp
magick original.jpg -resize 800x -quality 80 foto-800.webp
magick original.jpg -resize 1200x -quality 80 foto-1200.webp
Problem 2: Render-blockierende Ressourcen
Stößt der Browser auf ein <script> oder <link rel="stylesheet"> im <head>, hält er das Rendern an, bis die Ressource heruntergeladen und ausgeführt ist. Das verzögert den First Contentful Paint und den LCP direkt.
async und defer für Skripte
<!-- Blockiert das Rendering (SCHLECHT) -->
<script src="analytics.js"></script>
<!-- Wird parallel geladen, sofort ausgeführt wenn bereit (GUT für unabhängige Skripte) -->
<script src="analytics.js" async></script>
<!-- Wird parallel geladen, nach dem HTML-Parsing ausgeführt (GUT für abhängige Skripte) -->
<script src="app.js" defer></script>
Verwenden Sie async für Skripte ohne DOM- oder Script-Abhängigkeiten (Analytics, Tracking). Verwenden Sie defer für Skripte, die das DOM benötigen oder in bestimmter Reihenfolge laufen müssen.
Kritisches CSS inline einbinden
Kritisches CSS umfasst das Minimum an Styles, das zum Rendern des sichtbaren Bereichs nötig ist. Binden Sie es direkt im <head> ein und laden Sie das vollständige Stylesheet asynchron:
<head>
<style>
/* Kritisches CSS — nur für den sichtbaren Bereich */
body { margin: 0; font-family: system-ui, sans-serif; }
.header { background: #1a1a2e; color: #fff; padding: 1rem; }
.hero { min-height: 60vh; display: flex; align-items: center; }
</style>
<!-- Vollständiges CSS asynchron laden -->
<link rel="preload" href="styles.css" as="style" onload="this.onload=null;this.rel='stylesheet'">
<noscript><link rel="stylesheet" href="styles.css"></noscript>
</head>
Zum automatischen Extrahieren von kritischem CSS eignet sich das npm-Paket critical:
npx critical https://ihrewebsite.de --inline --minify > critical-output.html
Code Splitting
Falls Sie einen Bundler wie Webpack oder Vite nutzen, aktivieren Sie Code Splitting, um pro Seite nur das tatsächlich benötigte JavaScript zu laden:
// Statt alles auf einmal zu importieren
import { heavyChart } from './charts';
// Dynamisch importieren, wenn tatsächlich benötigt
const { heavyChart } = await import('./charts');
Problem 3: Fehlende Caching-Strategie
Ohne Cache-Header lädt der Browser bei jedem Seitenaufruf alle Ressourcen erneut herunter. Richtiges Caching macht wiederholte Besuche nahezu sofort.
Apache (.htaccess)
# mod_expires aktivieren
<IfModule mod_expires.c>
ExpiresActive On
# Bilder — 1 Jahr cachen
ExpiresByType image/webp "access plus 1 year"
ExpiresByType image/jpeg "access plus 1 year"
ExpiresByType image/png "access plus 1 year"
ExpiresByType image/svg+xml "access plus 1 year"
# CSS und JS — 1 Monat cachen
ExpiresByType text/css "access plus 1 month"
ExpiresByType application/javascript "access plus 1 month"
# Schriften — 1 Jahr cachen
ExpiresByType font/woff2 "access plus 1 year"
# HTML — nicht cachen (immer frisch laden)
ExpiresByType text/html "access plus 0 seconds"
</IfModule>
# Cache-Control-Header
<IfModule mod_headers.c>
<FilesMatch "\.(jpg|jpeg|png|webp|gif|svg|ico|woff2)$">
Header set Cache-Control "public, max-age=31536000, immutable"
</FilesMatch>
<FilesMatch "\.(css|js)$">
Header set Cache-Control "public, max-age=2592000"
</FilesMatch>
</IfModule>
# ETags konfigurieren
FileETag MTime Size
Nginx
# In den server-Block der nginx.conf einfügen
# Statische Assets — 1 Jahr Cache
location ~* \.(jpg|jpeg|png|webp|gif|svg|ico|woff2)$ {
expires 1y;
add_header Cache-Control "public, immutable";
etag on;
}
# CSS/JS — 1 Monat Cache
location ~* \.(css|js)$ {
expires 30d;
add_header Cache-Control "public";
etag on;
}
# HTML — kein Cache
location ~* \.html$ {
expires -1;
add_header Cache-Control "no-store, no-cache, must-revalidate";
}
Tipp: Verwenden Sie Dateinamen mit Hash (z.B. style.a3f9b2.css), damit Sie aggressiv cachen und trotzdem Updates sofort ausliefern können.
Bonus: Gzip-/Brotli-Komprimierung aktivieren
Textbasierte Dateien (HTML, CSS, JS, SVG, JSON) lassen sich um 60–80 % komprimieren. Das ist einer der einfachsten Performance-Gewinne.
Apache
# Gzip-Komprimierung
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/html text/css application/javascript
AddOutputFilterByType DEFLATE application/json image/svg+xml
AddOutputFilterByType DEFLATE text/xml application/xml
AddOutputFilterByType DEFLATE font/woff2 application/font-woff2
</IfModule>
# Brotli (falls mod_brotli verfügbar — ab Apache 2.4.26)
<IfModule mod_brotli.c>
AddOutputFilterByType BROTLI_COMPRESS text/html text/css application/javascript
AddOutputFilterByType BROTLI_COMPRESS application/json image/svg+xml
BrotliCompressionQuality 6
</IfModule>
Nginx
# Gzip
gzip on;
gzip_vary on;
gzip_min_length 256;
gzip_types text/plain text/css application/javascript application/json image/svg+xml text/xml application/xml;
# Brotli (erfordert das Modul ngx_brotli)
brotli on;
brotli_comp_level 6;
brotli_types text/plain text/css application/javascript application/json image/svg+xml;
Prüfen Sie, ob die Komprimierung funktioniert:
curl -H "Accept-Encoding: gzip, br" -sI https://ihrewebsite.de | grep -i content-encoding
# Erwartete Ausgabe: content-encoding: br (oder gzip)
Bonus: CDN mit Cloudflare einrichten
Ein CDN speichert Ihre statischen Assets auf Servern weltweit und reduziert dadurch die Latenz für entfernte Besucher.
- Erstellen Sie ein kostenloses Konto auf cloudflare.com.
- Fügen Sie Ihre Domain hinzu und wählen Sie den Free-Plan.
- Cloudflare scannt Ihre bestehenden DNS-Einträge. Überprüfen Sie diese und klicken Sie auf Weiter.
- Ändern Sie bei Ihrem Domain-Registrar die Nameserver auf die von Cloudflare angegebenen (z.B.
ada.ns.cloudflare.com,bob.ns.cloudflare.com). - Warten Sie auf die DNS-Propagierung (in der Regel 1–24 Stunden).
- Im Cloudflare-Dashboard unter Speed → Optimierung aktivieren Sie Auto Minify (HTML, CSS, JS) und Brotli.
- Unter Caching → Konfiguration stellen Sie die Browser-Cache-TTL auf Bestehende Header respektieren, sofern Sie diese bereits konfiguriert haben.
Core Web Vitals verstehen
Google verwendet drei Core Web Vitals als Ranking-Signale:
- LCP (Largest Contentful Paint): Wie schnell das größte sichtbare Element (meist ein Hero-Bild oder eine Überschrift) gerendert wird. Zielwert: unter 2,5 Sekunden. Optimierung durch Bildoptimierung, Preloading der LCP-Ressource und Entfernen render-blockierender Ressourcen.
- INP (Interaction to Next Paint): Misst die Reaktionsfähigkeit — die Verzögerung zwischen einer Nutzerinteraktion (Klick, Tippen, Tastendruck) und der nächsten visuellen Aktualisierung. Zielwert: unter 200 ms. Optimierung durch Aufteilen langer JavaScript-Aufgaben, Einsatz von Web Workers und Reduzierung von Main-Thread-Blocking.
- CLS (Cumulative Layout Shift): Wie stark sich das Seitenlayout während des Ladens unerwartet verschiebt. Zielwert: unter 0,1. Optimierung durch konsequentes Setzen von
width- undheight-Attributen bei Bildern und Videos, Platzreservierung für Werbung/Embeds und Vermeidung dynamisch eingefügter Inhalte oberhalb des sichtbaren Bereichs.
Datenbank-Abfragen optimieren
Wenn Ihre Website eine Datenbank nutzt (WordPress, eigenes CMS), können langsame Abfragen bei jedem Seitenaufruf Sekunden kosten.
Slow Query Log aktivieren (MySQL/MariaDB)
# In /etc/mysql/my.cnf oder /etc/my.cnf unter [mysqld] einfügen
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 1
log_queries_not_using_indexes = 1
# MySQL neu starten
sudo systemctl restart mysql
Nach einigen Stunden Laufzeit prüfen Sie die langsamsten Abfragen:
sudo mysqldumpslow -s t -t 10 /var/log/mysql/slow.log
Abfragen mit EXPLAIN analysieren
EXPLAIN SELECT * FROM wp_posts WHERE post_status = 'publish' ORDER BY post_date DESC LIMIT 10;
Achten Sie auf:
- type: ALL — vollständiger Tabellenscan, ein Index wird benötigt.
- rows: eine sehr hohe Zahl bedeutet, dass die Abfrage zu viele Zeilen durchsucht.
- Extra: Using filesort — erwägen Sie einen Index auf der ORDER-BY-Spalte.
Fehlende Indizes anlegen:
ALTER TABLE wp_posts ADD INDEX idx_status_date (post_status, post_date);
Messen mit WebPageTest.org
WebPageTest.org bietet Filmstreifen-Ansichten, Wasserfall-Diagramme und mehrstufige Tests — kostenlos.
- Öffnen Sie webpagetest.org und geben Sie Ihre URL ein.
- Wählen Sie einen Teststandort in der Nähe Ihrer Zielgruppe.
- Wählen Sie Chrome mit einer Cable-Verbindung für Desktop oder Mobile 4G für mobile Tests.
- Unter Advanced Settings → Test setzen Sie Number of Tests to Run: 3 und aktivieren First View and Repeat View.
- Klicken Sie auf Start Test und warten Sie auf die Ergebnisse.
Das Wasserfall-Diagramm ist die nützlichste Ansicht — es zeigt jede einzelne Anfrage, ihre Dauer und welche das Rendering blockieren. Achten Sie auf lange Balken (langsame Ressourcen), rote Balken (fehlgeschlagene Anfragen) und Lücken (Leerlaufzeiten, in denen der Browser wartet).
Fehlersuche
"Mein Score hat sich trotz Änderungen nicht verbessert"
- Leeren Sie den CDN-Cache (Cloudflare: Caching → Alles löschen).
- Führen Sie Lighthouse in einem Inkognito-Fenster ohne Erweiterungen aus.
- Prüfen Sie, ob der Server die Konfiguration anwendet:
curl -sI https://ihrewebsite.de/style.css | grep -i cache-control
"WebP-Bilder werden nicht ausgeliefert"
- Prüfen Sie den MIME-Typ:
curl -sI https://ihrewebsite.de/bild.webp | grep content-type— sollteimage/webpsein. - Bei Apache fügen Sie
AddType image/webp .webpin Ihre.htaccessein.
"Gzip funktioniert nicht"
- Apache: Prüfen Sie, ob
mod_deflateaktiviert ist:apachectl -M | grep deflate - Nginx: Stellen Sie sicher, dass
gzip on;imhttp-Block steht, nicht nur in einemserver-Block.
"CLS ist hoch, aber ich finde die Ursache nicht"
- Öffnen Sie in den DevTools den Reiter Performance, zeichnen Sie einen Seitenaufbau auf und suchen Sie nach den Layout Shift-Markierungen in der Zeitleiste. Klicken Sie darauf, um das verschobene Element zu identifizieren.
- Der Lighthouse-Bericht zeigt CLS-verursachende Elemente ebenfalls unter Diagnose an.
Vorbeugung & laufende Wartung
- Bildoptimierung automatisieren: Integrieren Sie Tools wie
sharp(Node.js) oderimageminin Ihre Build-Pipeline. - Performance-Budgets festlegen: Nutzen Sie Lighthouse CI, um Builds scheitern zu lassen, wenn der Score unter einen Schwellenwert fällt.
- Core Web Vitals in der Produktion überwachen: Nutzen Sie den Bericht unter Google Search Console → Core Web Vitals.
- PageSpeed Insights monatlich ausführen und die Scores über die Zeit verfolgen.
- Drittanbieter-Skripte vierteljährlich prüfen. Jedes Analytics-Tag, Chat-Widget oder Social-Embed erhöht die Ladezeit. Entfernen Sie alles, was keinen aktiven Mehrwert bietet.
- Software aktuell halten. Updates von CMS, Plugins und Server-Software enthalten häufig Performance-Verbesserungen.
- Staging-Umgebung nutzen, um die Performance-Auswirkungen neuer Features vor dem Produktiv-Deployment zu testen.
Experten-Hilfe gebraucht?
Professionelles Audit mit 3 konkreten Fixes? €39, heute geliefert.
Jetzt buchen — €39100% Geld-zurück-Garantie