Powrót do bazy wiedzy

Optymalizacja: Piekielnie Szybkie Magento 2

Każde 100ms opóźnienia to utracona konwersja. Dowiedz się, jak skonfigurować Varnish, Redis, OPcache i Core Web Vitals, żeby Twoje Magento odpowiadało szybciej niż myśl klienta.

7%

spadek konwersji przy każdych 100ms opóźnienia

<50ms

TTFB przy poprawnej konfiguracji Varnish FPC

~50%

redukcja wagi obrazów przez konwersję do WebP

Wydajność Magento to nie pojedyncza opcja do włączenia – to pięć warstw optymalizacji: serwer WWW (Nginx + Varnish), cache aplikacji (Redis), silnik PHP (OPcache), baza danych (MySQL query tuning) i frontend (Core Web Vitals). Każda warstwa ma swoje wąskie gardła i swoje narzędzia diagnostyczne. Domyślna konfiguracja Magento jest ustawiona na “bez błędów”, nie na “maksymalną prędkość”.

Varnish FPC – serwowanie z pamięci RAM

Varnish Cache działający jako reverse proxy przed Nginx serwuje pełnoekranowy cache (Full Page Cache) bezpośrednio z pamięci RAM. Użytkownik niezalogowany nie dotyka PHP ani bazy danych – dostaje odpowiedź w <50ms. To absolutna konieczność dla każdego sklepu z ruchem powyżej 100 odwiedzin dziennie.

Diagnostyka i zarządzanie Varnish przez CLI

Kluczowe komendy do monitorowania hit-rate cache, czyszczenia i analizy ruchu w czasie rzeczywistym.

# Sprawdzenie hit-rate Varnish (powinien być >90% na produkcji):

varnishstat -1 | grep -E "MAIN.cache_hit|MAIN.cache_miss|MAIN.sess_conn"

# Podróż ruchem przez Varnish w czasie rzeczywistym:

varnishlog -g request -q "ReqMethod ne 'PURGE'" | grep -E "ReqURL|RespStatus|Hit|Miss"

# Włączenie Varnish FPC w Magento (po instalacji Varnish):

php bin/magento config:set system/full_page_cache/caching_application 2

# Eksport konfiguracji VCL z Magento (wgraj do Varnish):

php bin/magento varnish:vcl:generate --export-version=6 > /etc/varnish/magento.vcl

# Czyszczenie pełnego cache Varnish (PURGE wszystkiego):

varnishadm "ban req.url ~ ."

Redis – cache aplikacji i sesje

Magento używa Redis do dwóch krytycznych celów: cache bloków aplikacji (konfiguracja, tłumaczenia, układ stron) i przechowywania sesji użytkowników. Kluczowa zasada: zawsze używaj oddzielnych instancji (lub przynajmniej osobnych baz danych) dla sesji i cache. Współdzielona instancja może doprowadzić do eviction sesji przez dane cache – użytkownicy będą tracili koszyk bez ostrzeżenia.

Pro Tip: Separacja Redis – poprawna konfiguracja env.php

Fragment pliku app/etc/env.php z oddzielonymi bazami danych Redis dla cache (db 0) i sesji (db 1). Nigdy nie użwaj tej samej bazy.

// env.php – konfiguracja Redis (fragment):

'cache' => [

  'frontend' => [

    'default' => ['backend' => 'Magento\Framework\Cache\Backend\Redis',

      'backend_options' => ['server' => '127.0.0.1', 'database' => '0']],

    'page_cache' => ['backend' => 'Magento\Framework\Cache\Backend\Redis',

      'backend_options' => ['server' => '127.0.0.1', 'database' => '1']],

  ]

],

'session' => ['save' => 'redis',

  'redis' => ['host' => '127.0.0.1', 'database' => '2']], // osobna baza!

Diagnostyka Redis przez CLI

Monitorowanie pamięci, hit-rate i ewentualnych evictions – kluczowe przy skalowaniu sklepu.

# Zużycie pamięci Redis:

redis-cli info memory | grep -E "used_memory_human|maxmemory_human|mem_fragmentation_ratio"

# Statystyki hit-rate cache Redis:

redis-cli info stats | grep -E "keyspace_hits|keyspace_misses"

# Liczba kluczy w każdej bazie (0=cache, 1=FPC, 2=sesje):

redis-cli info keyspace

# Czyszczenie tylko cache Magento (bez sesji):

php bin/magento cache:flush && redis-cli -n 0 flushdb && redis-cli -n 1 flushdb

PHP OPcache – kompilacja kodu raz, używanie wielokrotnie

PHP OPcache przechowuje skompilowany bytecode PHP w pamięci RAM. Bez OPcache każde żądanie HTTP wymaga ponownej interpretacji dziesiątek tysięcy plików PHP Magento. Z OPcache – kod jest już skompilowany. Niepoprawna konfiguracja OPcache (za mały memory_consumption lub zbyt mała liczba opcache.max_accelerated_files) to jeden z najczęstszych i najtrudniejszych do wykrycia problemów wydajnościowych.

Zalecana konfiguracja PHP OPcache dla Magento 2

Minimalne wartości dla instalacji produkcyjnej Magento 2.4.x. Zbyt niskie wartości powodują ciche resetowanie cache pod obciążeniem.

