Zarówno Brotli, GZIP jak i Deflate są modułami do Apache, które są w stanie kompresować transmitowane przez Internet dane.
Mamy do czynienia z danymi dlatego kompresja jest oczywiście bezstratna i w ramach ciekawostki wspomnę, że oba bazują na algorytmie Deflate, który służy też do kompresji grafiki w formacie PNG. Czytaj więcej o optymalizacji grafiki dla potrzeb WWW. Co z tego wynika? A no fakt, że oba moduły kompresują z wręcz identyczną skutecznością. Zakodowane przez mod_deflate i mod_gzip zajmują praktycznie tyle samo miejsca i proces kompresji i dekompresji ma tę samą złożoność.
Brotli kompresuje dane z kilkunastoprocentową większą skutecznością dlatego skupimy się właśnie na nim.
Jak działa kompresja deflate?
Kompresja deflate oparta jest o dwa etapy kompresji. W pierwszym etapie wykorzystuje się metodę LZ77 czyli strumieniową słownikową kompresję danych. Metoda ta wykorzystuje powtarzające się sekwencje w ciągach bajtów. Jeżeli jakieś wyrażenie występuje kilkakrotnie w danym pliku, algorytm tworzy słownik na zasadzie klucz-wartość a potem podmienia wszystkie wystąpienia wartości na o wiele krótszy klucz. Drugi i ostatni etap (jak wiele innych systemów kompresji danych) korzysta z algorytmu Huffmana, który jeszcze kiedyś opiszę a na ten moment załączam link do źródeł.
Serwer kompresuje te dane w niewidoczny sposób podczas transmisji. Przeglądarka odbierająca je – dekompresuje.
Brotli
Brotli to o wiele nowszy algorytm stworzony przez Google. Premiera miała miejsce w październiku 2013. Brotli potrafi kompresować strumienie danych z efektywnością o ok. 17% wyższą od GZIP. Początkowo służył do kompresowania fontów internetowych. Od 2015 roku można go używać do kompresji HTTP.
Instalacja i testowanie Brotli
Brotli powinien być włączony na każdym hostingu. Jeżeli zarządzamy własnym serwerem samodzielne instalacja nie powinna srawdzić nam kłopotu:
apt install brotli
Następnie aktywujemy moduł:
a2enmod brotli
Musimy teraz poinformować serwer, że chcemy korzystać z tej kompresji. Możemy dodać taki wpis do VierualHost bądź pliku .htaccess:
<IfModule mod_brotli.c> AddOutputFilterByType BROTLI_COMPRESS text/html text/plain text/xml text/css text/javascript application/x-javascript application/javascript application/json application/x-font-ttf application/vnd.ms-fontobject image/x-icon </IfModule>
Na koniec – standardowo restartujemy serwer.
Jeżeli chcemy sprawdzić czy kompresja Brotli działa, możemy wejść na narzędzie: https://tools.keycdn.com/brotli-test

Brotli jest kompatybilny z większością popularnych przeglądarek:

Włączenie mod_gzip w .htaccess:
<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>
Włączenie mod_deflate w .htaccess:
<ifModule mod_deflate.c> <filesMatch "\.(js|css)$"> SetOutputFilter DEFLATE </filesMatch> </ifModule>
Instalacja i włączenie modułu GZIP na serwerze
Jeżeli nie posiadamy hostingu wirtualnego, który pozwala skorzystać z GZIP moduł ten należy włączyć samodzielnie (o ile mamy dostęp do systemu operacyjnego w ramach serwera dedykowanego lub VPS).
sudo a2enmod deflate
Zamiast dodawać komendy do .htaccess, można od razu w pliku konfiguracyjnym Apache dodać komendy odpowiedzialne za kompresję np:
AddOutputFilterByType DEFLATE text/html text/plain text/css application/javascript
Instrukcje można dodać też do .htaccess:
<IfModule mod_deflate.c> AddOutputFilterByType DEFLATE application/javascript AddOutputFilterByType DEFLATE application/rss+xml AddOutputFilterByType DEFLATE application/vnd.ms-fontobject AddOutputFilterByType DEFLATE application/x-font AddOutputFilterByType DEFLATE application/x-font-opentype AddOutputFilterByType DEFLATE application/x-font-otf AddOutputFilterByType DEFLATE application/x-font-truetype AddOutputFilterByType DEFLATE application/x-font-ttf AddOutputFilterByType DEFLATE application/x-javascript AddOutputFilterByType DEFLATE application/xhtml+xml AddOutputFilterByType DEFLATE application/xml AddOutputFilterByType DEFLATE font/opentype AddOutputFilterByType DEFLATE font/otf AddOutputFilterByType DEFLATE font/ttf AddOutputFilterByType DEFLATE image/svg+xml AddOutputFilterByType DEFLATE image/x-icon AddOutputFilterByType DEFLATE text/css AddOutputFilterByType DEFLATE text/html AddOutputFilterByType DEFLATE text/javascript AddOutputFilterByType DEFLATE text/plain AddOutputFilterByType DEFLATE text/xml </IfModule>
Testowanie kompresji GZIP/deflate
Poprawne działanie modułu GZIP możemy zweryfikować analizując odpowiedzi serwera, ale można też użyć przyjaznych narzędzi testujących dostępnych online, takich jak: varvy.com/tools/gzip/

Jak widać, mimo tego, że moja strona nie jest skomplikowana, kompresja GZIP pozwoliła zaoszczędzić 70% jej rozmiaru. Proszę teraz pomyśleć, jak znaczne przyspieszenie można uzyskać w przypadku bardziej rozbudowanych serwisów.
Zalety stosowania Brotli, mod_gzip/mod_deflate
- mniejsza objętość transmitowanych danych – może dochodzić do zaoszczędzenia ponad 75% objętości
- wszelkie pochodne szybszego działania stron, sklepów i aplikacji internetowych
- lepsze wyniki we wszelkiego automatycznych analizatorach optymalizacji SEO
Co wybrać i czego nie kompresować?
Moduł Brotli jest „nowszy”, częściej zalecany i możliwy do włączenia dla większości popularnych serwerów HTTP. Jeżeli nie mamy możliwości, możemy wykorzystać deflate dystrybuowany w oryginalnym Apache. Warto wyrobić nawyk stosowania najbardziej efektywnych modułów do kompresji. Instrukcje włączające mod_gzip stosujemy wtedy, jeżeli z jakichś powodów instrukcje dla mod_brotli lub mod_deflate nie działają.
Nie należy kompresować już wcześniej skompresowanych danych, czyli np. .rar, .zip, .jpeg, .jpg i .png. Tutaj nie zaobserwujemy żadnego korzystnego wpływu kompresji, ponieważ skompresowanych danych innym algorytmem nie da się efektywnie „dokompresować” innym. Paradoksalnie może dojść do efektu odwrotnego – dane będą zajmować więcej miejsca po dwóch takich operacjach. Drugim minusem jest niepotrzebne obciążenie serwera, który będzie te dane próbował kompresować.
Źródła:
- https://httpd.apache.org/docs/2.4/mod/mod_deflate.html
- https://pl.wikipedia.org/wiki/Kodowanie_Huffmana
- https://brotli.org/
Odpowiedz lub skomentuj