Domů > Server, Tipy a triky > GZip komprese – budoucnost internetu?

GZip komprese – budoucnost internetu?

GZipKomprese je jednoduchá a efektivní technika, která šetří velikost přenášených dat a ve finále zrychlí načítání webových stránek. Používá se především ke zmenšení JS a CSS souborů, které mohou být kompresí zeštíhleny až o 80%. Bohužel, ne všechny prohlížeče si dokáží s tímto formátem poradit, nicméně i tak se pozitivně dotkne valné vetšiny uživatelů.

Pokud se zabýváte správou webů, tak jste se určitě setkali v Google Webmaster Tools s několika doporučeními, které se týkaly zrychlení webu – mj. i komprimace. Ta se týká především velké trojky (HTML, CSS a JS), ostatní soubory jako jsou obrázky, muzika, videa, dokumenty (souhrně multimediální soubory) a další jsou už většinou komprimované a další komprese zbytečně žere výpočetní výkon. Princip je takový, že se na serveru vygeneruje nebo podstrčí komprimovaný gz soubor, který se rychleji stáhne a následně se dekomprimuje na straně uživatele.

Google před nějakým časem začal používat rychlost načítání webu jako jeden z faktorů ovlivňující pořadí webu ve výsledcích vyhledávání, málo webmasterů ovšem ví, jak si kompresi „zapnout“. Existuje několik možností, zmíním tři hlavní.

Pomocí Apache modulu mod_deflate v souboru .htaccess

Potřebujeme mít nainstalovaný a povolený apache modul mod_deflate a mod_headers.  Komprese probíhá automaticky, ale o to víc vytěžuje procesor serveru. Pokud se vaše stránky nalézají na webhostingu, tak tuto variantu máte téměř jistě nedostupnou.

<ifModule mod_deflate.c>
  SetOutputFilter DEFLATE
  BrowserMatch ^Mozilla/4 gzip-only-text/html
  BrowserMatch ^Mozilla/4\.0[678] no-gzip
  BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
  SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png|gif)$ no-gzip dont-vary
  Header append Vary User-Agent env=!dont-vary
</ifModule>

Všiměte si, že jsou vynechávány obrázkové soubory. Pokud chcete být důkladní, tak můžete připsat i koncovky dalších multimediálních formátů, které by jen zpomalovaly server.

Pomocí Apache modulu mod_gzip v souboru .htaccess

Potřebujeme mít nainstalovaný a povolený apache modul mod_gzip. Taktéž jako u modulu mod_deflate se komprimace provádí automaticky a taktéž značně vytěžuje CPU. U webhostingu bývá vyplý – je to alternativa k první variantě.

<ifModule mod_gzip.c>
  mod_gzip_on Yes
  mod_gzip_dechunk Yes
  mod_gzip_item_include file \.(html?|txt|css|js|php|pl)$
  mod_gzip_item_include handler ^cgi-script$
  mod_gzip_item_include mime ^text/.*
  mod_gzip_item_include mime ^application/x-javascript.*
  mod_gzip_item_exclude mime ^image/.*
  mod_gzip_item_exclude rspheader ^Content-Encoding:.*gzip.*
</ifModule>

Můžete také například použít šikovný PHP skriptík od Juliena Lecomte, který se ovládá GET parametrem uri a dokáže nahradit chybějící moduly.

Pomocí předgzipovaných souborů a Apache modulu mod_rewrite

Tuto variantu doporučuji. Vpodstatě jde o klasické podstrkávání komprimovaného souboru umístěného ve stejném adresáři, pokud se naplní podmínka. Bohužel v prohlížeči Safari gzip komprese stále zlobí, tak využije spolu se starými browsery non-gzip variantu souboru. Důležité je také vracet hlavičku původního souboru, aby mohl být soubor správně rozbalen. Tato varianta by měla fungovat téměř všude.

AddType "text/javascript" .gz
AddEncoding gzip .gz
# prepis .js soubory na .js.gz pokud existuji, krome prohlizece Safari
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} \.js$
RewriteCond %{HTTP:Accept-Encoding} gzip
RewriteCond %{HTTP_USER_AGENT} !Safari
RewriteCond %{REQUEST_FILENAME} !^.+\.gz$
RewriteCond %{REQUEST_FILENAME}.gz -f
RewriteRule ^(.*)$ /$1.gz [T=text/javascript,QSA,L]

Varianta se vyplatí především u neměnných robusních javascriptových knihoven jako je jQuery, MooTools nebo Cufon. Ušetřit 70kB při načítání stránky je opravdu znát. Pro jiný typ souboru použijte jinou příponu a příslušný MIME type.

Závěrem

Pokud se budete pouštět do komprimace, tak pamatujte, že značně vytěžuje CPU. Doporučuji proto používat třetí variantu současně s kešováním obsahu. Nevýhodou je, že se při každé změně obsahu musí znovu vytvořit gz varianta souboru.