Sebesség

Tömörítés ellenőrzése és bekapcsolása: gzip és Brotli a gyakorlatban

Így ellenőrzöd curl-lel és böngészőből, hogy él-e a gzip és a Brotli tömörítés, és így kapcsolod be helyesen Apache, Nginx és LiteSpeed alatt.

Scheo · · olvasási idő ~10 perc · Szerző: Schmidt Péter

Röviden: A szöveges fájlok tömörítése néhány sor konfiguráció, de a legtöbb helyen félkészen áll, mert a betűtípusokra és a JSON-válaszokra nincs kiterjesztve. Curl-lel egy perc alatt kiderül, mi jön tömörítve és mi nem.
Kulcs tanulságok
  • Egy GET-kérés a megfelelő Accept-Encoding fejléccel megmutatja, hogy a szerver valóban tömörít-e, a HEAD-kérés félrevezethet.
  • HTML, CSS és JavaScript esetén a 3-5-szörös méretcsökkenés a normális, a 20 százalék alatti nyereség hibára utal.
  • A már tömörített formátumokat (JPEG, WebP, MP4, PDF, WOFF2) hagyd ki, ott a tömörítés csak processzort visz.
  • Ha CDN van előtte, a Vary: Accept-Encoding fejléc nélkül könnyen rossz változat kerül a gyorsítótárba.
  • A magyar tárhelyeken jellemzően él a gzip a HTML-re és a CSS-re, de a JSON-válaszok és a betűtípusok kimaradnak.

Egy átlagos magyar WordPress-oldal HTML-je 60-120 kilobyte, a stíluslapok és a JavaScript együtt könnyen 400-800 kilobyte. Ha ez tömörítés nélkül hagyja el a szervert, akkor nem a képekkel van a legnagyobb baj, hanem azzal, hogy a szöveges fájlok négy-ötszörös méretben utaznak a látogató böngészőjéig. A tömörítés az a ritka technikai beavatkozás, ami néhány sor konfiguráció, nem jár tartalmi engedménnyel, és azonnal mérhető byte-ban.

Tömörítés ellenőrzése és bekapcsolása: gzip és Brotli a gyakorlatban
Tömörítés ellenőrzése és bekapcsolása: gzip és Brotli a gyakorlatban

Hivatalosan igazolt. Két eljárásról beszélünk. A gzip a HTTP korai évei óta velünk van, gyakorlatilag minden böngésző és minden letöltő eszköz érti. A Brotli ennél újabb, a Google fejlesztette, az IETF RFC 7932 írja le, és ugyanazon a szövegen jellemzően 15-20 százalékkal kisebb végeredményt ad, mint a gzip. A böngésző az Accept-Encoding kérés-fejlécben mondja meg, mit tud fogadni, a szerver pedig a Content-Encoding válasz-fejlécben jelzi, mit küldött.

A dolog azért érdemel külön kört, mert az AI-válaszmotorok és a keresőrobotok is ugyanezen a csövön jönnek be. Az AI-crawlerek nagy számban, sorozatban töltenek le oldalakat, és nem minden robot vár türelmesen. A tömörítés nem tesz be téged egy AI-válaszba, de a lassú, nehéz kiszolgálás jó eséllyel kifelé mozdít belőle.

Miért nem elég annyi, hogy „a tárhelyen megy a gzip”?

Mert a tömörítés nem kétállású kapcsoló, hanem egy MIME-típusokból álló lista. A szerver csak azokat a válaszokat tömöríti, amelyek típusa szerepel a listán. Ez a lista majdnem mindig tartalmazza a text/html, text/css és application/javascript értékeket, mert évekkel ezelőtt valaki bemásolt egy mintakonfigurációt. És majdnem sosem tartalmazza azt, ami azóta lett fontos.

Saját tapasztalat. A magyar megosztott tárhelyeken végzett ellenőrzéseim során a HTML és a CSS szinte mindig tömörítve jön, a REST API és az admin-ajax JSON-válaszai viszont gyakran nyersen, ahogy az SVG-k egy része is. Ez nem szerverhiba, hanem egy elavult típuslista maradványa.

Hogyan ellenőrzöd curl-lel, hogy tömörítve jön-e a válasz?

