Gzip i Brotli kompresija — Kako smanjiti velicinu sajta

Kompletni vodic: HTTP kompresija koja smanjuje transfer za 70-90% bez promene sadrzaja

70-90%
Smanjenje velicine sa kompresijom
15-25%
Brotli bolji od Gzip-a
97%
Browser podrska za Brotli
2015
Google objavio Brotli

1. Sta je HTTP kompresija

HTTP kompresija smanjuje velicinu podataka koji se prenose izmedju servera i browsera. Server kompresuje odgovor (HTML, CSS, JS), browser ga dekompresuje i prikazuje. Korisnik ne primecuje razliku — sadrzaj je identican, samo je prenos brzi.

  • HTML od 100KB → kompresovan na ~15KB (85% usteda)
  • CSS od 50KB → kompresovan na ~8KB (84% usteda)
  • JavaScript od 200KB → kompresovan na ~45KB (77% usteda)
Cinjenica: Kompresija je najlaksi "quick win" za performanse. Jedno podesavanje na serveru smanjuje SVE tekstualne transfere za 70-90%. Nema promene koda, nema promene dizajna.

2. Kako radi: Accept-Encoding / Content-Encoding

# 1. Browser salje zahtev sa listom podrzanih kompresija
GET /style.css HTTP/1.1
Accept-Encoding: gzip, deflate, br

# 2. Server bira najbolju i kompresuje odgovor
HTTP/1.1 200 OK
Content-Encoding: br
Content-Type: text/css
Content-Length: 8234
Vary: Accept-Encoding

[kompresovani podaci]

# 3. Browser dekompresuje i prikazuje normalno
  • br = Brotli (najpopularniji, najefikasniji)
  • gzip = Gzip (univerzalan, svuda podrzan)
  • deflate = Deflate (zastareo, retko se koristi)
Vary: Accept-Encoding je obavezan header kad koristite kompresiju. Bez njega, CDN moze servirati kompresovanu verziju browseru koji ne podrzava tu kompresiju.

3. Gzip

Gzip je najstariji i najsire podrzan algoritam kompresije za web. Kreiran 1992, baziran na DEFLATE algoritmu (LZ77 + Huffman coding).

Nivoi kompresije (1-9)

NivoKompresijaBrzinaPreporuka
1NajslabijaNajbrzaReal-time streaming
4-5DobraBrzaDinamicki sadrzaj (HTML)
6OdlicnaUmerenaDefault — najbolji balans
9MaksimalnaSporaPre-kompresija statickih fajlova
  • Browser podrska: 100% — svaki browser od IE6 podrzava Gzip
  • Prosecna usteda: 70-80% za tekstualne fajlove
  • CPU overhead: Minimalan na nivou 6 (~1-2ms po zahtevu)

4. Brotli

Brotli je Google-ov algoritam kompresije, objavljen 2015. godine (RFC 7932). Dizajniran specificno za web, koristi unapred definisan recnik od 120KB sa cestim web paternima (HTML tagovi, CSS propertiji, JS kljucne reci).

Prednosti nad Gzip-om

  • 15-25% bolja kompresija za tekstualne resurse pri istom kvalitetu
  • Ugradjeni web recnik — zna unapred ceste web paterne sto poboljsava kompresiju malih fajlova
  • Brza dekompresija — browser dekompresuje Brotli brze od Gzip-a
  • 11 nivoa kompresije (vs 9 za Gzip) — vise fleksibilnosti

Nivoi kompresije (0-11)

NivoKompresijaBrzinaPreporuka
1-3DobraVrlo brzaReal-time, brzi od Gzip 6
4-6OdlicnaBrzaDinamicki sadrzaj
7-9Vrlo dobraUmerenaCDN pre-kompresija
10-11MaksimalnaSporaBuild-time pre-kompresija SAMO
Vazno: Brotli nivo 11 je 10-50x sporiji od nivoa 6. NIKAD ne koristite nivo 11 za dinamicku kompresiju. Koristite ga samo za pre-kompresiju pri build-u.

5. Gzip vs Brotli vs Deflate — benchmarks

MetrikaGzip (nivo 6)Brotli (nivo 6)Brotli (nivo 11)Deflate
HTML 100KB~18KB~14KB~12KB~19KB
CSS 50KB~10KB~8KB~6.5KB~11KB
JS 200KB~55KB~45KB~38KB~58KB
Kompresija vreme~2ms~3ms~150ms~2ms
Dekompresija~1ms~0.8ms~0.8ms~1ms
Browser podrska100%97%+97%+100%
PreporukaFallbackPrimarniPre-kompresijaNe koristiti

6. Koji fajlovi se kompresuju, koji NE

KOMPRESOVATI ✔

Tip fajlaMIME typeTipicna usteda
HTMLtext/html80-90%
CSStext/css80-85%
JavaScriptapplication/javascript75-80%
JSONapplication/json80-90%
XMLapplication/xml80-85%
SVGimage/svg+xml60-75%
Plain texttext/plain70-80%
Web fonts (TTF, OTF)font/ttf40-50%

