HTTP/2 è l’evoluzione di HTTP (HyperText Transfer Protocol), il protocollo che ha accompagnato il World Wide Web dal 1991 ad oggi consentendo, in sintesi, lo scambio di informazioni in rete.
ll principale limite del protocollo HTTP risiede nel fatto che gestisce una richiesta per volta. Per ogni richiesta viene aperta e chiusa una connessione con il server e ognuna di queste impegna sia del tempo per le operazioni di servizio (indicato come latenza) sia per per trasferire i dati tra client e server. Tutto questo in presenza di un elevato numero di utenti e pagine sempre più complesse, può portare alla creazione di lunghe code da processare e conseguenti ritardi nel caricamento di una pagina.
HTTP/2 è in grado di ovviare a questo problema attraverso il multiplexing. Immagini, video, font etc. saranno infatti suddivisi in più parti ed inviati al browser in un’unica sessione.
Prevede anche la compressione di tutti gli header in un unico blocco (in precendenza erano suddivisi tra le varie richieste) in modo da diminuire sensibilmente la banda utilizzata.
Inoltre rispetto al formato testuale di HTTP/1.1, che richiede l’esecuzione di procedure d’analisi sintattica, il formato binario si rivela più compatto ed in grado di incrementare la velocità di caricamento delle pagine.
Per concludere con la funzionalità Server Push il server sarà in grado di anticipare le richieste del client, inviando direttamente al browser gli elementi che ritiene debbano essere presenti nella cache del client. Caratteristica grazie alla quale non sarà più necessario attendere l’analisi del codice HTML da parte del browser.
Abilitare HTTP/2 in Nginx
Requisiti
Per abilitare HTTP / 2 in Nginx è necessario soddisfare i seguenti requisiti:
- Nginx versione 1.9.5 o successiva. Puoi controllare la tua versione di Nginx eseguendo il comando (nginx -v).
- OpenSSL versione 1.0.2 o successiva. Puoi controllare la tua versione di OpenSSL eseguendo il comando (versione OpenSSL).
- Certificato SSL / TLS di Let’s Encrypt o un certificato autofirmato.
- Protocollo TLS 1.2 o superiore abilitato. In caso contrario, non sarai in grado di utilizzare HTTP / 2. Le implementazioni di HTTP / 2 devono utilizzare TLS versione 1.2 o successiva per HTTP / 2 su TLS.
Abilitazione
Per abilitare HTTP/2 in Nginx, è necessario inserire il parametro http2
nelle direttive ssl del virtual host:
listen 443 ssl http2;
e riavviare il servizio nginx:
sudo systemctl reload nginx
Questa è una configurazione minima dove è stato abilitato HTTP/2:
server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name example.com; root /path/to/public; ssl_certificate /path/to/certificate.crt; ssl_certificate_key /path/to/private.key; ssl_protocols TLSv1.2; }
Per verificare se HTTP/2 è stato attivato correttamente è necessario tramite gli strumenti di sviluppo del browser verificare che le chimate sono servite con il protocollo correispondente, per esempio in chrome è indicato con la sigla h2.
Abilitare HTTP/2 in Apache 2
Prerequisiti
Per abilitare HTTP/2 in Apache è necessario verificare questi prerequisiti:
- Verificare che hel proprio server sia abilitato HTTPS, è necessario come spiegato prima un protocollo TLS maggiore o uguale alla versione 1.2
- La propria versione di Apache sia uguale o inferiore alla 2.4.17
Disabilitare la modalità mod_php e attivare PHP-FPM
Di default apache è configurato con la modalità mod_php, questa modalità non è compatibile con HTTP/2. Quindi è necessatio disabilitare l’eleaborazione di PHP dal modulo di Apache ed abilitare la modalità e più performante PHP-FPM (Modulo multi processo di php) in Event Mode.
In sintesi PHP-FPM è una modalità più recente di utilizzare PHP con un server web che si basa sempre sull’esecuzione ottimizzata dei processi php che vengono creati solo in fase di inizializzazione e rimangono in attesa di una nuova richiesta. La grossa differenza sta nel fatto che è lo stesso PHP-FPM (FastCGI Process Manager) ad eseguire il processo e non più il web server.
Tutti i processi PHP sono gestiti direttamente dal “Process Manager”. Questo attende e riceve istruzioni dal server web ed esegue gli script PHP richiesti e consente ad un sito web di gestire carichi intensi ed elaborare piu richieste contemporaneamente. Il PHP-FPM mantiene dei “pool” per rispondere alle richieste PHP e i processi che si generano sono direttamente “figli” (CHILD) del Process Manager e possono quindi essere gestiti separatamente dal web server.
Essendo che la configurazione è abbastanza articolata, allego qui una guida per come configurare correttamente php-fpm:
Abilitare il supporto HTTP/2 di Apache
Il supporto HTTP/2 di Apache è fornito dal modulo mod_http2, per abilitarlo eseguire:
In Debian e Ubuntu
a2enmod http2 apachectl restart
CentOs e RHEL
Non dispongono di questo comando, quindi verificare nel file di configurazione httpd che il modulo http2 sia attivato.
Quindi riavviare apache
sudo systemctl restart apache2
Dopo aver attivato il modulo, è necessario attivare questo o nelle direttive globali oppure per singolo virtual host.
Il comando da includere è il seguente:
Protocols h2 http/1.1
Questa è la configurazione minima di un virtual host per far funzionare correttamente http/2:
<VirtualHost *:443> ServerName example.com ServerAlias www.example.com
DocumentRoot /var/www/public_html/example.com SSLEngine on SSLCertificateKeyFile /path/to/private.pem SSLCertificateFile /path/to/cert.pem SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1 Protocols h2 http/1.1
<Proxy "unix:/var/run/php-fpm/example.com.sock|fcgi://localhost">
ProxySet timeout=300
</Proxy>
<FilesMatch \.php$>
SetHandler "proxy:fcgi://localhost"
</FilesMatch>
</VirtualHost>
Per verificare che le richieste vengano servite in http/2 vale lo stesso discorso di NGINX ed è necessario analizzare le richieste tramite lo strumento di sviluppo del browser.
Per verificare costantemente come vengono gestite le pagine, può tornarci utile anche qualche plugin del browser. Ne cito uno che utilizzo io che segnala in modo istantaneo il protocollo utilizato dal browser durante la navigazione.
https://chrome.google.com/webstore/detail/http2-and-spdy-indicator/mpbpobfflnpcgagjijhmgnchggcjblin