A legrövidebb hiteles teszt egy GET-kérés, amiben te magad küldöd az Accept-Encoding fejlécet, és csak a válasz fejléceit kéred vissza. Így néz ki.

curl -s -o /dev/null -D - -H 'Accept-Encoding: br, gzip' https://pelda.hu/

A kimenetben a content-encoding: br vagy content-encoding: gzip sort keresed. Ha egyik sincs ott, a szerver tömörítés nélkül küldte a HTML-t. Fontos részlet, hogy ne HEAD-kéréssel próbálkozz (tehát ne curl -I-vel), mert több szerver és cache-réteg a HEAD-válasznál másképp viselkedik, mint az igazi letöltésnél. Volt már, hogy a HEAD tisztán mutatta a tömörítést, a valódi GET pedig nem, és fordítva is.

A tömörítési arányt két letöltés összevetésével kapod meg. Az egyik kéri a tömörítést, a másik nem.

curl -s -o /dev/null -w '%{size_download}\n' https://pelda.hu/style.css
curl -s -o /dev/null -w '%{size_download}\n' -H 'Accept-Encoding: br' https://pelda.hu/style.css

A két szám aránya maga a tömörítési arány. Ugyanezt végezd el legalább a következőkön, mert mindegyik más konfigurációs ágon fut.

Ha a szerver a Brotlit nem adja, de a gzipet igen, kérdezz rá külön-külön. A -H 'Accept-Encoding: br' és a -H 'Accept-Encoding: gzip' külön futtatása megmutatja, melyik modul hiányzik valójában.

Mit mutat meg a böngésző fejlesztői eszköze?

A böngésző ugyanezt mutatja, csak egyszerre az összes kérésre, ezért jó második körnek. Nyisd meg a Hálózat (Network) fülön az oldalt kikapcsolt gyorsítótárral, majd kattints rá egy kérésre, és a válasz-fejlécek között keresd a Content-Encoding sort. A Chrome és az Edge esetén a fejlécet oszlopként is felveheted, így egy pillantással átnézheted az egész listát.

A Méret (Size) oszlop két számot ad. A felső az átvitt méret, az alsó a kicsomagolt tartalom mérete. Ha a kettő megegyezik egy szöveges fájlnál, ott nincs tömörítés. A Lighthouse audit is jelzi ugyanezt „Enable text compression” néven, de az csak a nagyobb fájlokat panaszolja fel, a JSON-válaszokat és a kis SVG-ket jellemzően elnézi. Ezért nem elég a Lighthouse zöld pipája.

Mekkora tömörítési arány számít elfogadhatónak?

Saját tapasztalat, mérésekből. A szöveges tartalmaknál a 3-5-szörös csökkenés a szokásos, tehát a 100 kilobyte-os HTML 20-30 kilobyte körül érkezik meg. A minifikált CSS és JavaScript 4-6-szoros aránnyal tömörül, a formázott JSON néha ennél is jobban, mert sok ismétlődő kulcsnevet tartalmaz.

Gyakorlati küszöbként ezt használom. Ha a nyereség 60 százalék fölötti, rendben vagy. Az 50-60 százalék közötti sáv jellemzően alacsony tömörítési szintre vagy gzipre utal Brotli helyett. A 20 százalék alatti nyereség szöveges fájlon szinte mindig hibát jelent, például azt, hogy a fájlt egy plugin már tömörítette, vagy hogy a méretben egy nagy beágyazott base64-blokk dominál, ami nem tömörödik tovább.

A Brotli tömörítési szintje 0 és 11 között állítható. Az előre elkészített, statikus fájlokhoz a 11-es szint való, mert egyszer fut le. A menet közben generált HTML-hez a 4-5-ös szint a praktikus, a magasabb szint ott már több processzoridőt eszik, mint amennyi byte-ot megtakarít.

Hogyan kapcsolod be Apache alatt?

