Dlaczego kompresja ma znaczenie

Każdy kilobajt danych wysłany z serwera do przeglądarki kosztuje — czas ładowania, transfer, cierpliwość użytkownika. Kompresja HTTP to jedna z najprostszych i najbardziej efektywnych optymalizacji, jakie można wdrożyć na serwerze webowym. Typowa strona HTML, plik CSS czy skrypt JavaScript kompresują się o 60-85%, co przekłada się bezpośrednio na szybkość ładowania.

Dwa najpopularniejsze algorytmy kompresji w świecie webowym to Gzip i Brotli. Oba mają swoje zalety, a wybór między nimi (lub użycie obu jednocześnie) zależy od konkretnego przypadku. Przyjrzyjmy się im bliżej.

Gzip — sprawdzony standard

Gzip towarzyszy internetowi od lat 90. Jest obsługiwany przez praktycznie każdą przeglądarkę i każdy serwer HTTP. Bazuje na algorytmie DEFLATE i oferuje poziomy kompresji od 1 (najszybsza, słabsza kompresja) do 9 (najwolniejsza, najlepsza kompresja).

Konfiguracja Gzip w Nginx jest prosta:

gzip on;
gzip_vary on;
gzip_min_length 1024;
gzip_comp_level 6;
gzip_types text/plain text/css application/json
           application/javascript text/xml
           application/xml image/svg+xml;

Najważniejsze parametry:

  • gzip_comp_level 6 — optymalny kompromis między stopniem kompresji a zużyciem CPU. Poziomy 7-9 dają marginalnie lepszą kompresję kosztem znacznie większego obciążenia procesora.
  • gzip_min_length 1024 — nie kompresuj plików mniejszych niż 1 KB. Kompresja bardzo małych plików może paradoksalnie zwiększyć ich rozmiar z powodu narzutu nagłówków.
  • gzip_vary on — informuje serwery cache'ujące, że odpowiedź zależy od nagłówka Accept-Encoding.

Brotli — nowszy i skuteczniejszy

Brotli to algorytm kompresji stworzony przez Google, zaprojektowany specjalnie z myślą o kompresji treści webowych. Oferuje lepszy stopień kompresji niż Gzip — typowo o 15-25% — przy porównywalnym wykorzystaniu zasobów na poziomach kompresji do 6.

Kluczowa różnica: Brotli zawiera wbudowany słownik typowych ciągów znaków spotykanych w HTML, CSS i JavaScript. Dzięki temu algorytm „wie", jakie wzorce najczęściej występują w treściach webowych i może je kompresować efektywniej.

Konfiguracja Brotli w Nginx wymaga dodatkowego modułu ngx_brotli:

brotli on;
brotli_comp_level 6;
brotli_min_length 1024;
brotli_types text/plain text/css application/json
             application/javascript text/xml
             application/xml image/svg+xml;

Porównanie wydajności

Przeprowadziliśmy testy na typowych zasobach naszych stron. Oto wyniki kompresji dla pliku CSS o rozmiarze 85 KB:

| Metoda | Poziom | Rozmiar po kompresji | Oszczędność | Czas kompresji | |---|---|---|---|---| | Brak | — | 85.0 KB | 0% | 0 ms | | Gzip | 6 | 17.2 KB | 79.8% | 2.1 ms | | Gzip | 9 | 16.8 KB | 80.2% | 5.4 ms | | Brotli | 6 | 14.5 KB | 82.9% | 2.8 ms | | Brotli | 11 | 12.1 KB | 85.8% | 180 ms |

Kilka wniosków z tych danych:

  • Brotli na poziomie 6 wygrywa z Gzip 9 — lepsza kompresja przy krótszym czasie
  • Gzip 6 vs Gzip 9 — różnica w kompresji jest minimalna, a czas podwaja się
  • Brotli 11 jest dramatycznie wolny — poziomy powyżej 6 nie nadają się do kompresji dynamicznej w czasie rzeczywistym, ale są doskonałe do prekompresji plików statycznych

Strategia: dynamiczna vs statyczna kompresja

Najlepsze podejście łączy oba rodzaje kompresji:

Kompresja dynamiczna — serwer kompresuje odpowiedź w locie. Stosowana dla treści generowanych dynamicznie (HTML, odpowiedzi API). Używaj Brotli lub Gzip na poziomie 4-6.

Kompresja statyczna (prekompresja) — pliki statyczne (CSS, JS, czcionki) kompresowane są z wyprzedzeniem na najwyższym poziomie i serwowane bezpośrednio. Czas kompresji nie ma znaczenia, bo odbywa się raz, podczas budowania.

W Nginx prekompresja wygląda tak:

# Serwuj prekompresowane pliki .br jeśli istnieją
brotli_static on;
# Analogicznie dla gzip
gzip_static on;

Wystarczy obok pliku style.css umieścić style.css.br i style.css.gz, a Nginx automatycznie wybierze najlepszą wersję na podstawie nagłówka Accept-Encoding przesłanego przez przeglądarkę.

Wsparcie przeglądarek

Gzip jest obsługiwany przez 100% przeglądarek — to uniwersalny standard. Brotli jest obsługiwany przez ponad 97% przeglądarek globalnie (dane z 2025 roku). Jedyne istotne wyjątki to bardzo stare wersje przeglądarek mobilnych i niektóre boty.

Co ważne, Brotli działa wyłącznie przez HTTPS. Jeśli Twoja strona nadal serwuje treści przez HTTP (czego odradzamy z wielu powodów), Brotli nie zadziała. To kolejny argument za wdrożeniem certyfikatu SSL.

Rekomendowana konfiguracja

Na podstawie naszych doświadczeń rekomendujemy następujące podejście:

  1. Włącz Gzip jako bazę — działa wszędzie, jest domyślnie dostępny w Nginx
  2. Dodaj Brotli dla nowoczesnych przeglądarek — lepszy stopień kompresji bez dodatkowego kosztu
  3. Prekompresuj pliki statyczne na poziomie Brotli 11 i Gzip 9 — jednorazowy koszt, stały zysk
  4. Ustaw poziom 6 dla kompresji dynamicznej — optymalny balans
  5. Nie kompresuj obrazów (JPEG, PNG, WebP) ani plików wideo — są już skompresowane, ponowna kompresja marnuje CPU

Co z nowszymi formatami?

Warto wspomnieć o Zstandard (zstd) — algorytmie kompresji od Facebooka, który oferuje jeszcze lepszy stosunek kompresji do szybkości. Przeglądarki Chrome i Firefox dodały wsparcie dla zstd w nagłówku Content-Encoding w 2024 roku, ale adopcja po stronie serwerów jest wciąż w powijakach.

Na dziś kombinacja Gzip + Brotli pokrywa praktycznie 100% przypadków użycia. Gdy zstd dojrzeje po stronie serwerowej, będzie naturalnym kolejnym krokiem.

Chcesz sprawdzić, czy Twoja strona optymalnie wykorzystuje kompresję? Skontaktuj się z nami — przeprowadzimy audyt wydajności i wskażemy miejsca do poprawy.