Ein Shopware-Shop wird selten dort langsam, wo generische Performance-Ratschläge ansetzen. Bevor das erste Byte den Browser erreicht, hat der Server Kategorien, Preise je Kundengruppe, Varianten und Lagerbestände abgefragt und ein Storefront-Template gerendert. Genau diese serverseitige Arbeit entscheidet über die Time to First Byte, und web.dev nennt 0,8 Sekunden (web.dev) oder darunter als guten Wert, während über 1,8 Sekunden (web.dev) als schlecht gelten. Das ist kein Laborwert: Die Deloitte-Studie Milliseconds Make Millions maß über 37 Marken, dass eine um 0,1 Sekunden (Deloitte) schnellere mobile Ladezeit die Retail-Conversions um 8,4 Prozent (Deloitte) und die Reise-Conversions um 10,1 Prozent (Deloitte) steigerte. Dieser Beitrag zeigt, wie Sie die Bordmittel von Shopware CE dafür nutzen: den integrierten HTTP-Cache mit Reverse-Proxy, gezielten Cache-Warmup und Invalidierung, die richtig ausgeschlossenen Routen für Warenkorb und Checkout, Elasticsearch oder OpenSearch zur Entlastung der Datenbank, die Theme-Kompilierung und Media-Auslieferung sowie den Performance-Gewinn eines Updates auf die aktuelle 6.x-Generation.
Warum Shopware eigene Performance-Hebel hat
Allgemeine Tipps wie Bilder komprimieren oder Skripte entschlacken helfen jedem Frontend, greifen bei einem Shop aber zu kurz. Ein Shopsystem rendert die meisten Seiten serverseitig aus vielen Datenquellen, und personalisierte Elemente wie der Mini-Warenkorb oder kundenspezifische Preise verkomplizieren jedes naive Full-Page-Caching. Shopware CE bringt für genau diese Probleme eigene Werkzeuge mit, die tiefer greifen als ein Cache-Header im Webserver. Wer sie kennt und richtig einstellt, senkt die Antwortzeit an der Wurzel, statt sie im Browser nur zu kaschieren. Der wirtschaftliche Hebel ist beträchtlich: In derselben Deloitte-Auswertung stieg der durchschnittliche Bestellwert im Handel je 0,1 Sekunden um 9,2 Prozent (Deloitte).
Dieser Beitrag grenzt sich bewusst von den generischen Themen ab. Wie ein Reverse-Proxy und ein In-Memory-Speicher auf Infrastrukturebene grundsätzlich funktionieren, vertieft unser Artikel zu Caching-Strategien mit Varnish und Redis; wie Sie langsame Abfragen mit Indexen und dem Auflösen von N+1-Mustern beschleunigen, zeigt der Beitrag zur Datenbank-Query-Optimierung im Shop. Hier geht es dagegen um die Shopware-Bordmittel selbst: welche Konfiguration im Shop diese Schichten aktiviert, wie die Invalidierung sauber zusammenspielt und welche Routen ausgeschlossen bleiben müssen. Der Bezug zu den Core Web Vitals bleibt dabei durchgängig, denn ein niedriger TTFB verbessert Largest Contentful Paint direkt.
HTTP-Cache, Reverse-Proxy und ESI kurz erklärt
Der integrierte HTTP-Cache und der Reverse-Proxy
Shopware CE bringt einen HTTP-Cache auf Basis des Symfony-HttpCache mit, der komplette Storefront-Antworten zwischenspeichert. Aktiviert wird er über die Umgebungsvariable SHOPWARE_HTTP_CACHE_ENABLED in der .env (Shopware Developer Documentation). Bei einem Cache-Treffer liefert der Shop eine bereits gerenderte Seite aus, ohne PHP, Twig-Rendering und Datenbank erneut zu bemühen. Genau das bringt die serverseitige Verarbeitungszeit von Hunderten Millisekunden in den einstelligen Millisekundenbereich und rückt den guten TTFB-Schwellenwert von 0,8 Sekunden (web.dev) in Reichweite.
Der eingebaute Cache eignet sich für einzelne Server. Sobald mehr Last oder mehrere Instanzen dazukommen, empfiehlt Shopware einen echten Reverse-Proxy wie Varnish davor. Ab Shopware 6.6 wird er über den Konfigurationsschlüssel shopware.http_cache.reverse_proxy eingerichtet, inklusive der BAN-Methode für die Invalidierung, der Liste der Varnish-Hosts und der maximalen Zahl paralleler Invalidierungen (Shopware Developer Documentation). Shopware stellt dafür ein vorkonfiguriertes Varnish-Docker-Image samt Standard-VCL bereit, sodass die Cache-Regeln nicht von Grund auf geschrieben werden müssen.
# Integrierten HTTP-Cache aktivieren
SHOPWARE_HTTP_CACHE_ENABLED=1
# Standard-Cache-Zeit für Storefront-Seiten (Sekunden)
SHOPWARE_HTTP_CACHE_DEFAULT_TTL=7200shopware:
http_cache:
reverse_proxy:
enabled: true
ban_method: 'BAN'
hosts:
- 'http://varnish:6081'
max_parallel_invalidations: 3Soft Purge statt harter Invalidierung
Cache-Warmup und gezielte Invalidierung
Ein leerer Cache nach einem Deployment ist tückisch: Der erste Besucher jeder Seite zahlt die volle Rendering-Zeit, und bei vielen gleichzeitigen Zugriffen kann die noch kalte Anwendung überlastet werden. Der Cache-Warmup füllt den Speicher deshalb vorab, indem er die wichtigsten Seiten wie Startseite, Kategorien und Produktdetails automatisiert aufruft. So trifft der erste echte Besucher bereits auf einen warmen Cache und einen niedrigen TTFB, statt den Aufbau selbst zu bezahlen. Der Warmup gehört idealerweise in den Deployment-Prozess, direkt nach dem Leeren des Caches.
# Cache leeren und Container neu aufbauen
bin/console cache:clear
# HTTP-Cache gezielt vorwärmen (Storefront-URLs)
bin/console http:cache:warm:up
# Sitemap in einem eigenen Cronjob erzeugen, nicht pro Request
bin/console sitemap:generateGenauso wichtig wie das Füllen ist das gezielte Leeren. Ein Cache ist nur so gut wie seine Invalidierung: Ändert sich ein Preis oder ein Bestand, muss genau die betroffene Seite erneuert werden, nicht der ganze Cache. Shopware löst das über Cache-Tags. Der Reverse-Proxy-Cache teilt sich denselben Invalidierungsmechanismus und dieselben Tags mit dem Objekt-Cache, sodass eine Produktänderung sowohl den Objekt-Cache als auch den HTTP-Cache der betroffenen Seiten entwertet (Shopware Developer Documentation). Diese enge Kopplung erspart eigene Invalidierungslogik und verhindert, dass Kunden veraltete Preise sehen.
Verzögerte Invalidierung gegen Cache-Stürme
Warenkorb und Checkout: die richtig ausgeschlossenen Routen
Nicht jede Seite darf in den Cache. Warenkorb, Checkout, Kundenkonto und Merkzettel sind pro Nutzer verschieden, und würden sie zwischengespeichert, bekäme der nächste Besucher fremde Daten zu sehen. Diese Routen müssen bewusst dynamisch bleiben. Shopware erkennt einen aktiven Warenkorb oder eine Login-Session und liefert die entsprechenden Seiten ungecacht aus, sodass jeder Kunde seinen eigenen Zustand sieht. Das ist kein Performance-Verlust, sondern eine Notwendigkeit: Der Cache greift dort, wo Inhalte für alle gleich sind, und tritt dort zurück, wo sie individuell sind.
- Warenkorb und Mini-Cart: hängen an der Session und dürfen nie geteilt werden.
- Checkout mit Adress-, Versand- und Zahlungsschritten: enthalten personenbezogene Daten.
- Kundenkonto, Bestellhistorie und Merkzettel: sind pro Login individuell.
- Kundenspezifische Preise und Staffelpreise: unterscheiden sich je Kundengruppe.
- Formulare mit CSRF-Token: würden aus dem Cache mit ungültigen Token brechen.
Für den häufigen Fall, dass nur ein kleiner Teil einer sonst öffentlichen Seite personalisiert ist, etwa das Warenkorb-Symbol mit der Artikelzahl, greift Shopware auf getrennte Auslieferung zurück: Der Seitenrahmen wird gecacht, während der personalisierte Baustein per ESI oder als nachgeladenes Fragment eingesetzt wird. So bleibt die Kategorieseite für Gäste vollständig cachbar, ohne dass der Warenkorb-Zähler falsch angezeigt wird. Diese saubere Trennung ist der Grund, warum ein gut konfigurierter Shop trotz Personalisierung hohe Trefferquoten erreicht.
Der teuerste Konfigurationsfehler
Elasticsearch und OpenSearch für große Sortimente
Bei kleinen Shops erledigt die relationale Datenbank Produktlisten, Filter und Suche mühelos. Wächst der Katalog aber auf zehntausende Artikel mit vielen Eigenschaften, werden Filter- und Suchabfragen zur Bremse, weil sie über große Tabellen laufen und komplexe Verknüpfungen auswerten müssen. Genau hier setzt die Anbindung von Elasticsearch oder OpenSearch an: Sie übernimmt Suche, Navigation und Listing-Aggregationen und entlastet damit die Datenbank spürbar. Die Storefront liest die Trefferlisten aus dem Suchindex statt aus MySQL, was die Antwortzeit großer Kategorie- und Suchseiten deutlich senkt.
Suche und Filter
Volltextsuche, Facetten und Filter laufen im Suchindex statt über große relationale Verknüpfungen. Das hält auch Kataloge mit vielen Eigenschaften schnell.
Listing-Aggregationen
Kategorieseiten mit Sortierung, Preisspannen und Verfügbarkeit werden aus dem Index bedient. Die Datenbank bleibt frei für Bestellungen und Bestände.
Kontrollierter Fallback
Mit SHOPWARE_ES_THROW_EXCEPTION verhindern Sie ein stilles Zurückfallen auf MySQL bei Indexfehlern, sodass Probleme sichtbar werden statt die Datenbank zu belasten.
# Suchindex für die Storefront aufbauen
bin/console es:index
# Bei Indexfehlern nicht still auf MySQL zurückfallen (.env)
# SHOPWARE_ES_THROW_EXCEPTION=1
# Optional: Admin-Suche über OpenSearch entlasten
bin/console es:admin:indexDer Einsatz lohnt sich nicht für jeden Shop. Ein Katalog mit wenigen hundert Produkten läuft ohne Suchindex oft schneller, weil der zusätzliche Dienst Betrieb und Speicher kostet. Ab mehreren zehntausend Artikeln oder bei vielen gleichzeitigen Filterzugriffen kehrt sich das Verhältnis um. Ergänzend bleibt die klassische Optimierung der verbleibenden Abfragen wichtig, wie sie der Beitrag zur Datenbank-Query-Optimierung im Shop beschreibt; der Suchindex ersetzt keine sauberen Indexe, sondern nimmt der Datenbank die aufwendigste Last ab. Eine fundierte Performance-Analyse misst deshalb vorab, welcher Seitentyp die Datenbankzeit wirklich dominiert.
Theme-Kompilierung und Media-Auslieferung
Ein Teil der Shopware-Performance entsteht schon beim Deployment. Das Storefront-Theme wird aus SCSS und JavaScript zu ausgelieferten Assets kompiliert, und diese Kompilierung gehört in den Build-Prozess, nicht in den laufenden Betrieb. Wird das Theme im Produktivmodus vorab gebaut und werden die Assets korrekt installiert, muss der Server zur Laufzeit nichts mehr übersetzen. Zusammen mit einer sauberen OPcache-Konfiguration, die kompilierten PHP-Code im Speicher hält, sinkt die Verarbeitungszeit pro Anfrage weiter.
# Theme im Produktionsmodus kompilieren
bin/console theme:compile
# Kompilierte Assets in den öffentlichen Pfad kopieren
bin/console asset:install
# Thumbnails für neue Medien vorab erzeugen
bin/console media:generate-thumbnailsDie zweite Baustelle ist die Media-Auslieferung. Shopware erzeugt aus jedem Produktbild abgestufte Thumbnails, die passend zur Anzeigegröße geladen werden, und unterstützt moderne Formate wie WebP. Werden die Thumbnails vorab generiert und mit langen Cache-Zeiten und Content-Hash im Dateinamen ausgeliefert, lädt der Browser sie nur einmal. Wie Sie Bildgewichte weiter senken, zeigt der Beitrag zur Bilder-Optimierung mit WebP und AVIF; wie ein vorgelagertes Edge-Netz die Auslieferung beschleunigt, vertieft der Artikel zum CDN- und Edge-Caching für Shops. Das lohnt sich messbar, denn im HTTP Archive Web Almanac wurden 2024 nur 33 Prozent (HTTP Archive Web Almanac) der HTML-Dokumente über ein CDN ausgeliefert, obwohl 54 Prozent (HTTP Archive Web Almanac) aller Anfragen bereits von einem CDN kamen.
| Bordmittel | Wirkt auf | Größter Hebel bei |
|---|---|---|
| Integrierter HTTP-Cache | TTFB der Storefront | Gäste-Traffic, Kategorien |
| Reverse-Proxy (Varnish) | Antwortzeit unter Last | Hoher Traffic, mehrere Server |
| Cache-Warmup | Erster Aufruf nach Deploy | Häufige Deployments |
| Elasticsearch / OpenSearch | Such- und Filterzeit | Große Sortimente |
| Theme-Kompilierung | Verarbeitungszeit | Jedem Shop im Produktivmodus |
| Thumbnails und WebP | Bildgewicht, LCP | Bildlastigen Produktseiten |
Der Performance-Gewinn eines Updates auf 6.x
Ein oft unterschätzter Hebel ist das Update selbst. Die aktuelle 6.x-Generation von Shopware CE bringt Performance-Verbesserungen mit, die ohne eigenen Entwicklungsaufwand wirken. Ab Shopware 6.6 lässt sich der Warenkorb komprimiert und mit zstd speichern, was Speicher und Übertragung spart (Shopware Developer Documentation). Neuere Versionen laden auf Wunsch reduzierte Produktdaten in Listen, sodass nur der Kurztext statt der vollen Beschreibung geladen wird, und erlauben es, den Product-Stream-Indexer und die geplante Sitemap-Erzeugung aus dem Request-Pfad zu nehmen (Shopware Developer Documentation). Jede dieser Stellschrauben entlastet den heißen Pfad, auf dem der Nutzer wartet.
Hinzu kommt der Sprung auf aktuelle PHP-Versionen, den ein Update mitzieht. Neuere PHP-Generationen mit Preloading und JIT verarbeiten denselben Code schneller, und die aktuelle 6.x-Generation unterstützt experimentell die Speculation Rules API für vorausschauendes Laden der wahrscheinlichen nächsten Seite. Diese Fortschritte summieren sich zu einer spürbar niedrigeren Antwortzeit, ohne dass am eigenen Code etwas geändert werden muss. Ein Versionsstand mehrere Generationen zurück verschenkt genau diese Gewinne.
Das Update ist ein Performance-Projekt
Die wirksamste Optimierung ist oft die, die schon im System steckt: den integrierten HTTP-Cache aktivieren, den Reverse-Proxy davorstellen, die Datenbank mit einem Suchindex entlasten und regelmäßig auf die aktuelle Version aktualisieren. Erst danach lohnt der Blick auf Feinheiten.
Messen, absichern und dauerhaft schnell bleiben
Keine dieser Maßnahmen ist ein Selbstläufer. Die Cache-Trefferquote sinkt mit jeder neuen Extension, jedem zusätzlichen Cookie und jeder unbedachten Personalisierung. Deshalb gehört die Wirkung laufend gemessen: die Trefferquote des Reverse-Proxys, die TTFB je Seitentyp und die Antwortzeit unter realer Last. Erst diese Beobachtung zeigt, ob eine Kategorieseite noch aus dem Cache kommt oder wieder gerendert wird. Eng verbunden ist das mit der Server-Optimierung und TTFB-Senkung, die die Zeit bis zum ersten Byte kontinuierlich im Blick behält, sowie mit dem gezielten Senken der TTFB als Kennzahl.
Der Zusammenhang zur Frontend-Auslieferung bleibt bestehen: Ein niedriger TTFB verschiebt Largest Contentful Paint nach vorn, doch Bilder, Schriften und Skripte entscheiden über den Rest. Deshalb greift die serverseitige Arbeit mit der Frontend-Optimierung ineinander. Wie stark Ladezeit auf den Umsatz wirkt, macht der Beitrag zu Ladezeit, Conversion-Rate und Umsatz deutlich; und weil die Serverwahl den TTFB mitbestimmt, ergänzt der Beitrag zur Hosting-Wahl und Server-Ladezeit das Bild. Wer keinen Shop, sondern eine WordPress-Seite betreibt, findet die passenden Hebel im Beitrag zu den häufigen WordPress-Performance-Bremsen. Dass der Weg lohnt, zeigt die Entwicklung im Web Almanac: 2024 erreichten 43 Prozent (HTTP Archive Web Almanac) der Websites einen guten INP-Wert, ein deutlicher Fortschritt gegenüber den Vorjahren.