; /etc/php/8.3/fpm/conf.d/10-opcache.ini

opcache.enable=1

opcache.memory_consumption=512 ; min. 512MB dla Magento 2

opcache.interned_strings_buffer=64

opcache.max_accelerated_files=130000 ; Magento ma ~100k plików PHP

opcache.revalidate_freq=60 ; 0 na dev, 60 na prod

opcache.fast_shutdown=1

opcache.enable_cli=1

# Sprawdzenie stanu OPcache (wymagany php-cli z opcache):

php -r "print_r(opcache_get_status(false));" | grep -E "num_cached_scripts|memory_usage"

Optymalizacja obrazów i Core Web Vitals

Obrazy to 70–80% wagi strony – i najszybszy obszar do optymalizacji. Konwersja do WebP (obsługiwany przez 97% przeglądarek) redukuje rozmiar o ~50% bez straty jakości. Na poziomie serwera Nginx może serwować .webp automatycznie, gdy przeglądarka go obsługuje.

Core Web Vitals wpływają bezpośrednio na ranking Google. Kluczowe metryki dla Magento to LCP (Largest Contentful Paint – główne zdjęcie produktu), CLS (Cumulative Layout Shift – skoki layoutów przy ładowaniu bloków) i INP (Interaction to Next Paint – reakcja na dodanie do koszyka).

WebP na poziomie Nginx

Nginx sprawdza nagłówek Accept i serwuje .webp jeśli istnieje. Brak zmian w kodzie Magento – czysta optymalizacja serwerowa.

Critical CSS (ponad the fold)

Wyłącz CSS blokujący renderowanie. Włącz: Stores → Config → Advanced → Developer → CSS Settings → Use CSS Critical Path.

Minifikacja i łączenie JS/CSS

Stores → Config → Advanced → Developer. Włącz Merge JS Files, Minify JS, Minify CSS. Wymagane przy wyłączonym Hyvä (pełny Luma).

Lazy loading obrazów

Magento 2.4.4+ obsługuje natywny loading="lazy" dla obrazów produktu. Zmniejsza początkowy rozmiar transferu o 40–60%.

Profilowanie SQL – wykrywanie wąskich gardeł

Magento 2 może wykonywać kilkaset zapytań SQL na jedno żądanie HTTP. Problem N+1 (pętla generująca osobne zapytanie dla każdego produktu) jest niezwykle częsty w źle napisanych wtyczkach. Query Profiler wbudowany w Magento oraz MySQL Slow Query Log to podstawowe narzędzia diagnostyki.

Pro Tip: Włączenie Query Profilera i Slow Query Log

Dwa poziomy diagnostyki SQL: Magento Query Profiler (widoczny w stopce admin) i MySQL Slow Query Log (wszystkie zapytania >1s).

# Włączenie Query Profilera Magento (tylko na dev/staging!):

php bin/magento dev:query-log:enable

# Podgląd zalogowanych zapytań SQL:

tail -f var/debug/db.log | grep -v "catalogsearch\|session"

# MySQL: włączenie Slow Query Log (zapytania >1s):

SET GLOBAL slow_query_log = 'ON';

SET GLOBAL long_query_time = 1;

SET GLOBAL slow_query_log_file = '/var/log/mysql/slow.log';

# Analiza najwolniejszych zapytań:

mysqldumpslow -s t -t 10 /var/log/mysql/slow.log

Najczęstsze problemy wydajnościowe i ich źródła

TTFB > 2s mimo Varnish

Varnish cache miss – strony nie są cachowane. Sprawdź nagłówek X-Cache: MISS i logi VCL. Może być błąd w konfiguracji cookie-based exclusion.

Koszyk znika przy dużym ruchu

Eviction sesji przez Redis – współdzielona baza dla cache i sesji, brak ustawienia maxmemory-policy noeviction dla sesji.

Wysokie CPU PHP przy każdym żądaniu

OPcache wypłukuje się pod obciążeniem – za małe opcache.max_accelerated_files lub za małe memory_consumption.

Wolne ładowanie strony kategorii

Problem N+1 w pluginie lub zestawach atrybutów. Włącz Query Profiler i szukaj powtarzających się zapytań SELECT * FROM catalog_product_entity_varchar.

CLS (layout shift) na stronie produktu

Blok ceny lub promocji ładuje się asynchronicznie i przesuwa treść. Zdefiniuj wymiary kontenera przez CSS, aby zarezerwować miejsce przed załadowaniem bloku.

Wolna reindeksacja blokuje frontend

Indeksatory w trybie Update on Save blokują zapis produktu. Przełącz na Update by Schedule i sprawdź, czy Cron działa co 1 minutę.

Optymalizacja wydajności to proces ciągły – każda nowa wtyczka, aktualizacja lub zmiana asortymentu może wprowadzić regresję. W Mage24.pl każde środowisko produkcyjne dostarczamy z prekonfigurowanym Varnish, Redis (z separacją baz), OPcache i monitoringiem APM – gotowe na ruch od pierwszego dnia.

Twój sklep działa wolno lub chcesz osiągnąć Lighthouse 100?

Przeprowadzimy audyt wydajności, skonfigurujemy Varnish, Redis i OPcache oraz zoptymalizujemy Core Web Vitals w Twoim sklepie.

Zamów Audyt Wydajności