Brotli — kompresja w Nginx i Apache: lepsza niż gzip
Opublikowano: 10 kwietnia 2026 · Kategoria: Hosting / Wydajność
Brotli (algorytm Google z 2015 r.) jest nowszą alternatywą dla gzip i oferuje 15-25% lepszą kompresję przy podobnym czasie dekompresji. Obsługiwany przez wszystkie nowoczesne przeglądarki, wymagany do uzyskania top wyników w PageSpeed Insights. Oto jak go włączyć na Nginx i Apache.
Brotli vs gzip — benchmarki
| Typ pliku | Oryginał | gzip -9 | Brotli -11 | Zysk Brotli |
|---|---|---|---|---|
| HTML (100 KB) | 100 KB | 32 KB | 26 KB | -19% |
| CSS minified (50 KB) | 50 KB | 14 KB | 11 KB | -21% |
| JS bundle (200 KB) | 200 KB | 68 KB | 58 KB | -15% |
| JSON API response (20 KB) | 20 KB | 5.8 KB | 4.6 KB | -21% |
| JPEG (50 KB) | 50 KB | 49 KB | 49 KB | ~0% |
Nginx — instalacja ngx_brotli
Nginx nie ma wbudowanego Brotli — musisz dodać moduł ngx_brotli. Najwygodniej
zainstalować gotowy pakiet z repozytorium lub skompilować Nginx z modułem:
# Metoda 1: Gotowy pakiet (Ubuntu/Debian z nginx.org) apt install libnginx-mod-brotli # Metoda 2: Kompilacja (dla kontroli nad wersją) apt install -y libgoogle-perftools-dev git build-essential libpcre3-dev zlib1g-dev libssl-dev # Sklonuj ngx_brotli cd /tmp git clone --recurse-submodules https://github.com/google/ngx_brotli cd ngx_brotli && git submodule update --init # Sprawdź argumenty obecnej kompilacji Nginx nginx -V 2>&1 | grep configure | sed 's/ --/\n --/g' # Rekompilacja z modułem (dodaj --add-dynamic-module) cd /tmp wget https://nginx.org/download/nginx-$(nginx -v 2>&1 | cut -d/ -f2).tar.gz tar xzf nginx-*.tar.gz cd nginx-*/ # Tu skopiuj istniejące flagi z nginx -V i dodaj: ./configure [istniejące-flagi] --add-dynamic-module=/tmp/ngx_brotli make modules cp objs/ngx_http_brotli_filter_module.so /etc/nginx/modules/ cp objs/ngx_http_brotli_static_module.so /etc/nginx/modules/
# /etc/nginx/nginx.conf — załadowanie modułów (na górze pliku)
load_module modules/ngx_http_brotli_filter_module.so;
load_module modules/ngx_http_brotli_static_module.so;
# Konfiguracja Brotli w bloku http {}
http {
# Brotli — kompresja dynamiczna
brotli on;
brotli_comp_level 6; # 1-11, 6 = dobry balans
brotli_min_length 256; # Nie kompresuj małych plików
brotli_types
text/plain
text/css
text/javascript
text/xml
text/x-component
application/javascript
application/json
application/xml
application/rss+xml
application/atom+xml
application/vnd.ms-fontobject
image/svg+xml
font/truetype
font/opentype;
# brotli_static on — serwuj pre-skompresowane pliki .br
# (jeśli istnieje plik.css.br, serwuj zamiast plik.css)
brotli_static on;
# Zostaw gzip jako fallback
gzip on;
gzip_vary on;
gzip_types text/plain text/css application/javascript application/json;
} nginx -t && systemctl reload nginx # Weryfikacja curl -H "Accept-Encoding: br" -sI https://example.com | grep -i content-encoding # Oczekiwane: content-encoding: br
Pre-kompresja plików statycznych (poziom 11)
Dla plików statycznych (CSS, JS, HTML deploy) wygeneruj pliki .br offline z poziomem
11 — serwer je serwuje bez CPU overhead:
# Instalacja narzędzia brotli CLI
apt install brotli
# Pre-kompresja jednego pliku
brotli --quality=11 --output=main.css.br main.css
# Pre-kompresja wszystkich CSS i JS w katalogu
find /var/www/html -type f \( -name "*.css" -o -name "*.js" -o -name "*.html" \) -exec brotli --quality=11 {} \;
# Skrypt do użycia po każdym deploymencie
#!/bin/bash
WEBROOT="/var/www/html"
find "$WEBROOT" -type f \( -name "*.css" -o -name "*.js" -o -name "*.svg" -o -name "*.html" -o -name "*.json" \) | while read f; do
brotli --quality=11 --output="${f}.br" "$f"
done
echo "Pre-kompresja Brotli zakończona" Apache — mod_brotli
# Instalacja i włączenie mod_brotli (Ubuntu 20.04+) apt install libbrotli1 a2enmod brotli systemctl restart apache2
# /etc/apache2/conf-available/brotli.conf
<IfModule mod_brotli.c>
AddOutputFilterByType BROTLI_COMPRESS text/html text/plain text/xml text/css text/javascript
AddOutputFilterByType BROTLI_COMPRESS application/javascript application/json application/xml
AddOutputFilterByType BROTLI_COMPRESS application/rss+xml application/atom+xml
AddOutputFilterByType BROTLI_COMPRESS image/svg+xml font/opentype font/truetype
# Nie kompresuj już skompresowanych plików
SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png|webp|avif|mp4|mp3|woff2?)$ no-brotli
BrotliCompressionQuality 6
BrotliFilterNote Input brotli_input_size
BrotliFilterNote Output brotli_output_size
BrotliFilterNote Ratio brotli_compression_ratio
</IfModule> a2enconf brotli apache2ctl configtest && systemctl reload apache2 # Weryfikacja curl -H "Accept-Encoding: br" -sI http://localhost/ | grep content-encoding
CDN z obsługą Brotli
Jeśli używasz CDN, Brotli może działać bez żadnej konfiguracji serwera origin:
- Cloudflare — Brotli włączone domyślnie (plan Free+). Speed → Optimization → Brotli: on. Cloudflare kompresuje pliki między Edge a użytkownikiem, niezależnie od serwera origin.
- BunnyCDN — Brotli obsługiwany automatycznie przy włączonym Smart Optimization.
- Fastly — wymaga włączenia w konfiguracji serwisu VCL.
- AWS CloudFront — obsługuje Brotli od 2020 r. — włącz "Compress objects automatically" w distribution settings.