Brotli ile web sayfası sıkıştırma

Brotli , Google tarafından geliştirilmiş kayıpsız ve açık kaynaklı bir sıkıştırma algoritmasıdır. İlk etapta web fontlarının boyutunu küçültmek için tasarlanan Brotli, günümüzde genel amaçlı bir veri sıkıştırma formatı halini almıştır. Aynı hızda açılan ve daha küçük dosyalar sunan Brotli, gzip ve Deflate ’e alternatif olma niteliği taşır.

Kısaca Brotli’nin Geçmişi


Brotli aslında ilk başlarda WOFF2 web fontlarını sıkıştırmak için geliştirilmiştir. Yine Google tarafından geliştirilmiş, gzip, zlib ve Deflate ile geriye uyumluluk gösteren bir sıkıştırma algoritması olan Zopfli’nin devamıdır. Zopfli ve Brotli daha fazla CPU harcasalar da gzip, zlib ve Deflate’ten çok daha yüksek sıkıştırma oranına sahiptirler. Brotli zamanla geriye uyumluluktan vazgeçerek .br uzatmasıyla kendi dosya formatına geçiş yapmıştır. Brotli’yi diğerlerinden farklı kılan özelliği yalnızca güvenli bağlantılarla kullanılabilmesidir. Bu, şifrelenmemiş HTTP trafiğini durduran ve tarayan aracılar (middlebox) sayesindedir. Bir Brotli dosyası ile karşılaşan bazı aracıların Content-Encoding header (içerik kodlama başlığı) br’den gzip’e dönüştürerek dosyayı geçirmeye çalıştığı görülür. Brotli’yi HTTP ile kısıtlayarak bu müdahaleyi ortadan kaldıran Google, Brotli’nin daha çabuk benimsenmesini sağlamış olmakta.

Karşılaştırma


Deflate ile karşılaştırıldığında Brotli küçümsenmeyecek ölçüde yüksek sıkıştırma oranı imkanı sunuyor. Bunun karşılığında çok daha fazla CPU kullanıyor. 2015’te Google’ın yaptığı bir araştırmaya göre Brotli’nin maksimum sıkıştırma seviyesi, Deflate’in maksimum sıkıştırma seviyesinden %29 oranında daha fazla. Ancak bu seviyede Brotli’nin sıkıştırma ve açma hızı Deflate’inkine kıyasla sırasıyla %97 ve %17 oranında daha düşük (15.5 ve 347.3 MB/s’a karşılık 0.5 ve 289.5 MB/s).

Sıkıştırma hızının önemli derecede düşük olmasından dolayı şirketler Brotli’yi kullanırken dosyaları önceden sıkıştırmayı tercih ediyor. 2017’de Dropbox, Dropbox.com ’daki statik içeriği Brotli’ye taşıyarak değerlerinin boyutunu ortalama %20-25 oranında küçültmeyi başardı. İçerik statik olduğu için Dropbox verileri hazırlık aşamasında önceden sıkıştırarak kullanıcılara doğrudan sunabilmekte.

Brotli Nasıl kullanılır?


En çok kullanılan web sunucularının pek çoğu Brotli’yi doğrudan veya modüllerle destekliyor. Çok sayıda CDN (İçerik Dağıtım Ağı) da Brotli’yi desteklemekte.

Gzip, zlib ve Deflate gibi Brotli’nin de sunduğu farklı sıkıştırma seviyeleri bulunmakta. Yüksek seviyeler genel olarak daha düşük hızla daha yüksek sıkıştırma oranları sunmakta. Level 1 en yavaş, level 11 ise en hızlı olmak üzere sıralanabilir. Hem hız hem de dosya büyüklüğü açısından iyi bir denge sunan Level 5, özellikle dinamik sıkıştırma peşinde olanlara tavsiye edilmekte.

Apache


Apache, 2.4.26 sürümüyle gelen mod_brotli modülü ile Brotli’yi destekliyor. Brotli’yi etkinleştirmek için sanal adresleme yapılandırmanıza şunu girebilirsiniz:

Compress common text-based MIME types

 AddOutputFilterByType BROTLI_COMPRESS text/html text/plain text/xml text/css text/javascript application/javascript

Skip content that's already compressed

 SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)$ no-brotli

Sets the compression level (defaults to 5)

 BrotliCompressionQuality 6