NE KOMPRESOVATI ✘

  • JPEG, PNG, WebP, AVIF, GIF — vec kompresovani. Dodatna kompresija ne pomaze i trosi CPU.
  • WOFF2 — vec koristi Brotli kompresiju interno. Kompresija nad kompresijom nema efekta.
  • MP4, WebM, MP3, AAC — video i audio su vec kompresovani.
  • ZIP, GZ, BR, RAR — arhive su vec kompresovane.
  • PDF — vecina PDF-ova je vec kompresovana interno.
Greska: Kompresija vec kompresovanih fajlova moze POVECATI velicinu (overhead kompresije bez ustede) i bespotrebno trositi CPU.

7. Pre-kompresija vs dinamicka kompresija

AspektDinamickaPre-kompresija
KadaNa svaki zahtev, u realnom vremenuJednom, pri build/deploy-u
CPUKoristi CPU na svaki zahtevJednom pri buildu, nula runtime CPU
NivoNizak-srednji (Gzip 6, Brotli 4-6)Maksimalan (Gzip 9, Brotli 11)
ZaDinamicki sadrzaj (HTML, API)Staticni fajlovi (CSS, JS, slike)
PrimerNginx gzip ongzip style.css → style.css.gz
# Pre-kompresija pri build-u
# Generise .gz i .br verzije svih statickih fajlova
find ./dist -name "*.css" -o -name "*.js" -o -name "*.html" -o -name "*.svg" | \
  while read f; do
    gzip -9 -k "$f"                    # style.css → style.css.gz
    brotli -q 11 -o "$f.br" "$f"       # style.css → style.css.br
  done

# Nginx servira pre-kompresovane fajlove ako postoje
gzip_static on;    # Servira .gz ako postoji
brotli_static on;  # Servira .br ako postoji (nginx-brotli modul)

8. Konfiguracija

Nginx

# /etc/nginx/nginx.conf
http {
    # Gzip
    gzip on;
    gzip_vary on;
    gzip_min_length 256;
    gzip_comp_level 6;
    gzip_types
        text/plain text/css text/xml text/javascript
        application/javascript application/json application/xml
        image/svg+xml application/xhtml+xml;

    # Brotli (zahteva nginx-brotli modul)
    brotli on;
    brotli_comp_level 6;
    brotli_types
        text/plain text/css text/xml text/javascript
        application/javascript application/json application/xml
        image/svg+xml;

    # Pre-kompresija (servira .gz/.br ako postoji)
    gzip_static on;
    brotli_static on;
}

Apache (.htaccess)

<IfModule mod_deflate.c>
  AddOutputFilterByType DEFLATE text/html text/plain text/css
  AddOutputFilterByType DEFLATE text/xml text/javascript
  AddOutputFilterByType DEFLATE application/javascript application/json
  AddOutputFilterByType DEFLATE application/xml image/svg+xml

  # Ne kompresuj vec kompresovane
  SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png|webp|avif)$ no-gzip
  SetEnvIfNoCase Request_URI \.(?:woff2?|ttf|otf)$ no-gzip
</IfModule>

Express.js (Node)

const compression = require('compression');
const express = require('express');
const app = express();

// Gzip kompresija za sve tekstualne odgovore
app.use(compression({
  level: 6,
  threshold: 256,  // Ne kompresuj fajlove manje od 256B
  filter: (req, res) => {
    // Ne kompresuj vec kompresovane formate
    if (req.headers['x-no-compression']) return false;
    return compression.filter(req, res);
  }
}));

// Za Brotli: npm install shrink-ray-current
// const shrinkRay = require('shrink-ray-current');
// app.use(shrinkRay());

Vercel / Cloudflare

Vercel: Automatski kompresuje sa Brotli. Nema konfiguracije — radi iz kutije.

Cloudflare: Speed → Optimization → Auto Minify + Brotli: ON. Takodje automatski.

FastAPI (Python)

from fastapi import FastAPI
from fastapi.middleware.gzip import GZipMiddleware

app = FastAPI()
app.add_middleware(GZipMiddleware, minimum_size=500)
# Kompresuje sve odgovore vece od 500 bajtova

9. Testiranje kompresije

  • Chrome DevTools: Network tab → kliknite zahtev → Response Headers → trazite Content-Encoding: br ili gzip
  • curl:
# Provera sa curl-om
curl -I -H "Accept-Encoding: br,gzip" https://vasajt.rs/

# Trazite u odgovoru:
# Content-Encoding: br     ← Brotli aktivan
# Content-Encoding: gzip   ← Gzip aktivan
# (nista)                  ← Kompresija NIJE aktivna!
  • Web Security Scanner — automatski proverava da li je kompresija aktivna na vasem sajtu.
  • PageSpeed Insights — prikazuje "Enable text compression" preporuku ako kompresija nije aktivna.
  • GTmetrix — prikazuje kompresovanu vs nekompresovanu velicinu za svaki resurs.