Apache alatt a gzipet a mod_deflate, a Brotlit a mod_brotli adja, utóbbi a 2.4.26-os verzió óta része a csomagnak. Megosztott tárhelyen a .htaccess fájlba írhatod, saját szerveren a virtuális host konfigurációjába érdemes.

  1. Ellenőrizd, hogy a modul betöltődött-e, saját szerveren az apachectl -M | grep -E 'deflate|brotli' paranccsal.
  2. Vedd fel a tömörítendő típusokat a AddOutputFilterByType DEFLATE text/html text/css text/plain text/xml application/javascript application/json application/xml image/svg+xml application/rss+xml sorral.
  3. Brotli esetén ugyanez a lista kell a AddOutputFilterByType BROTLI_COMPRESS direktíva után, és a BrotliCompressionQuality 5 beállítás egy jó kiindulás.
  4. Tedd ki a Header append Vary Accept-Encoding sort, hogy a köztes gyorsítótárak ne keverjék össze a változatokat.
  5. Futtasd újra a curl-tesztet, és nézd meg, hogy a JSON és az SVG is tömörítve jön-e.

Ha a tárhelyed nem engedi a modulok kezelését, a típuslista kiegészítése akkor is működik, mert a modul jellemzően már be van töltve. Ezt a lépést ezért mindig előbb próbáld meg, mint hogy a szolgáltatót keresd.

Mit írj be Nginx alá?

Nginx alatt a gzip a beépített modul dolga, és három beállítás számít igazán. A gzip on; kapcsolja be, a gzip_types adja meg a típuslistát, a gzip_min_length 256; pedig megvédi a nagyon kis válaszokat az értelmetlen tömörítéstől. A gzip_comp_level 5; a szokásos kompromisszum, a 9-es szint alig ad többet, processzorban viszont sokat kér.

Két csapda van. Az egyik, hogy a text/html típust az Nginx mindig tömöríti, ezért azt nem is szabad a gzip_types listába írni, viszont a application/json és a image/svg+xml nem kerül be magától. A másik, hogy proxy mögötti tartalomnál a gzip_proxied any; beállítás nélkül a tömörítés egyszerűen kimarad, és ez a hiba némán történik. A Brotli az Nginxben nem beépített, hozzá az ngx_brotli modult kell befordítani vagy dinamikus modulként betölteni, ezért itt a Brotli mindig tudatos döntés eredménye.

Hogyan áll a dolog LiteSpeed alatt?

A LiteSpeed és az OpenLiteSpeed érti az Apache .htaccess direktíváit, tehát a fenti sorok jó eséllyel változtatás nélkül működnek. A tömörítés maga viszont a szerver saját beállításai között kapcsolódik, a Tuning részen, ahol a tömörítendő típusok listája és a statikus fájlok gyorsítótárazott tömörítése külön kapcsolót kapott.

Saját tapasztalat. LiteSpeed alatt a leggyakoribb hiba nem a szerveren van, hanem a LiteSpeed Cache pluginban. A plugin a gyorsítótárba előre eltett HTML-t saját logikával szolgálja ki, és ha a tömörítés a plugin oldalán ki van kapcsolva, akkor a szerveren beállított tömörítés a gyorsítótárból érkező találatokra nem érvényesül. Ezért LiteSpeed alatt mindig kétszer mérj, egyszer hideg és egyszer meleg gyorsítótárral.

Mely fájltípusokat ne tömörítsd?

Azokat, amelyek belső szerkezete már tömörített. Ott a második kör nem csökkenti a méretet, néhány százalékkal akár növeli is, a processzoridőt pedig felhasználja. A kihagyandó kör a következő.

Az SVG viszont sima XML, tehát tömörítendő, és nagyon jól tömörödik. A WOFF (az első verzió) táblái zlib-bel vannak becsomagolva, ott a plusz gzip lényegében nem hoz semmit. A régi TTF és OTF fájlok ellenben nyersek, azokon a tömörítés komoly nyereség, csak ma már ritkán kellene ilyet kiszolgálni a weben.

Mi történik, ha a CDN és a szerver is tömörít?

Hivatalosan igazolt. A HTTP egy válaszon több Content-Encoding értéket is megenged, a gyakorlatban viszont a böngészők és a CDN-ek ezt nem szeretik. A normális működés az, hogy a CDN az eredeti szerver felé tömörítve kéri a tartalmat, majd a tömörített választ vagy változatlanul továbbadja, vagy kicsomagolja és a látogató által támogatott eljárással újratömöríti. A Cloudflare és a nagyobb szolgáltatók ezt maguktól megteszik.