mod_brotli her istekle veri açar. Önceden sıkıştırılmış verileri sunmak için Brotli dosyalarını Apache’nin erişimi olan bir klasöre kopyalayın. Ardından artık gzip karşılıkları yerine bu dosyalarla çalışan sanal adresleme yapılandırmanıza bir rewrite condition ’ı girin.

Serve brotli compressed CSS files if they exist and the client accepts brotli.

 RewriteCond "%{HTTP:Accept-encoding}" "br"
 RewriteCond "%{REQUEST_FILENAME}\.br" "-s"
 RewriteRule "^(.*)\.css" "$1\.css\.br" \.js" "$1\.js\.br" $">

Serve correct encoding type.

Header append Content-Encoding br

 Force proxies to cache brotli &
 non-brotli css/js files separately.

Header append Vary Accept-Encoding

 
Nginx


Nginx, ngx_brotli modülü ile Brotli’yi destekliyor. Modül aslında iki ayrı modülden oluşuyor. Biri on-the-fly (anında) sıkıştırma, diğeriyse önceden sıkıştırma için. Brotli’yi kullanmak için Nginx ve verilen modülü derlemek gerekmekte.

brotli on; # Enables on-the-fly compression.

brotli_static on; # Enables serving pre-compressed files.

brotli_types *; # Enables compression for all MIME types. text/html responses are always compressed.

brotli_comp_level 6; # Sets the compression level (defaults to 6).


Microsoft IIS


Brotli’yi, IIS’de açık kaynaklı “Brotli Compression Scheme Plugin” modülü ile kullanmak mümkün. Kurulum komut dosyası Brotli’nin kurulumunu ve yapılandırmasını tüm ISS siteleri için otomatik olarak gerçekleştirir. Sıkıştırma parametresini applicationHost.config dosyasını açarak ve kısmına giderek yapılandırabilirsiniz.

 
 
 
 
 

...

 
 
 

...

 
 

Bu yazının yazıldığı tarih itibariyle sıkıştırılabilir seçenekler yalnızca statik ve dinamik sıkıştırma levelleridir.

CDN’ler


Key CDN ve Akami gibi çok sayıda CDN Brotli’yi açıkça desteklemekte. Ancak diğer CDN’ler Brotli’yle şifrelenmiş dosyaları açmaz, hatta gzip’e dönüş girişiminde bulunabilir. 2017’de LinkedIn tüm sitede Brotli’yi denediğinde beş CDN’lerinin hepsinin Brotli dosyaları sunulduğunda bile Vary’den Accept-Encoding Header ı gzip’e geri dönüştürdüğü görülmüştür. Ayrıca LinkedIn content server’ları yanıtlarına Content-Encoding: br işlendiği için CDN’lerin kafası karışmış, verileri önbelleğe alamamışlardır.

Bu sorunu çözmek için LinkedIn, Brotli dosyalarını farklı bir URL’ye taşımış, Content-Encoding: br başlığını kaldırmıştır. Dosya CDN tarafından önbelleğe alındıktan sonra müşteriye her yanıtta başlığı yeniden eklenmektedir. Bu, sorunu kökünden çözmese de performansta %2-6.5 oranında bir iyileşme görülmüş, özellikle mobil kullanıcılar olumlu etkilenmiştir.

Tarayıcılar


Brotli; Internet Explorer 11 ve Opera Mini istisnaları dışında çoğu modern tarayıcı tarafından desteklenmektedir. Google 50, Firefox 44., Edge 15., Opera 38., Safari ise 11. sürümünde desteklemeye başlamıştır. Dünya çapında tarayıcıların %84.25’i, ABD’de ise %83.42’si Brotli’yi destekliyor.

Ne var ki, Brotli’yi desteklemeyen tarayıcılar Accept-Encoder header’larında Brotli’yi talep etmeyerek alternatif sıkıştırma algoritmalarına başvuracaklardır.

Sonuç


Brotli veri sıkıştırma ve depolamaya yeni nesil bir anlayış getirdi. Web sitesi boyutlarını %20 oranında küçültme potansiyeliyle Brotli, daha hızlı ve küçük yer kaplayan bir web olanağı sunuyor. Resmi GitHub sayfasında Brotli hakkında daha fazla bilgi edinebilirsiniz.