10. Najcesce greske

  • Kompresija iskljucena — #1 greska. Mnogi hosting provajderi ne ukljucuju kompresiju po defaultu.
  • Kompresija slika — Gzip/Brotli na JPEG/PNG trose CPU bez ustede. Iskljucite za binarne formate.
  • Brotli nivo 11 dinamicki — 10-50x sporije od nivoa 6. Koristite samo za pre-kompresiju.
  • Nedostaje Vary: Accept-Encoding — CDN moze servirati pogresan format. Nginx automatski dodaje sa gzip_vary on.
  • Kompresija malih fajlova — fajlovi <256 bajtova posle kompresije mogu biti VECI (overhead). Postavite min_length.
  • Dupla kompresija — CDN kompresuje + server kompresuje = CPU waste. Koristite samo jedan nivo.
  • WOFF2 kompresija — WOFF2 VEC koristi Brotli interno. Ne kompresujte ponovo.

11. Reference i resursi

Proverite kompresiju vaseg sajta →

Gzip & Brotli Compression — How to Reduce Site Size

Complete guide: HTTP compression that reduces transfers by 70-90% without content changes

70-90%
Size reduction with compression
15-25%
Brotli better than Gzip
97%
Browser support for Brotli
2015
Google released Brotli

1. What is HTTP compression

HTTP compression reduces data size between server and browser. Server compresses, browser decompresses. User sees identical content, just faster transfer.

Fact: Compression is the easiest "quick win" for performance. One server setting reduces ALL text transfers by 70-90%.

2. How it works: Accept-Encoding / Content-Encoding

Browser sends Accept-Encoding: gzip, deflate, br → Server picks best algorithm → responds with Content-Encoding: br (or gzip) → Browser decompresses.

Vary: Accept-Encoding header is mandatory with compression. Without it, CDN might serve compressed version to a browser that doesn't support it.

3. Gzip

Oldest and most widely supported. Created 1992, based on DEFLATE (LZ77 + Huffman). Levels 1-9, default 6 is best balance. 100% browser support. ~70-80% savings.

4. Brotli

Google's algorithm (2015, RFC 7932). Built-in web dictionary of common patterns. 15-25% better than Gzip. Faster decompression. 97%+ support.

LevelCompressionSpeedUse for
1-3GoodVery fastReal-time, faster than Gzip 6
4-6GreatFastDynamic content
10-11MaximumSlowBuild-time pre-compression ONLY
Important: Brotli level 11 is 10-50x slower than level 6. NEVER use level 11 for dynamic compression.

5. Gzip vs Brotli vs Deflate — benchmarks

MetricGzip 6Brotli 6Brotli 11
HTML 100KB~18KB~14KB~12KB
CSS 50KB~10KB~8KB~6.5KB
JS 200KB~55KB~45KB~38KB
Compress time~2ms~3ms~150ms
Support100%97%+97%+

6. Which files to compress

Compress: HTML, CSS, JS, JSON, XML, SVG, plain text, TTF/OTF fonts (70-90% savings).

DON'T compress: JPEG, PNG, WebP, AVIF (already compressed), WOFF2 (uses Brotli internally), MP4/WebM, ZIP/GZ/BR.

Mistake: Compressing already-compressed files can INCREASE size and wastes CPU.

7. Pre-compression vs dynamic

AspectDynamicPre-compression
WhenEvery request, real-timeOnce at build/deploy
CPUPer-request CPU costZero runtime CPU
LevelLow-medium (Gzip 6, Brotli 4-6)Maximum (Gzip 9, Brotli 11)
ForDynamic content (HTML, API)Static files (CSS, JS)

8. Configuration

Nginx: gzip on; gzip_comp_level 6; brotli on; brotli_comp_level 6;

Apache: mod_deflate with AddOutputFilterByType DEFLATE

Express.js: app.use(compression({level: 6}))

FastAPI: app.add_middleware(GZipMiddleware, minimum_size=500)

Vercel/Cloudflare: Automatic Brotli, no configuration needed.

9. Testing compression

  • Chrome DevTools: Network → click request → Headers → look for Content-Encoding: br or gzip
  • curl: curl -I -H "Accept-Encoding: br,gzip" yoursite.com
  • Web Security Scanner — automatically checks compression
  • PageSpeed Insights — shows "Enable text compression" if not active

10. Common mistakes

  • Compression disabled — #1 mistake, many hosts don't enable by default
  • Compressing images — Gzip on JPEG/PNG wastes CPU with no savings
  • Brotli level 11 dynamic — 10-50x slower, use only for pre-compression
  • Missing Vary header — CDN serves wrong format
  • Small files — <256 bytes may get LARGER after compression
  • Double compression — CDN + server both compress = CPU waste
  • WOFF2 compression — WOFF2 already uses Brotli internally

11. References and resources

Check your site's compression →