A baj két helyen keletkezik. Az egyik a gyorsítótárazás. Ha a Vary: Accept-Encoding fejléc lemarad, a CDN egyetlen változatot tesz el, és előfordul, hogy egy Brotlival tömörített választ kap az a kliens, ami csak gzipet ért. A látogató ilyenkor törött oldalt vagy letöltési ajánlatot lát, és a hiba csak bizonyos böngészőkben jelentkezik, ezért nehéz megfogni.

A másik a kétszeres munka. Ha az eredeti szerver már 11-es szintű Brotlit állít elő minden dinamikus válaszra, a CDN pedig kicsomagolja és újratömöríti, akkor kétszer fizeted ki a processzoridőt ugyanazért a byte-számért. Szakmai feltételezés. Ha CDN van előtte, jellemzően jobban jársz azzal, ha az eredeti szerveren a dinamikus tartalomra közepes szintet állítasz, és a végső, erős tömörítést a CDN-re hagyod. Ezt érdemes mérni, mert szolgáltatótól függ.

Miért marad ki a betűtípus és a JSON a magyar tárhelyeken?

Saját tapasztalat. Amit a magyar megosztott tárhelyeken rendszeresen látok, az egy félkész állapot. A gzip él, a HTML és a CSS tömörítve jön, tehát a gyors ellenőrzés zöld. A típuslista viszont egy évekkel ezelőtti mintából származik, amikor a JSON még nem volt a webfejlesztés gerince, és a betűtípusokat mindenki a Google-től szedte.

Ennek két látható következménye van. Az egyik, hogy a REST API és a keresés-javaslatok, a kosárfrissítés, a szűrők, tehát minden JSON-válasz nyersen megy ki. Ezek egyenként kicsik, de egy termékszűrő vagy egy webshop-kosár alatt sokan vannak, és éppen a felhasználó interakciója közben terhelik a hálózatot. A másik, hogy a saját, régi formátumú betűtípusok tömörítés nélkül utaznak, és mivel a betűtípus blokkolja a szöveg megjelenését, ez a késés jól látszik a mért értékekben.

Szakmai feltételezés. Az ok szerintem az, hogy a tömörítés beállítása sosem kerül vissza felülvizsgálatra. Egyszer bekerül a .htaccess-be, utána évekig senki nem nyitja ki, mert nem hibázik, csak kevesebbet ad, mint amennyit adhatna. Aki a szöveges tartalmat gépi olvasóknak is szánja, annak megérdemel egy évenkénti kört.

Milyen ellenőrzőlistával zárd le a munkát?

  1. Curl-lel GET-kéréssel ellenőrizd a Content-Encoding fejlécet a nyitóoldalon és egy aloldalon.
  2. Mérd meg a tömörítési arányt a legnagyobb CSS- és JS-fájlon, és fogadd el, ha 60 százalék felett van.
  3. Nézd meg külön a JSON-végpontot, az SVG-t, a sitemapot és az RSS-t.
  4. Ellenőrizd a saját betűtípusokat, és ha WOFF2-t szolgálsz ki, vedd ki a tömörítendő típusok közül.
  5. Győződj meg arról, hogy a válaszban ott van a Vary: Accept-Encoding fejléc.
  6. CDN mögött mérj hideg és meleg gyorsítótárral is, és kérdezz rá gzipre és Brotlira külön.
  7. Írd fel, mit állítottál, mert hat hónap múlva egy plugin-frissítés után ugyanezt fogod keresni.

A tömörítés nem rangsorolási trükk, és önmagában nem hoz látogatót. Annyit tesz, hogy a meglévő tartalmad kevesebb byte-ból érkezik meg, embernek és gépi olvasónak egyaránt. Ez a fajta munka nem látványos, viszont egyszer kell elvégezni, és utána évekig dolgozik.

Források és további olvasnivalók

Gyakori kérdések

Elég, ha csak a gzipet kapcsolom be, vagy kell a Brotli is?

A gzip a minimum, azt minden kliens érti. A Brotli ugyanazon a szövegen jellemzően 15-20 százalékkal kisebb végeredményt ad, tehát ha a szerver támogatja, érdemes bekapcsolni a gzip mellett. A kettő nem zárja ki egymást, a kliens választ közülük.

