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:
- Włącz Gzip jako bazę — działa wszędzie, jest domyślnie dostępny w Nginx
- Dodaj Brotli dla nowoczesnych przeglądarek — lepszy stopień kompresji bez dodatkowego kosztu
- Prekompresuj pliki statyczne na poziomie Brotli 11 i Gzip 9 — jednorazowy koszt, stały zysk
- Ustaw poziom 6 dla kompresji dynamicznej — optymalny balans
- 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.