di: Ermanno Ancona 16 Dicembre 2011
Il problema prospettato dal titolo dell'articolo può essere sintetizzato in: minimizzare il tempo che intercorre tra la richiesta di una pagina da parte del visitatore e l'istante in cui tale pagina viene completamente disegnata dal suo browser. Purtroppo alla semplicità di enunciazione non corrisponde un'altrettanto semplice, immediata ed univoca soluzione.
I fattori che contribuiscono a determinare i tempi di risposta sono molti e variabili, basti pensare alle differenze tra un sito che fornisce solo pagine HTML statiche ed uno che fornisce pagine dinamiche, costruite interrogando un database. Nel secondo caso anche le caratteristiche del linguaggio lato server (PHP, ASP, etc.) e del DBMS (MySQL, SQL Server, etc.) sono elementi determinanti, per i quali saranno necessarie specifiche ottimizzazioni. La jungla si infittisce se introduciamo anche considerazioni sulle risorse hardware e la loro configurazione, sulla larghezza di banda e l'ottimizzazione del suo utilizzo.......solo ad elencarle viene il mal di testa!
Di seguito ci limiteremo, si fa per dire, ad analizzare il problema dal punto di vista della struttura di una pagina HTML. È chiaro che le considerazioni fatte avranno valenza generale, costituendo comunque un passo importante nel processo di ottimizzazione. Per nostra fortuna in rete è disponibile una ricca documentazione sull'argomento, in particolare sotto forma di raccolte di regole, le cosiddette best practices. Esse costituiscono una sorta di vademecum da seguire nello sviluppo web, sintetizzando per punti le azioni da intraprendere. Le più famose sono certamente le Web Performance Best Practices di Google e le Best Practices for Speeding Up Your Web Site di Yahoo.
Lo scopo primario di questo articolo è preparare il terreno per la descrizione di un modulo open source per Apache 2: mod_pagespeed . Poiché tale modulo automatizza il processo di ottimizzazione basandosi sulle best practices di Google, queste ultime costituiranno il nostro principale riferimento. In particolare quelle sezioni che più si caratterizzano come azioni "lato server", anche se la linea di demarcazione non è sempre netta data la stretta collaborazione tra amministratore di sistema e programmatore web in quest'ambito.
Come sappiamo una pagina web moderna è composta, oltre che da codice HTML, da un insieme di altre risorse: immagini, fogli di stile, script, file multimediali ed altro. Ciascuna di esse richiede un certo tempo per il download andando ad incrementare il tempo complessivo di caricamento della pagina. Molti componenti non sono soggetti a modifiche frequenti, per questo i browser possono salvarli localmente nella cosiddetta cache. Dopo la prima visita potranno così utilizzare la copia locale, anziché riprelevare la risorsa dal server. Ciò consente sia di ridurre il peso complessivo della pagina, sia il numero di richieste HTTP inviate al server, fattore molto importante come vedremo meglio più avanti. I principali browser moderni sono dotati di un sistema euristico per decidere quanto tempo mantenere localmente un elemento della pagina prima di considerarlo obsoleto e riscaricarlo.
Per ottenere risultati migliori dobbiamo però configurare il web server perché indichi esplicitamente al browser come comportarsi con una particolare risorsa o tipologie di risorse. La comunicazione può avvenire tramite opportune intestazioni o header HTTP. Essi costituiscono il silenzioso colloquio tra client e server in quanto sono dati effettivamente scambiati, ma non direttamente visualizzati dall'utente. Eccone un esempio, dove risultano evidenziati gli header più rilevanti per le nostre considerazioni:
Vary: Accept-Language,Cookie,Referer Content-Type: text/html; charset=UTF-8 Etag: "ddb0427dab362d9fe748aceb32decdf2" Last-Modified: Sat, 12 Nov 2011 16:42:05 GMT Date: Sat, 12 Nov 2011 16:42:05 GMT Expires: Sat, 12 Nov 2011 17:42:05 GMT Cache-Control: public, max-age=3600 X-Content-Type-Options: nosniff Content-Encoding: gzip Server: codesite_static_content Content-Length: 4870
Il protocollo HTTP/1.1 prevede due tipologie di intestazioni, Expires e Cache-Control, tra loro analoghe. La prima specifica una data assoluta di "scadenza" della risorsa, nell'esempio Sat, 12 Nov 2011 17:42:05 GMT. La seconda, tramite l'opzione max-age=<secondi>, fornisce invece il numero di secondi, a partire dal momento della richiesta, per cui la risorsa potrà considerarsi "fresca". Nell'esempio sono 3600 secondi, ovvero un'ora.
Vediamo come usarle con esempi pratici.
Guida risparmio energetico per serverDalla determinazione dei consumi al risparmio, dalla... |
Guida SubversionSVN è uno dei sistemi per il versioning più utilizzati al mondo.... |
Guida Application serverCosa sono, quali sono e come possono essere utilizzati nella... |
Ogni settimana, in due distinte newsletter: notizie a approfondimenti su Apache e IIS.
Iscriviti alla newsletter
|
|
Amministratore di Reti Windows Server 200811 Giugno 2012 a Milano |
|
Nessun corso previsto |