Miért mutat a curl -I mást, mint a valódi oldalletöltés?

A curl -I HEAD-kérést küld, amire több szerver és gyorsítótár másképp válaszol, mint egy igazi letöltésre. Használj helyette GET-kérést a curl -s -o /dev/null -D - formában, így azt a választ látod, amit a böngésző is kap.

Nem lassítja-e a szervert, ha mindent tömörítek?

A menet közbeni tömörítés processzoridőt kér, ezért nem érdemes mindenre kiterjeszteni. A már tömörített képeket, videókat, PDF-eket és WOFF2 betűtípusokat hagyd ki, a dinamikus tartalomnál pedig közepes tömörítési szintet állíts, mert a legmagasabb szint alig ad többet.

Hogyan derül ki, hogy a CDN vagy a szerver tömörít?

Kérdezd le közvetlenül az eredeti szervert az IP-jén vagy egy CDN nélküli aldomainen, és utána a nyilvános címet. Ha a két válasz Content-Encoding fejléce eltér, akkor a CDN nyúl bele, és ott kell a beállításokat átnézni.

A tömörítés javítja a helyezésemet a keresőben?

Önmagában nem. A kisebb átvitt méret segítheti a betöltési mérőszámokat, azok pedig részét képezik az oldalélmény-jelzéseknek, de a tömörítés bekapcsolása nem garantál jobb helyezést, és nem pótolja a tartalmi munkát.

Mit tegyek, ha a tárhelyen nem érem el a szerver beállításait?

Először próbáld ki a .htaccess fájlban a tömörítendő MIME-típusok listájának kiegészítését, mert a modul megosztott tárhelyen jellemzően már be van töltve, csak a lista hiányos. Ha ez nem hoz változást, a szolgáltatót kell megkérned a modul engedélyezésére.

Források és további olvasnivalók

Ezen az oldalon a hivatalosan igazolt információt elsődleges forrásokból építjük fel; a saját tapasztalatot és a szakmai becslést mindig külön jelöljük a szövegben.

A cikk szerzője

Schmidt Péter, online marketing szakértő, a Scheo Tanácsadó Kft. alapítója. Székesfehérvárról, országosan dolgozó csapattal végzünk keresőoptimalizálást, AI-láthatóság mérést, Google és Meta hirdetéskezelést, weboldalkészítést. Amit itt leírunk, azt ügyfélmunkában is használjuk. Rólunk bővebben · Szolgáltatásaink

Kapcsolódó olvasnivaló

Kapcsolódó

Amikor az AI-botok megterhelik a szervert: mit tegyél

Kapcsolódó

admin-ajax.php terhelés: hogyan találd meg, melyik bővítmény zabálja a szervert

Kapcsolódó

Az AI-ból érkező látogató más: mit várjon el tőle a céloldalad

Helyi szolgáltatás a környékeden

Országosan dolgozunk, online és személyesen. Válaszd ki a városodat, és nézd meg, hogyan segítünk helyben:

Online marketing & AI SEO SzékesfehérvárOnline marketing & AI SEO BudapestOnline marketing & AI SEO VeszprémOnline marketing & AI SEO DunaújvárosOnline marketing & AI SEO GyőrOnline marketing & AI SEO Debrecen

Weboldalkészítés városra bontva

Ha először a honlap kell, itt városonként arról írtunk:

Weboldalkészítés MiskolcWeboldalkészítés PécsWeboldalkészítés KecskemétWeboldalkészítés NyíregyházaWeboldalkészítés SzombathelyWeboldalkészítés Szolnok

Mind a 20 városunk és az összes szolgáltatás →

15 perces AI-láthatósági gyorselemzés - díjmentesen

Megnézzük három, számodra fontos keresőkérdésnél, hogy megjelenik-e a céged a ChatGPT, a Gemini és a Google AI-válaszaiban, mely versenytársakat ajánlják helyetted, és melyik három területen érdemes először javítani. A weboldaladat előzetesen átnézzük, tehát nem sablonos, automata riportot kapsz.

Adataidat kizárólag a kapcsolatfelvételhez használjuk. Kapcsolat: m@rketinges.hu
💬 Konzultáció