Zum Inhalt springen
Core Web Vitals Spezialisten
E-Commerce

Shopware Performance: Ladezeiten im Shop senken

Shopware CE schneller machen mit Bordmitteln: integrierter HTTP-Cache und Reverse-Proxy, Cache-Warmup, Elasticsearch und der Performance-Gewinn eines 6.x-Updates.

13 Min. Lesezeit ShopwareE-CommerceCachingHTTP-CacheElasticsearch

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.

Shopware CE: HTTP-Cache und Reverse-Proxy im ShopDer integrierte Cache liefert Seiten aus dem RAM -- Warenkorb und Checkout bleiben dynamischAnfrageStorefrontReverse Proxy (Varnish)integrierter HTTP-Cachehohe Hit-Rate, niedriger TTFBHITCache HIT: Seite aus dem RAMAntwort im MillisekundenbereichMISSShopware App (PHP / Symfony)Cache MISS: Seite wird gerendertWarenkorb + Checkoutbewusst nicht gecachtElasticsearch / OpenSearchentlastet die Datenbankbei großen SortimentenMySQL / MariaDBProdukt- und BestelldatenSlow-Query-Log aktivRedisObjekt- und Session-Cache0,1 bis 0,5 ms Zugriff0,8 sguter TTFB-Schwellenwert(web.dev)8,4 %mehr Retail-Conversionsje 0,1 s (Deloitte)10,1 %mehr Travel-Conversionsje 0,1 s (Deloitte)43 %Websites mit gutem INP2024 (Web Almanac)Ein guter TTFB liegt bei 0,8 Sekunden oder darunter (web.dev); eine um 0,1 s schnellere mobile Ladezeitsteigerte Retail-Conversions um 8,4 und Travel-Conversions um 10,1 Prozent (Deloitte, Milliseconds Make Millions).Beispielhafte Architektur zur Veranschaulichung der Shopware-Cache-Schichten; reale Werte variieren je Setup.

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 HTTP-Cache speichert fertig gerenderte Seiten, sodass identische Folgeanfragen ohne erneutes Rendern beantwortet werden. Ein Reverse-Proxy wie Varnish sitzt vor der Anwendung und liefert diese gecachten Seiten aus dem Arbeitsspeicher aus. ESI (Edge Side Includes) teilt eine Seite in cachbare und dynamische Fragmente auf, sodass der Seitenrahmen gecacht wird, während personalisierte Bausteine wie der Warenkorb pro Anfrage frisch eingesetzt werden.

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.

.env
# Integrierten HTTP-Cache aktivieren
SHOPWARE_HTTP_CACHE_ENABLED=1

# Standard-Cache-Zeit für Storefront-Seiten (Sekunden)
SHOPWARE_HTTP_CACHE_DEFAULT_TTL=7200
config/packages/prod/shopware.yaml
shopware:
  http_cache:
    reverse_proxy:
      enabled: true
      ban_method: 'BAN'
      hosts:
        - 'http://varnish:6081'
      max_parallel_invalidations: 3

Soft Purge statt harter Invalidierung

Varnish verwendet standardmäßig harte Purges, die einen Eintrag sofort verwerfen. Ein Soft Purge behält die alte Seite dagegen im Cache und liefert sie weiter aus, während im Hintergrund eine frische Version geholt wird (Shopware Developer Documentation). So sieht der Nutzer nie eine Wartezeit durch einen kalten Cache, und der Shop bleibt selbst bei einer Invalidierungswelle antwortschnell. Für stark frequentierte Kategorieseiten ist das ein wirksamer Schutz vor Lastspitzen.

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.

deploy.sh
# 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:generate

Genauso 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

Wenn ein Import hunderte Produkte gleichzeitig ändert, kann eine sofortige Invalidierung eine Welle von Neuberechnungen auslösen und die Datenbank überlasten. Shopware bietet dafür eine verzögerte, gebündelte Invalidierung, die Tags sammelt und in kontrollierten Blöcken abarbeitet. Das glättet Lastspitzen nach Massenänderungen. Prüfen Sie nach jedem Import die Trefferquote des Caches, denn eine zu aggressive Invalidierung senkt die Hit-Rate und damit den Effekt der gesamten Cache-Schicht.

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

Wird eine personalisierte Route versehentlich cachbar gemacht, sieht im schlimmsten Fall ein Kunde die Daten eines anderen. Prüfen Sie deshalb nach jeder Änderung an der Cache-Konfiguration gezielt, dass Warenkorb, Checkout und Kundenkonto niemals aus dem Cache kommen. Ein kontrollierter Blick auf die Response-Header dieser Routen zeigt zuverlässig, ob sie als nicht cachbar markiert sind. Dieser eine Test schützt vor dem folgenschwersten Fehler der gesamten Cache-Schicht.

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.

elasticsearch-setup.sh
# 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:index

Der 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.

build.sh
# 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-thumbnails

Die 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.

BordmittelWirkt aufGrößter Hebel bei
Integrierter HTTP-CacheTTFB der StorefrontGäste-Traffic, Kategorien
Reverse-Proxy (Varnish)Antwortzeit unter LastHoher Traffic, mehrere Server
Cache-WarmupErster Aufruf nach DeployHäufige Deployments
Elasticsearch / OpenSearchSuch- und FilterzeitGroße Sortimente
Theme-KompilierungVerarbeitungszeitJedem Shop im Produktivmodus
Thumbnails und WebPBildgewicht, LCPBildlastigen 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

Wer auf einer alten 6.x-Version verharrt, verzichtet auf Cache-Verbesserungen, effizientere Datenstrukturen und schnellere PHP-Laufzeiten, die neuere Versionen ohne Zusatzaufwand mitbringen. Ein geplantes Update auf den aktuellen Stand ist damit nicht nur Wartung, sondern eine der wirksamsten und günstigsten Performance-Maßnahmen überhaupt.

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.

Projekterfahrung aus 50+ Performance-Projekten

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.

Dieser Artikel basiert auf Daten aus: Shopware Developer Documentation (HTTP-Cache, Reverse-Proxy, Cache-Invalidierung, Elasticsearch und Performance-Tweaks), web.dev (Time to First Byte, Largest Contentful Paint und Interaction to Next Paint sowie deren Schwellenwerte), HTTP Archive Web Almanac 2024 (Core Web Vitals, CDN-Nutzung und Kompression) und Deloitte (Milliseconds Make Millions). Alle genannten Statistiken wurden zum Zeitpunkt der Veröffentlichung geprüft. Die Architektur im Mockup dient der Veranschaulichung der Shopware-Cache-Schichten.