onsdag 17 mars 2010

Gzip-komprimering på Amazon S3

Varje dag går världen miste om 99 år på grund av icke-komprimerat innehåll. Genom att gzippa dina html, css och javascript-filer m.m. kan många millisekunder sparas vid varje sidladdning samtidigt som du sparar bandbredd. Nästan alla webbservrar gzippar automatiskt innehåll om klienten berättar att den stöder gzip-kompression. Tyvärr gör inte Amazon S3 detta automatiskt.

Även om inte S3 automatiskt skickar gzippade versioner av dina filer när klienten stöder gzip så kan du självklart lagra gzippade filer på S3. Du kan alltså komprimera t.ex. din css-fil lokalt och sedan ladda upp den till S3. Såhär gzippar du en fil i linux:

gzip -c  plain_text.txt > compressed.txt.gz

Detta löser dock inte problemet helt för alla klienter stöder inte gzip och kommer alltså inte kunna läsa din komprimerade css-fil och därmed inte rendera din sajt korrekt.

Den gyllene medelvägen blir att lagra både en okomprimerad och en komprimerad version på S3 med bara en liten skillnad i namnet, t.ex. style.css och style.gz.css.

Sedan kan man med php eller något annat serverspråk enkelt avgöra om klienten har stöd för gzip och i så fall välja att ladda den gzippade versionen. Här är ett exempel på hur man tar reda på detta i php:

<?php
$gz = (strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip') !== false)? 'gz.' : '';
?>
<link rel="stylesheet" type="text/css" href="http://s.example.com/style.<?=$gz?>css" />

När du laddar upp den gzippade filen till S3 bör den ha "Content-Encoding: gzip" i sin header. Annars kommer inte webbläsarna förstå att innehållet är gzippat utan försöka läsa det som vanlig text.

Pusha minskade vi på detta sätt storleken på vår css med 78% och javascriptet med nästan lika mycket.

Inga kommentarer:

Skicka en kommentar