I file SVG sono un modo eccezionale per avere delle immagini vettoriali senza alcuna perdita di qualità. A differenza di altre immagini compresse, come jpg o png, i file SVG sono di fatto dei file di testo (simili all’XML) che vengono interpretati come immagini contenenti forme geometriche, testi, linee. Proprio per questa loro natura, possono essere serviti dal nostro webserver usando l’algoritmo gzip con un guadagno notevole il termini di trasferimento dati (nell’ordine del 70-80%) e quindi di User Experience.

In questa guida vedremo come misurare i benefici della compressione gzip applicata ai file SVG, come abilitarla sul popolare webserver nginx e come verificare che tutto funzioni.

Un piccolo test

Per prima cosa, testiamo localmente quanto possiamo guadagnare in termini di spazio su un file SVG. Proviamo a scaricare un file di dominio pubblico ed a gzipparlo, comparando successivamente i filesize:

$ wget https://upload.wikimedia.org/wikipedia/commons/e/ec/Arctic_big.svg

--2017-10-29 18:22:43--  https://upload.wikimedia.org/wikipedia/commons/e/ec/Arctic_big.svg
Resolving upload.wikimedia.org... 91.198.174.208, 2620:0:862:ed1a::2:b
Connecting to upload.wikimedia.org|91.198.174.208|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: unspecified [image/svg+xml]
Saving to: ‘Arctic_big.svg’

Arctic_big.svg          [            <=>     ]   1.40M   584KB/s    in 2.5s    

2017-10-29 18:22:46 (584 KB/s) - ‘Arctic_big.svg’ saved [1468466]

Abbiamo scaricato il file Artctig_big.svg usando il comando wget.  Come possiamo vedere il file ha un peso di 1468466 byte, cioè 1,46Mb. Proviamo a comprimerlo con gzip:

$ gzip Arctic_big.svg

Verifichiamone il peso:

$ ls -lh  | grep Arctic
-rw-r--r--@ 1 lucamurante  staff   423K  7 Ott  2013 Arctic_big.svg.gz

Il file SVG è passato da 1,46Mb a 423Kb: il nuovo file è grande il 29% dell’originale!

Configuriamo nginx

Applichiamo tutto questo ad nginx per assicurarci che tutti i file SVG vengano serviti compressi con gzip.

Per prima cosa assicuriamoci che SVG sia tra i mime types, andando a guardare nel file relativo:

$ sudo nano /etc/nginx/mime.types

Troviamo questa riga e, nel caso non ci fosse, aggiungiamola:

image/svg+xml svg svgz;

A questo punto apriamo il file di configurazione:

$ sudo nano /etc/nginx/nginx.conf

Cerchiamo la voce gzip types e aggiungiamo image/svg+xml alla fine, come in questo esempio:

 ##
    # Gzip Settings
    ##
    gzip on;
    gzip_disable "msie6";

    gzip_vary on;
    gzip_proxied expired no-cache no-store private auth;
    #compression level
    gzip_comp_level 6;
    gzip_min_length 1000;
    gzip_buffers 16 8k;
    gzip_http_version 1.1;
    # files to gzip
    gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript image/svg+xml;

Salviamo e riavviamo nginx:

$ sudo service nginx reload

Testiamo il funzionamento

Per testarne il funzionamento, possiamo usare un tool come questo. La pagina ci darà un esito come questo: